Java 执行操作后如何移动按钮?

Java 执行操作后如何移动按钮?,java,swing,layout-manager,grid-layout,Java,Swing,Layout Manager,Grid Layout,我正在用GridLayout做一个程序。在执行操作后,我尝试将按钮移动到另一个位置时出现问题。基本上,我在面板上有一个按钮大小的空白区域。我想把点击的按钮移到这个空白处,反过来,这个空白处会取代这个按钮。我正在使用一个数组来获得一个看起来像框架的模型。所以我知道空空间在我的数组中的位置(在JButton数组中是一个空值),我试图让这个按钮在数组中取空空间的位置,并反过来。但它并没有真正起作用 任何帮助都将不胜感激 private void setGame(int nbLines, int nbR

我正在用GridLayout做一个程序。在执行操作后,我尝试将按钮移动到另一个位置时出现问题。基本上,我在面板上有一个按钮大小的空白区域。我想把点击的按钮移到这个空白处,反过来,这个空白处会取代这个按钮。我正在使用一个数组来获得一个看起来像框架的模型。所以我知道空空间在我的数组中的位置(在JButton数组中是一个空值),我试图让这个按钮在数组中取空空间的位置,并反过来。但它并没有真正起作用

任何帮助都将不胜感激

private void setGame(int nbLines, int nbRows, int emptyX, int emptyY) {
    pane.removeAll();
    for (int i = 0; i < model.length; i++) {
        for (int j = 0; j < model[i].length; j++) {
            if (!(j == emptyY && emptyX == i)) {
                button = new JButton("A");
                model[i][j] = button;
                pane.add(model[i][j]);
                model[i][j].addActionListener(this);
            }
        }
    }
    frame.add(pane);
    frame.setVisible(true);
}

public void actionPerformed(ActionEvent e) {
    for (int i = 0; i < model.length; i++) {
        for (int j = 0; j < model[i].length; j++) {
            if (e.getSource() == model[i][j]) {
                System.out.println("Cordonnées de i : " + i + "Cordonnées de j : " + j);
                model[i][j] = null;

                setGame(nbLignes, nbCol, i, j);
            }
        }
    }
}
private void setGame(int-nbline,int-nbRows,int-emptyX,int-emptyY){
pane.removeAll();
对于(int i=0;i
基本上,我在面板上有一个按钮大小的空白区域

你不能有空的空间。您需要向面板添加一个实际组件,以填充GridLayout中的空间

因此,我建议您可以采取以下措施:

  • 将所有按钮添加到GridLayout
  • 生成一个随机数以确定哪个单元格应为空。将此值另存为“空单元格”。然后使用
    容器。remove(…)
    删除该单元格上的按钮。然后使用
    Container.add(component,index)
    方法添加一个没有文本的JLabel来填充空单元格
  • 然后,单击按钮时,使用
    Container.getcompent(…)
    方法遍历面板中的所有组件,直到找到所单击按钮的索引
  • 现在有两个索引,空单元格和单击的单元格。然后使用remove(…)和add(…)方法交换这两个组件
  • 交换完成后,您将“空索引”更新为“单击索引”的值

  • 从概念上讲,类似的东西工作得非常好!谢谢你的帮助。我不知道为什么我没有考虑使用JLabel。对于那些对解决方案感兴趣的人。基本上只需使用JLabel。并交换JLabel(空单元格)和clikhed按钮的行和列索引。(使用执行中的交换)它可以工作。对于那些对解决方案感兴趣的人。基本上只需使用JLabel。并交换JLabel(空单元格)和clikhed按钮的行和列索引。(使用执行中的掉期)