У меня проблема с настройкой JDialog на немодальную. Мне нужно отобразить всплывающее окно, не блокируя остальную часть приложения. Я попытался использовать SwingUtilities.invokeLater(), но, как видно из названия, он был вызван гораздо позже, после того как работа основного потока будет выполнена. Чтобы упростить, вот мой код:
BufferedReader reader = new BufferedReader(new FileReader(log));
JLabel validator = new JLabel("Validating - please wait");
JOptionPane pane = new JOptionPane(validator, JOptionPane.INFORMATION_MESSAGE,JOptionPane.NO_OPTION,null, new String[]{"Close"});
final JDialog dialog = pane.createDialog(null, "title");
dialog.setModal(false);
dialog.setVisible(true);
dialog.setVisible(true);
writer = validate(reader);
dialog.dispose();
Появится диалоговое окно, но оно пустое. Если я использую его как модальный, он отображается нормально. Я попытался использовать его с определенными вариантами, например:
JLabel validator = new JLabel("Validating - please wait");
JOptionPane pane = new JOptionPane(validator, JOptionPane.INFORMATION_MESSAGE,JOptionPane.NO_OPTION,null, new String[]{"Close"});
final JDialog dialog = pane.createDialog(null, "Validation in progress");
Runnable run = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
dialog.setModal(false);
dialog.setVisible(true);
}
};
SwingUtilities.invokeLater(run);
writer = validate(reader);
Но, как я уже сказал, диалог вызывает слишком поздно для меня. (Я также пытался invokeAndWait, но, видя, что я не могу вызывать его из основного потока, мне пришлось создать новый, поэтому результат был почти таким же.
Есть ли у вас какие-либо предложения?
Перед тем, как показывать модальный JDialog
, вам нужно запустить свой код, а затем отобразить диалог. Вы можете использовать фоновый поток, если метод validate займет много времени. Что-то вроде этого:
BufferedReader reader = new BufferedReader(new FileReader(log));
JLabel validator = new JLabel("Validating - please wait");
JOptionPane pane = new JOptionPane(validator, JOptionPane.INFORMATION_MESSAGE,JOptionPane.NO_OPTION,null, new String[]{"Close"});
final JDialog dialog = pane.createDialog(null, "title");
dialog.setModal(true);
SwingWorker myWorker = new SwingWorker<String, Void>() {
public void doInBackground() {
// do long running process
// perhaps including
writer = validate(reader);
// ....
return yourString;
}
public void done() {
update JLabel
dispose of dialog here!
}
};
myWorker.execute();
dialog.setVisible(true);