2013-03-28 70 views
3

我嘗試在JList中添加JButtons以便像棋盤遊戲一樣。我不能將JButtons按特定順序添加到JList中

這裏是我的代碼:

public class Board { 

public Board() { 
    JList list = new JList(); 
    list.setLayout(new GridLayout(10, 10)); 
    list.setDragEnabled(true); 

    Container container = new Container(); 
    JFrame frame = new JFrame(); 
    JPanel panel1 = new JPanel(); 
    JPanel panel2 = new JPanel(); 
    frame.add(container); 
    container.add(panel1); 

    for (int j = 0; j < 99; j++) { 
     list.add(createButton()); 
    } 

    panel2.add(list); 
    container.add(panel2); 
    panel2.setLayout(new GridLayout()); 
    panel1.setBounds(50, 150, 150, 150); 
    panel1.setBackground(Color.YELLOW); 
    panel2.setBounds(650, 150, 500, 500); 
    panel2.setBackground(Color.RED); 

    frame.setSize(1366, 768); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
} 

public JButton createButton() { 
    JButton button = new JButton(); 
    button.setBackground(Color.BLUE); 
    return button; 
} 
} 

如果我把100次我得到這個:enter image description here

如果我把99次重複我得到這個:

enter image description here

所以我問題是我怎樣才能填補上面的董事會?

+1

此[示例](http://stackoverflow.com/questions/4674268/how-do-i- make-my-custom-swing-component-visible/4674686#4674686)顯示使用面板和標籤在網格周圍顯示圖標的一種方法。 – camickr

回答

4

它的發生的原因是因爲你將所有的按鈕,一個JList,這是不是真的,你是如何打算使用一個JList(一般修改模型支持列表,以添加/刪除列表中的項目)。該列表在內部正在做一些事情,佔據第一個位置。

如果改變這一行:

JList list = new JList(); 

到:

JPanel list = new JPanel(); 

你的佈局就可以了(你必須刪除setDragEnabled線爲好,並改變99至100)。是否存在JList的某些功能,我不確定,但這就是爲什麼您的佈局無法正常工作。

+0

我使用了JList,因爲我需要稍後進行拖放操作。其實我正在創建一個戰艦遊戲,我不能使用JPanel,根據http://docs.oracle.com/javase/tutorial/uiswing/dnd/defaultsupport.html –

+0

我總是發現設置dnd爲是痛苦的,但我不知道,使用JList似乎是錯誤的方法。 – Ash

+0

我也這麼認爲,我花了很多時間嘗試從JList中創建出一些東西。我會看看我是否可以通過JPanel獲得一些東西。感謝您的回答! –

2

您應該創建的JList:

DefaultListModel dataModel = new DefaultListModel(); 
JList list = new JList(dataModel); 
list.setLayoutOrientation(JList.HORIZONTAL_WRAP); 

設置一個ListCellRenderer如下:

final JButton button = createButton(); 
    list.setCellRenderer(new ListCellRenderer() { 
      @Override 
      public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
        return button; 
      } 
    }); 

添加您的項目如下: //無所謂,你加入,你有什麼價值將決定渲染項目時需要哪些信息

for (int j = 0; j < 99; j++) { 
     dataModel.add(j, j); 
    } 

和示例使用此:How To Create custom JList

編輯:其他一些有用的參考文獻: Drag and drop Drag and drop inside JList