Как закрыть JDialog и уведомить прослушиватели событий окна?

есть ли способ закрыть JDialog через код, чтобы прослушиватели событий окна все еще были уведомлены? Я попытался просто установить видимый для false и disposing, но ни один из них, похоже, не делает этого.

5 ответов


закрытие окна (с dispose()) и скрывать его (с setVisible(false)) - это разные операции и производят разные события-и закрытие его из операционной системы-это еще одна другая операция, которая производит еще одно другое событие.

все три будут производить windowDeactivated чтобы сказать вам, что окно потеряло фокус, но будет windowClosed, при закрытии из ОС будет первый производства windowClosing. Если вы хотите обращаться с обоими из них одинаково, вы можете установить окно, которое будет удалено при закрытии:

window.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

в общем, setVisible(false) означает, что вы можете снова использовать окно, поэтому он не публикует никаких событий окна (кроме windowDeactivated). Если вы хотите обнаружить скрытие окна, вам нужно использовать ComponentListener;

window.addComponentListener(new ComponentAdapter() {
  @Override
  public void componentHidden(ComponentEvent e) {
    System.out.println("componentHidden()");
  }
})

обратите внимание, что это будет в значительной степени работать только для явного setVisible() звонки. Если вам нужно обнаружить скрытие в более общем плане, вы можете использовать HierarchyListener, но это, вероятно, больше проблем чем оно того стоит.

  window.addHierarchyListener(new HierarchyListener() {
    @Override
      public void hierarchyChanged(HierarchyEvent e) {
        System.out.println("valid: " + window.isValid());
        System.out.println("showing: " + window.isShowing());
      }
  });

обратите внимание, что при утилизации окна вы получите пару HierarchyEvents, сначала для скрытия, а затем для аннулирования, но когда вы скрываете его с setVisible() он все еще действителен, поэтому вы не получите недействительность.


Кажется, у меня нет вашей проблемы. Когда я использую код ниже windowDeactivated() вызывается либо setVisible (false ) или dispose () и windowClosed() также вызывается для dispose ().

ClosingDialog.java:

public class ClosingDialog extends JDialog {
    public ClosingDialog(Frame owner, String title, boolean modal) {
        super(owner, title, modal);
        JPanel contentPanel = (JPanel) this.getContentPane();

        JButton setVisButton = new JButton("setVisible( false )");
        setVisButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                ClosingDialog.this.setVisible(false);
            }
        });

        JButton disposeButton = new JButton("dispose()");
        disposeButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                ClosingDialog.this.dispose();
            }
        });

        contentPanel.setLayout(new FlowLayout());

        contentPanel.add(setVisButton);
        contentPanel.add(disposeButton);

        this.addWindowListener(new WindowListener() {
            public void windowActivated(WindowEvent e) {
                System.out.println("windowActivated");
            }

            public void windowClosed(WindowEvent e) {
                System.out.println("windowClosed");
            }

            public void windowClosing(WindowEvent e) {
                System.out.println("windowClosing");
            }

            public void windowDeactivated(WindowEvent e) {
                System.out.println("windowDeactivated");
            }

            public void windowDeiconified(WindowEvent e) {
                System.out.println("windowDeiconified");
            }

            public void windowIconified(WindowEvent e) {
                System.out.println("windowIconified");
            }

            public void windowOpened(WindowEvent e) {
                System.out.println("windowOpened");
            }
        });

        this.setSize(300, 300);
    }
}

отправка события windowClosing в окно. Проверьте пример ExitAction из закрытие приложения запись.


непроверенные предложение:

вы пробовали getWindowListeners (), а затем перебирали, чтобы запустить windowClosed () для каждого из WindowListeners?

EDIT: приведенное выше предложение неверно. Храню для потомков.

Я боюсь вызова диалога.метод Dispose() отлично работает для меня в моем простом примере.


Я хотел уволить windowClosing событие из кода (так же, как если бы пользователь нажал X), потому что у меня есть дополнительная кнопка закрытия в JDialog и хочу тот же WindowListener (который я реализовал с помощью WindowAdapter) для запуска при нажатии X и при нажатии кнопки. Бег!--3--> только пожары windowClosed, а не windowClosing, и я хочу, чтобы появилось сообщение до окно закрыто для подтверждения. Я тоже не успел выстрелить windowClosing С помощью метода JDialog processWindowEvent так как он защищен.

вот как я получил его работу, хотя:

WindowAdapter adapter = (WindowAdapter)jdialog.getWindowListeners()[0];
adapter.windowClosing(new WindowEvent((Window)jdialog, WindowEvent.WINDOW_CLOSING));

надеюсь, что это кому-то поможет.