Java摆动线程问题

时间:2014-07-07 04:11:36

标签: java multithreading swing

我一直在尝试使用swing元素制作一个多选问题游戏,我只是使用JTextArea来显示问题,并使用JButtons选项。

我希望每次用户回答问题时,都会通过使用正确答案更改JButton的背景颜色来显示正确的答案。

我正在使用MVC设计模式,因此每次用户单击选项JButtons时,actionPerformed方法会调用界面中设置JButton背景颜色的方法,睡眠线程一秒钟,然后将背景设置为默认颜色。

一切似乎都是正确的但是当运行程序时,图形界面不会改变背景颜色,尽管你可以看到线程睡眠。

如果有人可以帮我解决这个问题,我将非常感激,我会提供所有描述方法的代码。

public void showCorrectAnswer (int index)
{
    //JButtons array
    options[index].setBackground(Color.green);
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    options[index].setBackground(defaultColor);
}

ActionPerformed选项按钮代码:

public void actionPerformed(ActionEvent e)
{
    JButton source = (JButton) e.getSource();
    int index =controller.getTheModel().getIndexWereTheRightAnswerIs();
    controller.getTheMainView().showCorrectAnswer(index);

}

1 个答案:

答案 0 :(得分:0)

在Event Dispatching Thread的上下文中使用Thread.sleep会阻止EDT处理新的绘制请求(更改背景颜色)。

Swing也不是线程安全的,这意味着你只应该从EDT的上下文修改UI。

相反,您应该考虑使用javax.swing.Timer。这将允许您在将来的某个时间安排回调,并在触发时执行将在EDT上下文中执行的操作。

请查看Concurrency in SwingHow to Use Swing Timers了解详情

我要做的是设置一个延迟一秒的非重复计时器,设置按钮的背景颜色并启动计时器。当计时器触发时,重置按钮的背景颜色

此外,根据外观和感觉,设置按钮的背景颜色可能没有任何(或只是很小的)效果,只是你知道......