JAVA中子視窗關閉,父視窗也關閉的問題
阿新 • • 發佈:2019-02-03
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">在程式設計之中,碰見的一個問題,感覺很簡單,但是卻由於那點知識的欠缺才會出錯。</span>
我碰見的有兩種情況子視窗關閉導致父視窗也關閉!下面簡單介紹一下。。
一種是常規的,java原裝類庫引起的最常見的:
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; public class ParentFrame extends JFrame implements ActionListener { private JButton jb = new JButton("顯示子視窗"); public ParentFrame() { super("父視窗"); this.add(jb); jb.addActionListener(this); this.setBounds(100, 100, 200, 300); this.setVisible(true); this.setDefaultCloseOperation(HIDE_ON_CLOSE); } @Override public void actionPerformed(ActionEvent e) { new ChildFrame(); } public static void main(String[] args) { new ParentFrame(); } } import javax.swing.JFrame; public class ChildFrame extends JFrame { public ChildFrame() { super("子視窗"); this.setBounds(200, 200, 200, 300); this.setVisible(true); this.setDefaultCloseOperation(HIDE_ON_CLOSE); } public static void main(String[] args) { new ChildFrame(); } }
這種情況是setDefaultCloseOperation()引數選擇的問題。
EXIT_ON_CLOSE做引數的時候使用的是System.exit方法退出應用程式。故會關閉所有視窗。
而HIDE_ON_CLOSE引數表示呼叫已註冊的WindowListener物件後自動隱藏窗體。
第二種是用地方放類庫jfreeChart,在做圖示的時候出現的。下面舉例
注意第二種情況,不管怎麼setDefaultCloseOperation都會全關閉,因為子視窗是繼承了ApplicationFrame即整個應用。故所有父視窗都會關閉。import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; public class ParentFrame extends JFrame implements ActionListener { private JButton jb = new JButton("顯示子視窗"); public ParentFrame() { super("父視窗"); this.add(jb); jb.addActionListener(this); this.setBounds(100, 100, 200, 300); this.setVisible(true); this.setDefaultCloseOperation(HIDE_ON_CLOSE); } @Override public void actionPerformed(ActionEvent e) { new ChildFrame(); } public static void main(String[] args) { new ParentFrame(); } } import javax.swing.JFrame; public class ChildFrame extends ApplicationFrame { public ChildFrame() { super("子視窗"); this.setBounds(200, 200, 200, 300); this.setVisible(true); this.setDefaultCloseOperation(HIDE_ON_CLOSE); } public static void main(String[] args) { new ChildFrame(); } }