在Java中为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

我正在努力解决一个为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)时,我想更改通道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();
}