假设我有一个函数refresh(),它调用另外两个函数,一个是长期运行的clearData()函数,需要在EDT上运行,另一个是在EDT中运行的快速函数repaint()并重新绘制GUI组件。
refresh()
{
clearData(); //off the EDT function
repaint(); //in the EDT function
}
当需要运行像clearData()这样的较长操作时,处理重绘的正确方法是什么。 它是否让clearData线程在完成正确的方式后运行repaint()?怎么办呢?
答案 0 :(得分: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();
}
}
答案 1 :(得分:0)
refresh() {
new Runnable(){
clearData();
SwingUtilities.invokeLater(new Runnable() {
repaint();
});
}.run();
}
请注意,重新注册将在clearData();
返回后注册,因此,保证repaint()
将在clearData()
之后执行。