更改Java图形对象的颜色

时间:2011-11-24 15:05:59

标签: java swing user-interface repaint

我正在尝试通过更改颜色并调用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();
}

更改节点颜色与绘图组件属于同一类。

非常感谢任何帮助。

3 个答案:

答案 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()? (对不起,这里完全猜测......)