1. 程式人生 > >JAVA中子視窗關閉,父視窗也關閉的問題

JAVA中子視窗關閉,父視窗也關閉的問題

<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,在做圖示的時候出現的。下面舉例
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();
    }
 
}
注意第二種情況,不管怎麼setDefaultCloseOperation都會全關閉,因為子視窗是繼承了ApplicationFrame即整個應用。故所有父視窗都會關閉。