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

时间:2012-02-29 11:36:11

标签: java multithreading swing

是的,这是家庭作业。是的,我完全陷入困境。

这是要点。我创建了一个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处理。 (注意上面的代码仅用于红色线程。想法是通过不断增加绿色和蓝色直到它变成白色来淡化颜色。

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

1 个答案:

答案 0 :(得分:2)

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