用新的JButton替换旧JButton

时间:2013-05-19 08:27:47

标签: java swing jbutton

我创建了一系列按钮:

JButton bt[][]=new JButton[8][8];

然后我按以下方式调用一个名为refreshBoard的函数

public void refreshBoard() {
    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            bt[i][j] = new JButton(); 
            bt[i][j].setIcon(new javax.swing.ImageIcon("icons/"+ board[i][j] +".png"));
                panel.add(bt[i][j);   
        }
    }  

board[i][j]中的值控制按钮上显示的图像。我每隔一段时间调用一次这个refreshBoard函数。问题是,当我第二次调用该函数时,它会添加64(8X8)个新按钮而不是替换已经显示的按钮。如何让它替换旧按钮而不是添加新按钮。

5 个答案:

答案 0 :(得分:2)

此行bt[i][j] = new JButton()会在您点击refreshBoard()板时创建新按钮。这不对。

这样做:

制作panel instance variable,以便所有instance methods都可以访问它。

添加主板:

public void addBoard() {
    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            bt[i][j] = new JButton(); 
            bt[i][j].setIcon(new javax.swing.ImageIcon("icons/"+ board[i][j] +".png"));
                panel.add(bt[i][j);   
        }
    }  

刷新董事会:

要刷新电路板,您必须从buttons中提取JPanel,然后再使用它们:

JButton button = null;
Component[] components = panel.getComponents();

public void refreshBoard() {
    for (int i = 0; i < components.length; i++) {

        if (components[i] instanceof JButton) {
            button = (JButton) components[i];
            button.setIcon(<set the icon however you want. extracting from the `board[][]` or by creating new ones>));
        }

    }
} 

您还可以检查以了解您正在提取的JButton

String buttonText = button.getText();

注意:点击“刷新”时无需更换旧按钮,只需从面板中提取并按照上面的代码设置图标就可以了。

答案 1 :(得分:1)

您需要删除面板上的布局,然后使用我想要使用的新按钮重新创建布局。可能有一种方法从布局中删除项目,但我发现当我想做这样的事情时,更容易重新重做布局。保持相同的64个按钮可能更简单,但可以将它们存储在数组或数组列表中,并更新您在刷新板中的这些按钮上设置的图标。从设计的角度来看,如果64个按钮是固定元素并且图标正在改变,那么你只会更改图标。

答案 2 :(得分:0)

该行:

        panel.add(bt[i][j); 

只需将新按钮添加到面板即可。如果你打两次电话,你会增加两倍的按钮。在添加新的之前,您必须删除旧的。

但是,为什么每次刷新时都必须创建所有64个JButton?它创建了许多不需要的Java对象。您是否可以简单地将图标设置为现有按钮,而无需在每次刷新时重新创建新按钮?

答案 3 :(得分:0)

我不确定,但也许你应该调用panel.repaint()?

答案 4 :(得分:0)

通过循环显式删除它们(使用空检查)。或者,在嵌套的for循环中,将第一行替换为以下内容。

if(!(bt[i][j] instancceof JButton)) {
    bt[i][i] = new JButton();
}