Программное закрытие JOptionPane.ShowInternalOptionDialog

Мой текущий дизайн таков: у меня есть внешний фрейм, который отображает главное приложение. Когда пользователь нажимает кнопку в основном приложении, должно запускаться всплывающее окно. Я использую JOptionPane.showInternalOptionDialog и передаю объекты кнопок в качестве параметров. Когда пользователь нажимает одну из этих кнопок, он должен запускать определенные команды, а затем закрывать окно. Мне не удалось закрыть рамку, в которой отображается всплывающее окно.

Я нашел аналогичный вопрос на этом форуме, который предлагает следующий обходной путь. Закрытие диалогового окна, созданного JOptionPane.showOptionDialog()

Но вышеуказанный обходной путь закрывает мой полный графический интерфейс. Я просто хочу закрыть всплывающее окно JOptionPane.

Заранее спасибо.


person Jupiter    schedule 23.03.2011    source источник


Ответы (4)


пытаться

JOptionPane.getRootFrame().dispose();

в мероприятии

person cmujica    schedule 05.08.2011

Пара решений:

  1. Создайте JOptionPane напрямую, вместо использования методов showX(). Это позволит вам иметь ссылку на диалоговое окно, которое вы можете передать своей кнопке, чтобы она могла вызывать метод dispose().
  2. Создайте свой собственный диалог вместо использования JOptionPane. Это был бы мой предпочтительный вариант, учитывая, что вы начинаете уходить от простого диалога.
person jzd    schedule 23.03.2011

У меня такая же проблема. Я решаю это, используя поток, который закрывает мою JOptionPane через X миллисекунд.

import javax.swing.JOptionPane;

    public class JOptionPaneExample {
        public static void main(String[] args) {
            final JOptionPane pane =new JOptionPane();
            Thread t1 = new Thread(new Runnable() {
                public void run() {
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }               
                    pane.getRootFrame().dispose();
                }
            });
            t1.start();
            pane.showMessageDialog(null, "I will close after 3000 milli's", "Programmatic Auto-close JOptionPane", JOptionPane.INFORMATION_MESSAGE);
            System.exit(0);
        }
    }
person sevaggelinos    schedule 12.10.2015

По умолчанию нажатие кнопки в JOptionPane закроет диалоговое окно. Если у вас нет, это потому, что вы используете настоящие компоненты, а не строки или другие объекты, и он вызывает пользовательские обработчики событий ваших кнопок, а не свои собственные.

Я бы рекомендовал вам использовать другой подход, используя строки вместо кнопок. Используйте массив кнопок в качестве входных значений, и когда вызов showInternalOptionDialog вернется, вы можете проверить индекс int, чтобы узнать, что было нажато, а затем включить его в своем коде. Таким образом, вам вообще не придется прикасаться к JOptionPane, и он закроется сам по себе.

person BoffinBrain    schedule 23.03.2011
comment
Причина, по которой я выбрал JOptionPane, заключается в том, что мне нужен модальный диалог. Правильно, я передал Strings и Jbutton для опций. причина, по которой я выбрал объект JButton для параметров, заключается в том, что я не хочу, чтобы панель закрывалась немедленно. Я хочу, чтобы все проверки были сделаны и закрыты. Во время обработки, если есть какие-либо ошибки, я хочу, чтобы панель оставалась открытой. - person Jupiter; 23.03.2011
comment
А, спасибо, что прояснил это. В этом случае я определенно рекомендую вам сделать для этой цели собственный JDailog. JOptionPane обычно используется для простых сценариев вопрос-ответ. - person BoffinBrain; 24.03.2011
comment
Спасибо всем. Похоже, JDialog - это путь, по которому я должен пойти. - person Jupiter; 24.03.2011