在Java中为JButton着色
我正在努力解决一个为JButton数组着色的问题 我制作了两个JButton数组:在Java中为JButton着色,java,swing,jbutton,colorize,Java,Swing,Jbutton,Colorize,我正在努力解决一个为JButton数组着色的问题 我制作了两个JButton数组: public JButton Speler1[] = new JButton[140]; //Player1 public JButton Speler2[] = new JButton[140]; //Player2 这两组按钮组成了赛车游戏的第1道和第2道。我希望玩家1和2的位置在两个屏幕上都是彩色的。所以玩家1可以看到玩家2在哪里,反之亦然 我已经制定了一个方法,将两名球员的位置发送给对方 if (mes
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)时,我想更改通道2上的一个按钮
class kleurHokje{
public void hokVerkleur(int loc){
Speler2[loc].setBackground(Color.yellow);
Speler2[positie2].setBackground(Color.gray);
}
}
它就是不起作用。虽然我对Speler1[positie]做的几乎相同,但Speler1不使用网络,这是我想要的
感谢您的帮助
谢谢你,杰夫
编辑:
如果我把我的代码放在一个鼠标侦听器中,它工作得很好,但是它需要自动上色,而不是每次都要点击
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:
同意,如果您从Background任务更改JButton的颜色,那么有任何更改,您有一些问题,您对GUI的更新超出了EDT
1) 然后您必须将着色JButtons包装到invokeLater()中
2) 但是您必须使用常规的Swing方法来解决这个问题
2a)将GUI相关代码包装到
2b)从初始化背景任务
Runnble#Tread
public void actionThread() {
Thread t = new Thread() {
public void run() {
while (!stop) {
tegenspelerPositie();
Score();
eigenOgen();
try {
sleep(100);
} catch (InterruptedException ex) {
}
}
}
};
t.start();
}
你确认霍克沃克勒尔确实被打电话了吗?如果它没有被调用,那么代码试图做什么其实并不重要。使用调试器或
System.out.println(“Debug”)
语句调试您的程序,并找出工作原理。在您向我们提供这些信息之前,您还没有投入足够的精力来帮助我们(请参阅:)。当我使用System.out.println(“位置”+loc)时
在hokVerkleur中,它会打印出应该更改的位置。更改颜色后,应立即在按钮上尝试.repaint()。Swing的不一致之处在于,更改某些组件属性会自动重新绘制组件,但更改其他属性则不会。另外,请参阅的文档:它说,不能保证绘制背景。这取决于JComponent的子类是否决定这样做。我不知道JButton是否忽略setBackground(不在API中)。使用.repaint()
不起作用。现在吃晚饭,吃完后我会看一下文档。谢谢你的回答@我很乐意给你我的<代码>1)我投票认为这是离题,2)
不是你的否决票,否决票是给神的,3)
你的问题比本机操作系统相关的问题更重要,4)
在那里我看不到关于PL的真正问题5)
问题与之相关或6)
也许你的问题会被转移到另一个论坛(而不是关闭)并成为一个可运行的线程<代码>public void actionThread(){Thread t=new Thread(){public void run(){while(!stop){tegenspelerPositie();Score();eigenOgen();try{sleep(100);}catch(InterruptedException ex){};t.start();}现在可以作为一个符咒使用了。别担心,我知道这是有效的,但只对当前的一个线程有效,如果有两个或更多线程,那么这会导致冻结,将其包装到invokeLater():-)再次抱歉,我应该将invokeLater
放在哪里?将GUI相关代码包装到invokeLater(),即通知EDT GUI的更改
public void actionThread() {
Thread t = new Thread() {
public void run() {
while (!stop) {
tegenspelerPositie();
Score();
eigenOgen();
try {
sleep(100);
} catch (InterruptedException ex) {
}
}
}
};
t.start();
}