2013-04-07 104 views
1

我正在製作一個戰列艦遊戲,我試圖找出一種方法來控制窗格中的按鈕,這樣我就可以拖放它們並使用默認列表模型跟蹤它們的索引。如果我添加字符串或ImageIcons,它會工作正常,但與按鈕我得到了不同的東西。如何在DefaultListModel中添加JButtons?

這裏是我的代碼:

public class ListModelExample extends JPanel { 

    JList list; 
    DefaultListModel model; 
    int counter = 15; 

    public ListModelExample() { 
    setLayout(new BorderLayout()); 
    model = new DefaultListModel(); 
    list = new JList(model); 
    JScrollPane pane = new JScrollPane(list); 
    JButton addButton = new JButton("Add Element"); 
    JButton removeButton = new JButton("Remove Element"); 
    final JButton button = new JButton("button"); 

    for (int i = 0; i < 5; i++) 
     model.addElement(button); 

    addButton.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
     model.addElement(button); 
     counter++;  

     } 
    }); 
    removeButton.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
     if (model.getSize() > 0) 
      model.removeElementAt(0); 
     } 
    }); 

    add(pane, BorderLayout.NORTH); 
    add(addButton, BorderLayout.WEST); 
    add(removeButton, BorderLayout.EAST); 
    } 

    public static void main(String s[]) { 
    JFrame frame = new JFrame("List Model Example"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setContentPane(new ListModelExample()); 
    frame.setSize(260, 200); 
    frame.setVisible(true); 

    } 
} 

如果我添加按鈕我得到這樣的結果:

Result of adding buttons in the pane

所以我的問題是:怎麼可能使按鈕會出現在正常和不作爲默認列表模型中的文本?

+0

你爲什麼要添加按鈕列出? – Elior 2013-04-07 13:55:31

+1

你可以使用「setName(String n)」方法.. 添加一個靜態計數器..併爲每個按鈕將其轉換爲字符串並設置它的按鈕名稱..然後檢查按鈕名稱他的位置和所有東西你想.. – Elior 2013-04-07 14:01:22

+0

組件應該永遠不會被放置在Swing組件模型中。 1+給mKorbel的回答。 – 2013-04-07 14:12:02

回答

3
  • 這隻能通過Renderer完成,只放String價值的DefaultListModel

  • 不要把任何JComponentsXxxModel

  • 我會使用JPanelJButtons而不是JList作爲容器(需要更改getScrollableBlockIncrement/getScrollableUnitIncrement自然滾動與JListJTable

例如約兩個上午的方式

import java.awt.*; 
import java.awt.event.AdjustmentEvent; 
import java.awt.event.AdjustmentListener; 
import javax.swing.*; 

public class ListButtons extends JFrame { 

    private static final long serialVersionUID = 1L; 

    public ListButtons() { 
     setLayout(new GridLayout(0, 2, 10, 10)); 
     DefaultListModel model = new DefaultListModel(); 
     model.addElement(createButtons("one")); 
     model.addElement(createButtons("two")); 
     model.addElement(createButtons("three")); 
     model.addElement(createButtons("four")); 
     model.addElement(createButtons("five")); 
     model.addElement(createButtons("six")); 
     model.addElement(createButtons("seven")); 
     model.addElement(createButtons("eight")); 
     model.addElement(createButtons("nine")); 
     model.addElement(createButtons("ten")); 
     model.addElement(createButtons("eleven")); 
     model.addElement(createButtons("twelwe")); 
     JList list = new JList(model); 
     list.setCellRenderer(new PanelRenderer()); 
     JScrollPane scroll1 = new JScrollPane(list); 
     final JScrollBar scrollBar = scroll1.getVerticalScrollBar(); 
     scrollBar.addAdjustmentListener(new AdjustmentListener() { 

      @Override 
      public void adjustmentValueChanged(AdjustmentEvent e) { 
       System.out.println("JScrollBar's current value = " + scrollBar.getValue()); 
      } 
     }); 
     add(scroll1); 
     JScrollPane scroll2 = new JScrollPane(createPanel()); 
     add(scroll2);   
     final JScrollBar scrollBar1 = scroll2.getVerticalScrollBar(); 
     scrollBar1.addAdjustmentListener(new AdjustmentListener() { 

      @Override 
      public void adjustmentValueChanged(AdjustmentEvent e) { 
       System.out.println("JScrollBar's current value = " + scrollBar1.getValue()); 
      } 
     }); 

    } 

    public static JPanel createPanel() { 
     JPanel panel = new JPanel(); 
     panel.setLayout(new GridLayout(0, 1, 1, 1)); 
     panel.add(createButtons("one")); 
     panel.add(createButtons("two")); 
     panel.add(createButtons("three")); 
     panel.add(createButtons("four")); 
     panel.add(createButtons("five")); 
     panel.add(createButtons("six")); 
     panel.add(createButtons("seven")); 
     panel.add(createButtons("eight")); 
     panel.add(createButtons("nine")); 
     panel.add(createButtons("ten")); 
     panel.add(createButtons("eleven")); 
     panel.add(createButtons("twelwe")); 
     return panel; 
    } 

    public static JButton createButtons(String text) { 
     JButton button = new JButton(text); 
     return button; 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      public void run() { 
       ListButtons frame = new ListButtons(); 
       frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
       //frame.pack(); 
       frame.setSize(270, 200); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    class PanelRenderer implements ListCellRenderer { 

     public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
      JButton renderer = (JButton) value; 
      renderer.setBackground(isSelected ? Color.red : list.getBackground()); 
      return renderer; 
     } 
    } 
}