如何关闭多个JFrame和JDialog窗口?

时间:2015-01-18 10:24:30

标签: java swing jframe jdialog

我正在开发一个包含多个JFrameJDialog窗口的程序。

我有一个包含按钮的JFrame,当我点击这个按钮时,会打开一个JDialog窗口。在这个JDialog窗口中有另一个按钮,单击它时会打开第二个JDialog窗口。在第二个JDialog窗口中,我有一个最后一个按钮。

我想要做的是在点击最后一个按钮时关闭JDialog窗口和JFrame窗口。

这是开盘订单的方式:

JFrame Frame1;
JButton Button1;

JDialog Dialog1;
JButton Button2;

JDialog Dialog2;
JButton Button3;

Button1ActionPerformed(ActionEvent e){
   new Dialog(Frame1Frame);
}

Button2ActionPerformed(ActionEvent e){
    new Dialog2(Dialog1Frame)
}

Button3ActionPerformed(ActionEvent e){
   //Here I wnat to add the code that closes JDialog2 JDialog1 and JFrame1 windows.
}

我尝试了super.dispose();,但它没有用。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

可能有更好的方法可以做到这一点,但这是一种可能有用的一般方法。

在您的代码中,您可以创建窗口,但不会将对创建的窗口的引用存储到变量中。例如,您有:

JDialog Dialog1;

然后,当您创建Dialog1的实例时,您有以下代码:

Button1ActionPerformed(ActionEvent e){
    new Dialog(Frame1Frame);
}

这意味着您已经创建了Dialog,但是您没有保留对Dialog的引用,以便稍后通过代码进行操作。如果您在此处指定此值,则应该可以稍后对其进行操作。

如果您将实施更改为:

Button1ActionPerformed(ActionEvent e){
    Dialog1 = new Dialog(Frame1Frame);
}

然后在您的代码中,您将有一个对话框的引用,以便操作它,

Button3ActionPerformed(ActionEvent e){
   Dialog1.dispose();
   // you can manipulate the variables of the class from here and close other windows etc.
}

答案 1 :(得分:1)

如果你有对象参考,你可以这样做:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;


public class Main
{
    private static JFrame frame;

    private static JButton buttonFrame;


    private static JDialog dialog1;

    private static JButton buttonDialog1;


    private static JDialog dialog2;

    private static JButton buttonDialog2;


    public static void main(String[] args) {

        /* frame */

        frame = new JFrame("Main Frame");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 400);
        frame.setLocationRelativeTo(null);

        buttonFrame = new JButton("open dialog 1");
        buttonFrame.addActionListener(new ActionListener() {
            @Override public void actionPerformed(ActionEvent e) {
                dialog1.setVisible(true);
            }
        });

        frame.add(buttonFrame);

        /* dialog 1 */

        dialog1 = new JDialog(frame, "Dialog 1");
        dialog1.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        dialog1.setSize(300, 300);
        dialog1.setLocationRelativeTo(null);

        buttonDialog1 = new JButton("open dialog 2");
        buttonDialog1.addActionListener(new ActionListener() {
            @Override public void actionPerformed(ActionEvent e) {
                dialog2.setVisible(true);
            }
        });

        dialog1.add(buttonDialog1);

        /* dialog 2 */

        dialog2 = new JDialog(dialog1, "Dialog 2");
        dialog2.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        dialog2.setSize(200, 200);
        dialog2.setLocationRelativeTo(null);

        buttonDialog2 = new JButton("close all");
        buttonDialog2.addActionListener(new ActionListener() {
            @Override public void actionPerformed(ActionEvent e) {
                dialog2.dispose();
                dialog1.dispose();
                frame.dispose();
            }
        });

        dialog2.add(buttonDialog2);

        /* show frame */

        frame.setVisible(true);
    }
}

否则您可以使用System.exit(0);

buttonDialog2.addActionListener(new ActionListener() {
    @Override public void actionPerformed(ActionEvent e) {
        System.exit(0);
    }
});

答案 2 :(得分:1)

使用here显示Action,您的actionPerformed()实施可以将WINDOW_CLOSING事件发送到所需的Window个实例。

@Override
public void actionPerformed(ActionEvent e) {
    d1.dispatchEvent(new WindowEvent(d1, WindowEvent.WINDOW_CLOSING));
    d2.dispatchEvent(new WindowEvent(d2, WindowEvent.WINDOW_CLOSING));
    f1.dispatchEvent(new WindowEvent(f1, WindowEvent.WINDOW_CLOSING));
}