2017-06-19 114 views
0

Swing的新手,但不是Java。我正在尝试以下操作:基本的Java Swing JFrame重新绘制

public void actionPerformed(ActionEvent e) { 

methodA(); 
pane.repaint(); 
methodB(); 
pane.repaint(); 

} 

where methodB()需要很长时间。我希望它画两次,但第一次的油漆电话从来没有发生过。这就像我做的那样:

public void actionPerformed(ActionEvent e) { 

methodA(); 
methodB(); 
pane.repaint(); 

} 

对不起,如果这是基本的,但我试过搜索,我仍然不明白为什么。

我已经尝试直接调用paint,除了应用程序在每次重绘时闪烁之外都按预期工作。

+2

不同的场景,不同的调用,但相同的行为和相同的解决方案:[Java swing GUI冻结](https://stackoverflow.com/questions/11185485/java-swing-gui-freezes) – BackSlash

+0

'repaint()'是绘制组件_soon_的请求(不是立即)。但是,如果'methodB'需要很长时间,它将阻塞事件分派线程,并且在完成之前没有任何内容会被重新绘制。考虑在另一个线程中运行'methodB'。 – khelwood

回答

4

actionPerformed在事件调度线程(EDT)中被调用,该事件调度线程也是执行绘制的地方,repaint只标记要重新绘制的组件。这意味着绘画只能在actinPerformed完成执行后才能完成。

长时间运行的任务不应该在EDT中执行,请使用SwingWorker或其他线程。

指示研究Swing's Threading Policy