установка Swing JDialog на немодальный

1

У меня проблема с настройкой 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, но, видя, что я не могу вызывать его из основного потока, мне пришлось создать новый, поэтому результат был почти таким же.

Есть ли у вас какие-либо предложения?

Теги:
swing

1 ответ

1
Лучший ответ

Перед тем, как показывать модальный 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);
  • 0
    Отлично. Именно то, что я искал. После нескольких изменений мне удалось получить желаемый результат. Спасибо!!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню