Java中的关闭窗口(JPanel)

我有一个添加到JTabbedPane的Button添加到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 

如何关闭按钮上的窗口按

获取顶级窗口:

 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调用它,那么除非你首先测试comp的父级是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)); } } } 

source: WindowClosingAction