Swing,Java和multithreading以及着色按钮

是的,这是功课。 是的,我完全陷入困境。

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

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

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

……..我已经创建并显示了所有对象。 您无法在按钮上单击超过10次。 我就在这里:

我有两个数组:一个是大小为64的字符串数组。它们代表按钮。 我也有一系列的整数。 这样我就知道了创建线程的顺序。 我已经创建了线程,因为单击了一个按钮,我已经启动了它们。 这是我的线程的run方法:

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; } } } } } 

即使我们没有覆盖它,我也尝试使用一个Timer对象,它立即在锁定部分外面消失。 这将我带到actionPerformed方法。 我已经添加了所有适当的注册。

 public void actionPerformed(ActionEvent arg0) { for (int i = 0; i = 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 } } } 

actionPerformed方法由Event Dispatch Thread处理。 (注意上面的代码仅用于红色线程。想法是通过不断增加绿色和蓝色直到它变成白色来淡化颜色。

问题:当我点击底部的红色按钮时,没有任何按钮会改变颜色(是的,已经完成了适当的注册。)我也不知道如何控制多个线程的时间。 我甚至走在正确的道路上吗?

在没有给出过多的情况下,这个例子说明了一种处理忽略setBackground()颜色和按钮的方法。 此处和此处的示例演示了如何淡化颜色。 由于两者都依赖于javax.swing.Timer线程,因此两者都不是解决方案,但这些技术可能有用。