【问题标题】:Java swing threading problems [duplicate]Java swing线程问题[重复]
【发布时间】:2014-07-07 04:11:36
【问题描述】:

我一直在尝试使用摇摆元素制作多项选择题游戏,我只是使用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);

}

【问题讨论】:

    标签: java multithreading swing


    【解决方案1】:

    在事件调度线程的上下文中使用 Thread.sleep 会阻止 EDT 处理新的绘制请求(背景颜色的更改)。

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-24
      • 1970-01-01
      • 2016-01-28
      • 2020-12-06
      • 2011-01-06
      • 1970-01-01
      相关资源
      最近更新 更多