我创建了一个按钮数组:

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

最佳答案

每当您按下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();


注意:按下“刷新”时,您无需替换旧按钮,只需从面板中提取按钮,然后像上面代码中所做的那样在其上设置图标即可。

10-05 18:20