Как закрыть 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());
}
});
обратите внимание, что при утилизации окна вы получите пару HierarchyEvent
s, сначала для скрытия, а затем для аннулирования, но когда вы скрываете его с 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));
надеюсь, что это кому-то поможет.