我一直在尝试使用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);
}
答案 0 :(得分:0)
在Event Dispatching Thread的上下文中使用Thread.sleep
会阻止EDT处理新的绘制请求(更改背景颜色)。
Swing也不是线程安全的,这意味着你只应该从EDT的上下文修改UI。
相反,您应该考虑使用javax.swing.Timer
。这将允许您在将来的某个时间安排回调,并在触发时执行将在EDT上下文中执行的操作。
请查看Concurrency in Swing和How to Use Swing Timers了解详情
我要做的是设置一个延迟一秒的非重复计时器,设置按钮的背景颜色并启动计时器。当计时器触发时,重置按钮的背景颜色
此外,根据外观和感觉,设置按钮的背景颜色可能没有任何(或只是很小的)效果,只是你知道......