要在这里解释一下我的问题是MCVE这里一下[点击JButton
上JDialog
A打开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);
}
}
正如你可以在代码中看到我添加了一个3秒延迟创建后DiagB
。 点击该按钮DiagB
这样表示:
的3秒延时结束后唯一,DiagB
显示全:
我的问题是:
一个。为什么DiagB
在构建后没有完全显示? (仅当showDiag()
返回时才显示全部)。 b。我的问题的原因是DiagB
需要更新,在DiagA
长进程。
什么是更新的正确方法?是否需要在每个更新过程中使用SwingWorker
?
如果它是显示而不是用户交互,它不应该是一个'JDialog'这是,嗯,与用户对话。在事件处理程序中,应该永远不会进行睡眠(或任何其他长操作)。 – RealSkeptic
@RealSkeptic我明白你说的关于事件处理程序长时间操作的。('JDialog'或'JFrame'不会让这种情况下太大的差别。一个'可能需要JDialog'对于形态为例)。 – c0der
模态意味着用户交互是立即需要的。否则,它的使用不正确。 – RealSkeptic