Swing、Java和多线程以及着色按钮

Swing、Java和多线程以及着色按钮,java,multithreading,swing,Java,Multithreading,Swing,是的,这是家庭作业。是的,我完全卡住了 这里是要点。我已经创建了一个JFrame。有3个面板(顶部、中部和底部)。在底部面板中有三个按钮,分别称为:红色、绿色和蓝色。在顶部面板中有3个文本字段,它们为我们提供了单击相应按钮的次数。每个按钮最多允许10个。中间面板是一个8×8的Jbuttons网格,编号从0到63。到目前为止,一切顺利 每次我们点击一个按钮,一个线程就会启动。当线程开始时,不会有线程死亡,随机选择0到63之间的数字。对应于该数字的JButton被绘制为单击的颜色。因此,如果单击红色

是的,这是家庭作业。是的,我完全卡住了

这里是要点。我已经创建了一个JFrame。有3个面板(顶部、中部和底部)。在底部面板中有三个按钮,分别称为:红色、绿色和蓝色。在顶部面板中有3个文本字段,它们为我们提供了单击相应按钮的次数。每个按钮最多允许10个。中间面板是一个8×8的Jbuttons网格,编号从0到63。到目前为止,一切顺利

每次我们点击一个按钮,一个线程就会启动。当线程开始时,不会有线程死亡,随机选择0到63之间的数字。对应于该数字的JButton被绘制为单击的颜色。因此,如果单击红色按钮,我们将看到一个白色背景的框变为红色。但是这个按钮的颜色开始褪色,直到变成白色。该过程大约需要8秒钟

您创建的线程不应有权访问任何Swing组件。相反,我们必须维护一个数据结构,并根据线程的执行周期进行更新。另一方面,定期从主线程调用repaint()方法,邀请Swing事件调度程序线程最终访问数据结构的内容,并相应地显示GUI组件

。。。。。。。。我已经创建并显示了所有对象。在按钮上单击次数不能超过10次。我就在这里:

我有两个数组:一个是大小为64的字符串数组。它们代表按钮。我还有一个整数数组。这样我就知道了线程的创建顺序。我已经创建了一个按钮点击线程,我已经开始他们。以下是我的线程运行方法:

public void run() {
    Random num = new Random(new Date().getTime());
    while (true) {
        Thread j = Thread.currentThread();
        int randInt = num.nextInt(64);
        synchronized (lock) {

            if ((array[randInt].compareTo("red") == 0
                 || array[randInt].compareTo("blue")
                 == 0 || array[randInt].compareTo("green") == 0))
            {
                randInt = num.nextInt(64);
            }
            for (int k = 0; k < 10; k++) {
                if (threadarray[k] == -1) {
                    threadarray[k] = randInt;
                    break;
                }
            }

        }
    }
}
public void run(){
Random num=new Random(new Date().getTime());
while(true){
Thread j=Thread.currentThread();
int randInt=num.nextInt(64);
已同步(锁定){
if((数组[randInt].compareTo(“红色”)==0
||数组[randInt]。比较(“蓝色”)
==0 | |数组[randInt]。比较(“绿色”)==0)
{
randInt=num.nextInt(64);
}
对于(int k=0;k<10;k++){
if(线程数组[k]=-1){
threadarray[k]=randInt;
打破
}
}
}
}
}
尽管我们还没有讨论它,但我尝试使用一个计时器对象,它会立即在lock部分之外发出声音。这将带我进入actionPerformed方法。我已经添加了所有适当的注册

public void actionPerformed(ActionEvent arg0) {
    for (int i = 0; i < threadarray.length; i++) {

        int num = threadarray[i];
        if (num != -1) {
            System.out.println(num);
            String s = array[num];
            System.out.println(s + "is ");
            if (s.compareTo("red") == 0) {
                button[num].setOpaque(true);
                button[num].setBackground(Color.red);
                while (button[num].getBackground() != Color.white) {
                    System.out.println("not white yet");
                    int g = button[num].getBackground().getGreen();
                    int b = button[num].getBackground().getBlue();
                    if (255 - (g + 1) >= 0) {
                        Color c = new Color(255, g + 1, b + 1, 1);
                        button[num].setOpaque(true);
                        button[num].setBackground(c);
                        System.out.println(c + " " + " c is");
                    } else {
                        button[num].setBackground(Color.white);
                    }
                }
            }

            System.out.println(i + " i is " + button[num].getBackground()); //just some debugging info
            threadarray[i] = -1;   //clear the thread array
            array[num] = "0"; //clear the string array

        }
    }
}
public void actionPerformed(ActionEvent arg0){
对于(int i=0;i=0){
颜色c=新颜色(255,g+1,b+1,1);
按钮[num].setOpaque(true);
按钮[num]。设置背景(c);
System.out.println(c++“c是”);
}否则{
按钮[num].setBackground(颜色.白色);
}
}
}
System.out.println(i+“i是”+按钮[num].getBackground());//只是一些调试信息
threadarray[i]=-1;//清除线程数组
array[num]=“0”;//清除字符串数组
}
}
}
actionPerformed方法由事件分派线程处理。(注意,上面的代码仅适用于红色线。我们的想法是通过增加绿色和蓝色,使颜色逐渐褪色,直到变成白色


问题:当我点击底部的红色按钮时,没有任何按钮会改变颜色(是的,已经完成了适当的注册。)我也不知道如何在大量线程运行的情况下控制计时。我在这里走的是正确的道路吗?

在不放弃太多的情况下,这说明了一种处理忽略
setBackground()的颜色和按钮的方法
。示例和演示如何褪色。由于两者都依赖于
javax.swing.Timer
线程,两者都不是解决方案,但这些技术可能会被证明是有用的。

如果是家庭作业,那么就添加
家庭作业
标签。要获得更好的帮助,请尽快用标签编辑您的问题,还请解释更多问题是什么?您看不到but颜色发生变化,但您是否看到actionPerformed输出的文本?