是的,这是家庭作业。是的,我完全陷入困境。
这是要点。我创建了一个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 < 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
}
}
}
actionPerformed方法由Event Dispatch Thread处理。 (注意上面的代码仅用于红色线程。想法是通过不断增加绿色和蓝色直到它变成白色来淡化颜色。
问题:当我点击底部的红色按钮时,没有任何按钮会改变颜色(是的,已经完成了适当的注册。)我也不知道如何控制多个线程的时间。我甚至走在正确的道路上吗?