我正在尝试通过更改颜色并调用repaint()
方法来刷新Java图形对象。颜色仅在最终更改颜色调用时更新。这是我的代码:
public void start() {
try {
Color origColor = node.getColor();
for (int i=0; i<noOfFlashes; i++) {
Manager.gui.getDrawGraph().changeNodeColor(node, Color.WHITE);
Thread.sleep(500);
Manager.gui.getDrawGraph().changeNodeColor(node, origColor);
Thread.sleep(500);
}
Manager.gui.getDrawGraph().changeNodeColor(node, Graph.VISITED_NODE);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
和更改节点颜色方法是:
public void changeNodeColor(Node node, Color c) {
node.setColor(c);
repaint();
}
更改节点颜色与绘图组件属于同一类。
非常感谢任何帮助。
答案 0 :(得分:1)
根据我对您的代码的理解,我可能会建议使用SwingWorker。
我知道您没有任何成本昂贵的代码,但使用SwingWorker,您将能够更轻松地更新GUI。
答案 1 :(得分:1)
您需要使用单独的线程来管理GUI事件。
你可以按照Amine的建议使用SwingWorker来实现这一点,或者实现Runnable接口,或者扩展Thread类,开发run()
方法,即你的线程的任务。
你可以阅读这个旧问题:How do I use SwingWorker in Java?
SwingWorker教程:http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html
制作主题的教程:http://docs.oracle.com/javase/tutorial/essential/concurrency/
颜色仅在最终更改颜色调用时更新。
如果你不使用单独的线程,你的gui会冻结,直到方法完全执行,你不会看到由Thread.sleep(500);
分隔的颜色变化。
<强>更新强>
在this链接中,在段落为什么Swing GUI冻结或锁定?中,您可以通过使用单个线程来理解Java Swing GUI冻结的原因。
同时检查{em>创建主题和this页面中的this官方链接,返回:
Swing的单线程规则说Swing组件只能是 由单个线程访问。此规则适用于获取和设置, 并且单个线程称为事件派发线程。
单线程规则是UI组件的良好匹配,因为它们 无论如何,大多数操作都倾向于以单线程方式使用 由用户发起。此外,建立线程安全 组件既困难又乏味:不做的事情是件好事 如果可以避免的话。但是为了它的所有好处,单线程规则 具有深远的影响。
Swing组件通常不符合单线程规则 除非他们的所有活动都是在事件发送时发送和接收的 线。例如,应该在上发送属性更改事件 应该接收事件派发线程和模型更改事件 事件派遣线程。
对于基于模型的组件,如JTable和JTree,单线程 规则意味着模型本身只能被访问 事件派遣线程。因此,模型的方法必须 快速执行,永远不应阻止,或整个用户界面 将没有反应。
我认为上面的句子对于更好地理解Swing
包非常有用。
我报告了trashgod的建议。
您可以使用Timer
包中的javax.swing.Timer
类。这也是一个不错的选择。
在this问题中,trashgod会报告Timer
的一些示例。
查看here以获取有关Timer
。
答案 2 :(得分:0)
我不确定你在这里使用哪个框架......但是你可能需要在Thread.sleep()之前进行重绘()。是否有Manager.gui.repaint()? (对不起,这里完全猜测......)