Используйте invokeLater, чтобы показать диалоги один за другим - PullRequest
2 голосов
/ 30 ноября 2010

В 2 разных слушателях действий, диалог будет отображаться при выполнении некоторых условий.Если оба слушателя действия должны показать диалог, будут показаны 2 диалога одновременно.Но я хочу, чтобы они показывались один за другим.

Упрощенный код:

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JOptionPane.showMessageDialog(getTopLevelAncestor(), "dialog 1");
            }
        });

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JOptionPane.showMessageDialog(getTopLevelAncestor(), "dialog 2");
            }
        });

Эти 2 вызова "SwingUtilities.invokeLater" находятся в разных классах.

Ответы [ 3 ]

1 голос
/ 30 ноября 2010

Это связано с модальностью диалогов. Есть довольно полезная статья на эту тему http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javase6/modality/. Диалоги имеют разные типы модальностей с разными приоритетами. Вы можете решить свою проблему, создав второй диалог с более низким приоритетом:

JOptionPane pane = new JOptionPane("dialog 2", JOptionPane.INFORMATION_MESSAGE);
JDialog dialog = pane.createDialog("Message");
dialog.setModalityType(Dialog.ModalityType.DOCUMENT_MODAL);
dialog.setVisible(true);

Надеюсь, это поможет.

1 голос
/ 30 ноября 2010

Создайте класс, который отслеживает это;этот класс будет содержать очередь диалогов для отображения;всякий раз, когда диалог закрывается, первый из очереди показывается и удаляется из очереди.Когда другой класс должен показать диалоговое окно, он сразу же отображается, если очередь пуста или вставлена ​​в очередь еще.

0 голосов
/ 06 августа 2011

Вам нужно invokeAndWait(), этот метод ожидает завершения Runnable.

Или в вашей ситуации, когда первый диалог был закрыт.

...