2015-03-30 3 views
1

У меня есть кнопка добавляется к JTabbedPane добавляют к JPanel с чем-то вроде этого:Закрыть окно (JPanel) в Java

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 

Как закрыть окно на кнопку Нажмите

ответ

5

Получить верхнее окно уровня:

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

Источник: WindowClosingAction

Смежные вопросы