我尝试在JList中添加JButton就像一个棋盘游戏。
这是我的代码:
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次,我会得到:
如果我重复99次,我会得到这个:
所以我的问题是如何填写上面的板?
答案 0 :(得分:4)
之所以发生这种情况,是因为你要将所有按钮添加到JList中,这实际上不是你想要使用JList的方式(通常你修改 model 支持列表为了添加/删除列表中的项目)。该列表在内部执行占用第一个插槽的内容。
如果您更改此行:
JList list = new JList();
为:
JPanel list = new JPanel();
您的布局将有效(您还必须删除setDragEnabled
行,并将99更改为100)。是否有一些你想要的JList功能我不确定,但这就是你的布局无法正常工作的原因。
答案 1 :(得分: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