如何关闭jframe面板或窗口

时间:2016-04-20 13:03:23

标签: java eclipse jframe

我有2个框架/窗口,我在窗口2上有一个退出按钮,从窗口1我启动窗口2然后退出它,即setVisible(false);

当我执行窗口2时,我可以轻松地单击按钮退出并隐藏当前窗口,但是当我从窗口1启动窗口2,然后单击退出按钮时,我得到NullPointerException错误。然后我在静态开始实例化它并且这个错误消失了,但是窗口2没有被关闭/隐藏它仍然存在而没有按钮效果。

窗口1代码:

package com.my.jlms;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class LibrarianMenu extends JFrame {

private JPanel contentPane;
private static LibrarianMenu frame;


/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                frame = new LibrarianMenu();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the frame.
 */
public LibrarianMenu() {
    setTitle("Librarian");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 385, 230);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);

    JButton btnPasswd = new JButton("Change Pass");
    btnPasswd.setBounds(202, 76, 146, 39);
    contentPane.add(btnPasswd);


    btnPasswd.addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    ChangePwd framee = new ChangePwd();
                    framee.setVisible(true);
                }
            });

}

}

Window 2代码:

package com.my.jlms;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

import javax.swing.JButton;

public class ChangePwd extends JFrame {

private JPanel contentPane;
private static ChangePwd frame = new ChangePwd();;

private JButton btnExit;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                frame = new ChangePwd();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the frame.
 */
public ChangePwd() {
    setResizable(false);
    setTitle("Password!");
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    setBounds(100, 100, 266, 154);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);

    btnExit = new JButton("Exit");
    btnExit.setBounds(20, 80, 89, 30);
    contentPane.add(btnExit);


    btnExit.addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent ae) {
                    frame.setVisible(false);
                }
            });
}

}

是否有解决方案我可以将窗口2设置为隐藏?

3 个答案:

答案 0 :(得分:1)

这里的问题是你创建的框架,作为你的类,而不是对象frame,但你隐藏了代表对象frame的框架。

更改此行(在actionListener的actionPerformed()方法中):

frame.setVisible(false);

为:

setVisible(false);

答案 1 :(得分:0)

您可以使用dispose功能。see how dispose works.

答案 2 :(得分:0)

如果要关闭JFrame,可以使用dispose()方法。

示例:

public void actionPerformer(ActionEvent e)
{ 
  if(e.getSource().equals(closeFrameButton)
     {
        dispose();  //This will close the current JFrame
      }
}

注意:这与System.exit(0);不同。使用它将关闭Java虚拟机。如果您只想关闭相框,请使用dispose()