在这里解释我的问题是一个 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
才会完整显示:
我的问题是:
一个。为什么 DiagB
构建后没有完全显示? (它仅在 showDiag()
返回时完整显示)。
乙。我提出问题的原因是 DiagB
需要通过 DiagA
中的长进程进行更新。
什么是正确的更新方式?是否需要为每个更新过程使用 SwingWorker
?
最佳答案
一个。 showDiag
在 GUI 线程上运行。当您让 GUI 线程 hibernate 时,GUI 将完全停止运行。
是的,将 SwingWorker
用于长时间运行的任务,并使用 SwingUtilities.invokeLater()
将 GUI 更新任务提交回 GUI 线程。或者,实现 SwingWorker#done()
,这是一种在 SwingWorker
任务完成后在 GUI 线程上运行的便捷方法。
关于java - Swing GUI下的长进程 : unexpected delay,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39484450/