有一个AVLTreePanel类,传入一个AVL树,需要在构造函数做一些预处理,然后再在paintComponent方法中使用预处理的数据通过遍历这棵树把它画出来。
问题是,在这过程中,AVL树的结构可能发生变动,这样就会导致预处理的数据和树本身不一致的现象,甚至在预处理时就会产生问题。paintComponent方法还是JAVA在别的线程中自己调度的……
有什么好的策略可以解决这个问题么?
问题是,在这过程中,AVL树的结构可能发生变动,这样就会导致预处理的数据和树本身不一致的现象,甚至在预处理时就会产生问题。paintComponent方法还是JAVA在别的线程中自己调度的……
有什么好的策略可以解决这个问题么?
数据每变化一次就调用repaint() 方法
paintComponent()方法只需要把数据画成图形,不需要放入线程里
Runnable r = initTask();
SwingUtilities.invokeLater(r);Runnable r = initTask();
if( SwingUtilities.isEventDispatchThread() ) {
r.run();
}
else { try { SwingUtilities.invokeAndWait(r);
}
catch(Exception ex) { // ...
}
}
后者是同步调用,会使调用线程等待,慎用。
if( SwingUtilities.isEventDispatchThread() ) {
// ...
}
或
if( EventQueue.isDispatchThread() ) {
// ...
}
public static void main(String[] args) { JFrame frame = new CustomizedFrame("title");
frame.pack();
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
应该这样写:
public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() { JFrame frame = new CustomizedFrame("title");
frame.pack();
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}