java-Swing GUI下的长进程:意外延迟
作者:互联网
为了解释我的问题,这里是一个MCVE,其中单击并单击JDialog A上的JButton将打开JDialog B:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
public class DiagA extends JDialog {
private DiagB diag;
public DiagA() {
super();
setTitle("main diag");
setSize(200, 150);
setLocation(400,400);
JButton btn = new JButton("Show DiagB");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
showDiag();
}
});
add(btn, BorderLayout.NORTH);
//make main frame visible
setVisible(true);
}
void showDiag() {
if(diag == null) {
diag = new DiagB();
//this prints out as expected
System.out.println("set visible done");
try {
Thread.sleep(3000);
} catch (InterruptedException ex) {}
//only after the delay diag shows in full
}
}
public static void main(String[] args) {
new DiagA();
}
}
class DiagB extends JDialog {
public DiagB() {
super();
setTitle("2nd diag");
setSize(150, 100);
setLocation(600,420);
setLayout(new FlowLayout(FlowLayout.CENTER));
getContentPane().setBackground(Color.YELLOW);
setVisible(true);
}
}
如您在代码中所见,创建DiagB之后,我添加了3秒的延迟.
单击按钮DiagB显示如下:
仅在3秒延迟结束后,DiagB才完整显示:
我的问题是:
一种.为什么DiagBshow在构建后没有完全显示? (仅当showDiag()返回时才完整显示).
b.我提出这个问题的原因是,DiagB需要通过DiagA中的长期过程进行更新.
什么是正确的更新方式?是否需要在每个更新过程中使用SwingWorker?
解决方法:
一种. showDiag在GUI线程上运行.当您使GUI线程进入睡眠状态时,GUI将完全死机.
b.是的,将SwingWorker用于长时间运行的任务,并使用SwingUtilities.invokeLater()将GUI更新任务提交回GUI线程.或者,实现SwingWorker#done(),这是在SwingWorker任务完成后在GUI线程上运行的便捷方法.
标签:swingworker,swing,java 来源: https://codeday.me/bug/20191026/1938435.html