如何关闭窗口而不是JFrame

时间:2013-11-03 14:11:19

标签: java swing

不知怎的,我无法访问&关闭一个带有.dispose()的JFrame,它给我一个nullPointerException。我也不想做System.exit(0)。如何直接访问JFrame,是否有关闭JFrame的解决方法?

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

        }
    });         

}

...(进一步向下,我无法访问JFrame,给我一个nullpointerexception)

                    btnBack.setBounds(400, 270, 80, 40);
                    panel.add(btnBack);
                    btnBack.setText ("BACK");       
                    btnBack.addActionListener(new ActionListener() 
                    {
                        public void actionPerformed(ActionEvent e) 
                        {
                            //ScannerUI.DISPOSE_ON_CLOSE();
                            //frame.dispose();
                            //this.dispose();
                            //frame.setVisible(false);
                            //System.out.println ("dsakjf;dsalkhfsa;lklf");

                            //System.exit(0);
                            //JFrame test = ScannerUI.frame;
                            //test.dispose();
                            //  p = false;
                            System.out.println ("asdfasfas");

                            System.exit(frame.dispose());
                        }
                    });         

2 个答案:

答案 0 :(得分:2)

您可以使用SwingUtilities方法getWindowAncestor来帮助您获取保存按钮的窗口,然后在其上调用dispose:

btnBack.addActionListener(new ActionListener() 
{
    public void actionPerformed(ActionEvent e) 
    {
       AbstractButton button = (AbstractButton) e.getSource();
       Window window = SwingUtilities.getWindowAncestor(button);
       window.dispose();
    }
});  

另一种选择是获取当前类的封闭对象(如果它是JFrame)。您可以通过使用类名,句点,后跟此或您来从匿名内部类中获取此内容:ScannerUI.this

btnBack.addActionListener(new ActionListener() 
{
    public void actionPerformed(ActionEvent e) 
    {
       ScannerUI.this.dispose();
    }
});  

答案 1 :(得分:1)

您还可以查看Closing an Application并使用ExitAction。这是一个更通用的解决方案,可以模拟用户单击窗口上的“X”。在这种情况下,在窗口关闭之前,将首先调用已添加到框架中的任何WindowsListener。

在这种情况下可能不适用,但只需考虑一下。