我正在努力解决为 JButton 数组着色的问题。
我制作了两个 JButton 数组:
public JButton Speler1[] = new JButton[140]; //Player1
public JButton Speler2[] = new JButton[140]; //Player2
这两个按钮阵列构成了赛车游戏的车道 1 和车道 2。我希望玩家 1 和 2 的位置在两个屏幕上都显示为彩色。因此玩家 1 可以看到玩家 2 在哪里,反之亦然。
我已经制作了一种将两个玩家的位置发送给对方的方法。
if (message.contains("Positie")) {
String posit = message.replaceFirst("Positie", "");
int positi = Integer.valueOf(posit);
positie2 = positi;
kleurHokje kleur = new kleurHokje();
kleur.hokVerkleur(positi); // positi is the position of each player
}
因此,当我调用方法 hokVerkleur(positi) 时,我想更改 channel 2 上的按钮。
class kleurHokje{
public void hokVerkleur(int loc){
Speler2[loc].setBackground(Color.yellow);
Speler2[positie2].setBackground(Color.gray);
}
}
这根本行不通。虽然我对 Speler1[positie] 做了几乎相同的事情,但 Speler1 不使用网络,它按我想要的方式工作。
感谢任何帮助,
谢谢杰夫
编辑: 如果我将代码放在其中一个 MouseListener 中,它可以正常工作,但可以让它自动着色,而不必每次都单击。
class Klaar extends MouseAdapter {
public void mouseClicked(MouseEvent e) {
Speler2[positie2].setBackground(Color.gray);
}
}
诗。我的母语不是英语,我希望你理解我的问题。
最佳答案
If I place my code in one of the MouseListeners it works fine:
同意,如果您从 BackGroung Task 更改 JButton 的颜色,那么会有任何更改,您会遇到 Concurency in Swing 的一些问题,您对 GUI 的更新已超出 EDT,
1) 然后你必须将着色 JButtons 包装到 invokeLater() 中;
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
Speler2[loc].setBackground(Color.yellow);
Speler2[positie2].setBackground(Color.gray);
}
});
2) 但你必须使用常规的 Swing 方法来解决
2a) 将 GUI 相关代码包装到 javax.swing.Action
2b) 从
初始化您的 BackGroung 任务- SwingWorker
Runnble#Tread
关于java - 在 Java 中为 JButton 着色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7664935/