Java 用按钮关闭JFrame

Java 用按钮关闭JFrame,java,eclipse,jframe,jpanel,Java,Eclipse,Jframe,Jpanel,我目前正在使用Eclipse的拖放功能,我有一个应用程序窗口,默认情况下它附带JFrame,并且能够setVisible(false)但是我用JPanel和扩展JFrame创建的其他框架/面板/窗口 由于extend的原因,我无法设置可见(false或true)它对窗口没有任何影响,但仍然为真 我的代码: private JPanel contentPane; /** * Launch the application. */ public static void main(String[]

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

由于
extend
的原因,我无法
设置可见(false或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);
                }
            });

有什么解决办法吗

因为您是在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,而不声明LibraryMenu的新实例:

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

因为您正在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,而不声明LibraryMenu的新实例:

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

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

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);
            }
        });

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

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);
            }
        });

请发布一个可编译的示例,因为您的代码中甚至没有类定义。无论哪种方法,您都需要在调用
setVisible(false)
的同一引用上调用
setVisible(true)
,而不是在引用新创建对象的引用上。不要在onClick中创建Library菜单,在主类中将其创建为字段,然后使用setVisible to false。单击按钮时,您正在另一个菜单中创建,因此第一个菜单将保持不变。
SwingUtilities.windowForComponent(btnLogout).setVisible(false)
?请发布一个可编译的示例,因为您的代码中甚至没有类定义。无论哪种方法,您都需要在调用
setVisible(false)
的同一引用上调用
setVisible(true)
,而不是在引用新创建对象的引用上。不要在onClick中创建Library菜单,在主类中将其创建为字段,然后使用setVisible to false。当点击按钮时,您正在创建另一个菜单,因此第一个菜单仍然存在。
SwingUtilities.windowForComponent(btnLogout)。setVisible(false)
?@nix
static
是一种“看起来”不错的解决方案,但它会让您成为一个黑暗的盟友,毫无意义地打败您并偷走您的钱包,一切都井然有序,最好是avoided@nix
static
是一种“看起来”不错的解决方案,但它会把你引向一个黑暗的盟友,把你打得毫无知觉,偷走你的钱包,一切都井然有序,最好是这样avoided@nix如果这解决了您的问题,请将答案标记为正确。谢谢:)@nix如果这解决了您的问题,请将答案标记为正确。谢谢:)