用Button关闭JFrame

时间:2016-04-20 09:41:31

标签: java eclipse jframe jpanel

我目前正在使用Eclipse的拖放功能,我有一个默认情况下附带JFrame的应用程序窗口,能够setVisible(false);但是我用JPanel和扩展的JFrame创建的其他框架/面板/窗口。

由于extend我无法setVisible(false or true);它在窗口上完全没有效果,它仍然是真的。

我的代码:

private JPanel contentPane;

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

public LibrarianMenu() {
    setTitle("Librarian");
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    setBounds(100, 100, 385, 230);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);
    .
    .
    . so on

我试图执行我的按钮:

 btnLogout.addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    LibrarianMenu frame = new LibrarianMenu();
                    frame.setVisible(false);
                }
            });

任何解决方案吗?

2 个答案:

答案 0 :(得分:3)

因为您在Runnable中创建了框架,所以它的范围仅限于runnable的范围。尝试在runnable之外声明变量,然后在runnable中初始化它,如下所示:

private JPanel contentPane;
private LibrarianMenu frame;
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();
            }
        }
    });
}

然后setvisible为false而不声明LibrarianMenu的新实例:

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

答案 1 :(得分:2)

这种情况正在发生,因为每次按下按钮都会创建该框架的新实例。这是您的代码更新:

static LibrarianMenu frame ;
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();
            }
        }
    });
}

注销按钮事件应该是这样的:

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