Java 按钮颜色不变

Java 按钮颜色不变,java,swing,colors,jbutton,Java,Swing,Colors,Jbutton,我正在尝试创建一个非常基本的java GUI程序来解决Boggle board问题。 它使用递归DFS。我希望按钮的背景色(我使用按钮只是因为它们已经是正方形)在字母“标记”时从黄色变为红色,在“未标记”时变为黄色。 如果我注释掉最后一行使其重新充电为黄色,以及使用Thread.sleep()延迟程序的方法,它会按预期工作,将它们全部保留为红色,但是如果我仅取消注释delay方法,它不会实时更新,并且当程序运行完后,所有背景都会变为红色。 如果我取消注释将其变回黄色的行,它将一直保持黄色 我不知

我正在尝试创建一个非常基本的java GUI程序来解决Boggle board问题。
它使用递归DFS。我希望按钮的背景色(我使用按钮只是因为它们已经是正方形)在字母“标记”时从黄色变为红色,在“未标记”时变为黄色。
如果我注释掉最后一行使其重新充电为黄色,以及使用Thread.sleep()延迟程序的方法,它会按预期工作,将它们全部保留为红色,但是如果我仅取消注释delay方法,它不会实时更新,并且当程序运行完后,所有背景都会变为红色。
如果我取消注释将其变回黄色的行,它将一直保持黄色

我不知道如何让按钮实时切换到红色和黄色

if(r+1 != bBoard.length && c+1 != bBoard.length && !bBoard[r+1][c+1].equals(""))
    {
        String temp = bBoard[r][c];
        bBoard[r][c] = "";
        boardLabel[r][c].setBackground(Color.RED);
        if(dictionary.contains(word) && word.length() > 2)
        {
            wordList.add(word);
            delayProgram();

        }
        depthFirstSearch(bBoard, r+1, c+1, word);
        bBoard[r][c] = temp;
        boardLabel[r][c].setBackground(Color.YELLOW);
    }

默认情况下,应用程序启动单个线程,并在此线程上执行所有计算。当您更改组件的颜色时,只有当程序有空闲时间时,才会重新绘制组件,但由于计算仍在继续,程序从来没有空闲时间

您需要做的是将此循环中的代码放到另一个线程,并从第二个线程更新GUI

这是一个小的工作示例,应该让您开始

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class ColorfulButtons extends JFrame {

    private JLabel[] labels = new JLabel[5];

    // start the application, this starts the original thread
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    ColorfulButtons frame = new ColorfulButtons();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public ColorfulButtons() {
        // create your gui
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        JPanel contentPane = new JPanel();
        setContentPane(contentPane);
        contentPane.setLayout(new GridLayout(1, 0, 0, 0));

        for (int i = 0; i < 5; i++) {
            JLabel lbl = new JLabel("TEXT");
            add(lbl);
            labels[i] = lbl;
        }

        // start the color changing thread
        new Thread(new Runnable() {

            public void run() {
                doTheThing();
            }
            // give it a name for debugging
        }, "DoTheThingThread").start();
    }

    private void doTheThing() {
        int index = 0;
        while (true) {
            // put label in final variable so I can use it inside anonymous classes
            final JLabel lbl = labels[index];

            // make label yellow on Event Dispatch Thread
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    lbl.setForeground(Color.YELLOW);
                }
            });

            // pause to give the gui time to redraw and process events 
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            // make label red on Event Dispatch Thread
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    lbl.setForeground(Color.RED);
                }
            });

            // increment or reset index
            if (index < 5 - 1)
                index++;
            else
                index = 0;
        }
    }
}
导入java.awt.Color;
导入java.awt.EventQueue;
导入java.awt.GridLayout;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.SwingUtilities;
公共类ColorfulButtons扩展JFrame{
私有JLabel[]标签=新JLabel[5];
//启动应用程序,这将启动原始线程
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
公开募捐{
试一试{
ColorfulButtons框架=新的ColorfulButtons();
frame.setVisible(true);
}捕获(例外e){
e、 printStackTrace();
}
}
});
}
公共彩色按钮(){
//创建您的gui
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
立根(100100450300);
JPanel contentPane=新的JPanel();
setContentPane(contentPane);
setLayout(新的GridLayout(1,0,0,0));
对于(int i=0;i<5;i++){
JLabel lbl=新JLabel(“文本”);
添加(lbl);
标签[i]=lbl;
}
//启动变色线程
新线程(newrunnable()){
公开募捐{
doTheThing();
}
//给它一个调试的名称
},“DoTheThingThread”).start();
}
私有无效的doTheThing(){
int指数=0;
while(true){
//把标签放在最后一个变量中,这样我就可以在匿名类中使用它了
最终JLabel lbl=标签[索引];
//将事件分派线程上的标签设置为黄色
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
lbl.设置前景(颜色:黄色);
}
});
//暂停以给gui时间重新绘制和处理事件
试一试{
睡眠(100);
}捕捉(中断异常e){
e、 printStackTrace();
}
//使事件分派线程上的标签为红色
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
lbl.设置前景(颜色为红色);
}
});
//增加或重置索引
如果(指数<5-1)
索引++;
其他的
指数=0;
}
}
}

“实时”表示更改按钮颜色的代码存在于事件侦听器(如ActionListener)中。我们不知道这是否基于此代码段。另外,永远不要让GUI线程处于睡眠状态。如果您在Swing GUI中需要延迟,请改用。@HovercraftFullOfEels该代码不在操作侦听器中,这些按钮从来没有实际用作按钮,我只是为了格式化而制作这些按钮。颜色在一个循环内改变,该循环由另一个按钮调用,该按钮的颜色永不改变。创建对象时调用此代码吗?很难根据我们对你的问题和代码的有限的观点来说明发生了什么,你会想考虑你的问题,并向我们展示更多的相关代码,如代码格式化的文本,确切地说是A(请阅读链接)。因此,如果我理解正确的话,你就有了一组黄色按钮。你在它们之间循环,将它们的颜色改为红色一段时间,然后再改回黄色并移动到下一个按钮,对吗?@MatheM-yes。它模拟一个boggle板,并进行dfs搜索,从左上角开始,将第一个字母添加到字符串中,然后通过将其添加到同一字符串并对照字典单词树集检查其右侧的字母。我希望字符串当前包含的字母为红色,然后在不再使用时变回黄色。但它们一直都是黄色的。我将所有按钮都改为标签,但仍然得到相同的行为。