3

我尝试在 JList 中添加 JButtons,使其类似于棋盘游戏。

这是我的代码:

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 次,我会得到:

在此处输入图像描述

所以我的问题是如何填写上面的板?

4

2 回答 2

4

发生这种情况的原因是因为您将所有按钮添加到 JList,这并不是您真正打算使用 JList 的方式(通常您修改支持列表的模型以便从列表中添加/删除项目)。该列表在内部做一些占用第一个插槽的事情。

如果您更改此行:

JList list = new JList();

到:

JPanel list = new JPanel();

您的布局将起作用(您还必须删除该setDragEnabled行,并将 99 更改为 100)。我不确定您是否需要 JList 的某些功能,但这就是您的布局无法正常工作的原因。

于 2013-03-28T23:54:02.110 回答
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); 
    }

还有一个使用这个的例子:如何创建自定义 JList

编辑:其他一些有用的参考资料: 拖放 在 JList 中拖放

于 2013-03-29T00:15:33.413 回答