0

假设我有一个函数 refresh() 调用另外两个函数,一个是需要从 EDT 运行的长时间运行 clearData() 函数,另一个是在 EDT 中运行并重绘的快速函数 repaint()图形用户界面组件。

refresh()
{
   clearData(); //off the EDT function
   repaint(); //in the EDT function
}

当需要运行像 clearData() 这样的较长操作时,处理重绘的正确方法是什么。一旦以正确的方式完成,是否让 clearData 线程运行 repaint() ?如何才能做到这一点?

4

2 回答 2

0
refresh() {
    new Runnable(){
        clearData();
        SwingUtilities.invokeLater(new Runnable() {
            repaint();
        });
    }.run();
}

请注意, repaint 将被注册为在clearData();返回之后调用,因此,它保证repaint()将在 之后执行clearData()

于 2013-09-11T09:50:16.190 回答
0

是的,完成repaint()后运行clearData()。您可以使用SwingUtilties.invokeLater()或类似方法让 repaint() 在 EDT 上运行。

可能的实施

final Runnable CLEAR_THEN_REPAINT = new Runnable() {
    public void run() { 
        clearData(); 
        SwingUtilities.invokeLater(new Runnable() {
            public void run() { repaint(); }
        });
    }
};

void refresh() {
    if (SwingUtilities.isEventDispatchThread()) {
        new Thread(CLEAR_THEN_REPAINT).start();
    } else {
        CLEAR_THEN_REPAINT.run();
    }
}
于 2013-09-11T09:09:28.977 回答