我有一个按钮添加到JTabbedPane添加到JPanel与这样的事情:

JTabbedPane tabbedPane = new JTabbedPane();
JButton btnClose = new JButton("Close");
JComponent panel.add(btnClose);
tabbedPane.addTab("Test", panel);

我想在按钮按下时关闭窗口。 我尝试这样做:

btnClose.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                panel.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));
            }
        });

但这给了我

 Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: null source

我如何在按下按钮时关闭窗口

#1楼 票数:9 已采纳

获取顶层窗口:

public void actionPerformed(ActionEvent e) {
  JComponent comp = (JComponent) e.getSource();
  Window win = SwingUtilities.getWindowAncestor(comp);
  win.dispose();
}

确保已将JFrame的默认关闭操作设置为JFrame.DISPOSE_ON_CLOSE (首选)或JFrame.EXIT_ON_CLOSE (首选)。

如果有可能会从JMenuItem调用此方法,那么除非您首先测试组件的父级是JPopupMenu还是JToolBar,否则它将不起作用。 如果是这样,那么您应该使用更健壮的解决方案,例如可以在java-swing-tips上找到 ,特别是以下代码:

class ExitAction extends AbstractAction {
    public ExitAction() {
        super("Exit");
    }
    @Override public void actionPerformed(ActionEvent e) {
        JComponent c = (JComponent) e.getSource();
        Window window = null;
        Container parent = c.getParent();
        if (parent instanceof JPopupMenu) {
            JPopupMenu popup = (JPopupMenu) parent;
            JComponent invoker = (JComponent) popup.getInvoker();
            window = SwingUtilities.getWindowAncestor(invoker);
        } else if (parent instanceof JToolBar) {
            JToolBar toolbar = (JToolBar) parent;
            if (((BasicToolBarUI) toolbar.getUI()).isFloating()) {
                window = SwingUtilities.getWindowAncestor(toolbar).getOwner();
            } else {
                window = SwingUtilities.getWindowAncestor(toolbar);
            }
        } else {
            Component invoker = c.getParent();
            window = SwingUtilities.getWindowAncestor(invoker);
        }
        if (window != null) {
            //window.dispose();
            window.dispatchEvent(new WindowEvent(window, WindowEvent.WINDOW_CLOSING));
        }
    }
}

来源: WindowClosingAction

  ask by Raj translate from so

未解决问题?本站智能推荐:

1回复

从JFrame关闭JPanel窗口[Java]

因此,我想用JPanel制作一个菜单屏幕,并使它起作用,但是当我按“开始”按钮时,它不会关闭菜单窗口,而只是创建一个新窗口,我该怎么做,保持它在同一窗口上,而无需关闭/打开菜单窗口,或者当我按下开始按钮时,我想关闭菜单窗口并打开游戏窗口(JPanel)。 这是MainClass.java
1回复

如何关闭Jpanel窗口?

我想要做的是使用 Java 图形运行模拟,并且我正在循环一堆 jpanels。 一旦在模拟中满足条件,我希望该特定 jpanel 关闭。 但是,我不知道该怎么做。 目前我已经尝试使用 System.exit(0) 但我希望其他 jpanels 继续运行。 下面是我的 Pong 类代码和我使用的条件。
1回复

如何在Java中关闭Jpanel程序

我正在制作Java游戏,我需要一些有关如何做某事的建议。 目前,我正在使用2个不同的.java文件来制作游戏。 我有一个扩展JFrame的主程序,我调用了另一个扩展JPanel的.java文件。 该游戏当前可以运行,但是我想为游戏创建其他模式,我认为如果为它创建另一个文件会更好。
1回复

Java:如何在Jpanel中访问父JFrame的方法[关闭]

关闭。 这个问题需要更加集中。 它目前不接受答案。 想改善这个问题吗? 更新问题,使其仅通过编辑这篇文章来
3回复

Java中的JPanel问题

美好的一天! 我在重置JPANEL的内容时遇到问题。 是否可以删除JPANEL的所有内容? 我正在做一个Hangman游戏。 而且我需要初始化我的面板以让自己进入下一个级别。 我的面板是使用Netbeans GUI创建的,并且所有内容都是固定的(包括位置和大小)。 我的样本代码
2回复

Java中的JPanels的JPanel

我正在尝试用Java开发JPanels的Jpanel,外部JPanel具有Layout FlowLayout.LEFT,内部JPanels具有Layout FlowLayout.LEADING我向内部jpanels添加了标签,应将其作为列和行的标签添加到外部面板但这不起作用将标签作为一行添加到外
1回复

Java无法将JPanel内JPanel内的JPanel内的JTextField视为JScrollPane中的视口

我不得不承认,也许这个问题看起来很奇怪,但是我将在这里解释: 我有一个JScrollPane,在其中我正确添加了一个JPanel,可以说,现在JScrollPane变量是“ JSP”,而JPanel是“ JP” 在我的JP中,我有一个JPanel的ArrayList(简称为AJP),它可
2回复

Java限制窗口/Jpanel的切换

我有3个JPanel JFrame (基本上是三个选项卡)。 面板之一具有文本框。 文本框上有值限制。 这意味着,用户只能输入1-1000号。 如果他输入的数字> 1000,则会引发警告消息。 现在,我正在使用focuslistener来保存输入的数字,以免失去焦点。 但是,如