我创建了一系列按钮:
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)
个新按钮而不是替换已经显示的按钮。如何让它替换旧按钮而不是添加新按钮。
答案 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();
}