Чтобы объяснить мой вопрос, вот 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
отображается полностью:
Мои вопросы:
a. Почему DiagB
не отображается полностью после того, как он построен? (Показывается полностью только при возврате showDiag()
).
б. Причина моего вопроса в том, что DiagB
нужно обновить долгими процессами в DiagA
.
Как правильно обновлять? Требуется ли использование SwingWorker
для каждого процесса обновления?
JDialog
, которое, ну, для диалога с пользователем. И в обработчике событий никогда не должно быть приостановки (или любой другой длительной операции). - person RealSkeptic   schedule 14.09.2016JDialog
илиJFrame
в этом случае не будет иметь большого значения. Например, для модальности может потребоватьсяJDialog
). - person c0der   schedule 14.09.2016SwingWorker
- это то, что нужно для этого.. - person Andrew Thompson   schedule 14.09.2016