0

我创建了一组按钮:

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)新按钮而不是替换已经显示的按钮。我如何让它替换旧按钮而不是添加新按钮。

4

5 回答 5

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();

注意:当您点击刷新时,您不需要替换旧按钮,只需从面板中提取并在上面设置图标,就像我在上面的代码中所做的那样。

于 2013-05-19T08:36:24.757 回答
1

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

于 2013-05-19T08:36:25.647 回答
0

该行:

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

只需将新按钮添加到面板。如果你调用它两次,你会添加两倍的按钮。在添加新的之前,您必须删除旧的。

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

于 2013-05-19T08:35:50.780 回答
0

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

于 2013-05-19T08:36:30.290 回答
0

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

if(!(bt[i][j] instancceof JButton)) {
    bt[i][i] = new JButton();
}
于 2013-05-19T08:37:18.160 回答