У меня есть одно окно класса Jframe
и оно содержит одну кнопку. При нажатии этой кнопки открывается второе окно класса Jframe
. При нажатии кнопки закрытия или выхода второго окна первое окно также закрывается вместе со вторым окном. Почему это происходит?
ниже мой код://это мой первый файл
class Frame1 extends JFrame
{
Frame1()
{
super("hello this is window 1");
setVisible(true);
setSize(400,400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new FlowLayout());
JButton btn = new JButton("open second window");
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("button clicked");
Frame2 obj2 = new Frame2();
}
});
add(btn);
}
public static void main(String args[])
{
Frame1 obj = new Frame1();
}
}
// this is my second file
class Frame2 extends JFrame
{
Frame2()
{
super("hello this is window 2");
setVisible(true);
setSize(400,400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new FlowLayout());
}
}
Попробуйте добавить слушателя окна во второй кадр, а затем просто утилизируйте его, например:
frame2.addWindowListener(new java.awt.event.WindowAdapter() {
@Override
public void windowClosing(java.awt.event.WindowEvent windowEvent) {
frame2.dispose();
}
});
OR
frame2.setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE);
Но обратите внимание, что не очень хорошая практика использования нескольких приложений JFrame's
в вашем приложении, используйте один JFrame
и несколько Dialogs
.
Попробуйте изменить событие закрытия по умолчанию (которое выйдет из программы), а затем закройте этот JFrame явно.
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));
Некоторые ссылки, которые могут помочь:
http://tips4java.wordpress.com/2009/05/01/closing-an-application/
http://docs.oracle.com/javase/tutorial/uiswing/events/windowlistener.html
qaru.site/questions/31366/...
Удалите эту строку из класса Frame2
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Затем добавьте это в ту же строку:
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
Измените значение параметра setDefaultCloseOperation() на JFrame.DO_NOTHING_ON_CLOSE, чтобы второй кадр не закрыл первый кадр