gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:40:16 31 4
gpt4 key购买 nike

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

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

每次我们点击一​​个按钮,一个线程就会启动。没有线程会死亡 当线程启动时,会随机选择一个从 0 到 63 的数字。对应于该数字的 JButton 被涂上了被点击的颜色。因此,如果单击红色按钮,我们应该会看到一个白色背景的框变成红色。但随后 JButton 的颜色开始变淡,直到变成白色。该过程大约需要 8 秒。

您创建的线程不应访问任何 Swing 组件。相反,必须维护一个数据结构并根据线程的执行周期更新线程。另一方面,定期从主线程调用 repaint() 方法以邀请 Swing Event Dispatcher 线程最终访问数据结构的内容并相应地显示 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;
}
}

}
}
}

尽管我们还没有介绍它,但我已经尝试使用一个 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 方法由事件调度线程处理。 (请注意,上面的代码仅适用于红色线。想法是通过逐渐增加绿色和蓝色直到变成白色来淡化颜色。

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

最佳答案

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

关于java - Swing、Java 和多线程以及着色按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9498389/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com