要在這裏解釋一下我的問題是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