-2

Somehow I cannot access & close a JFrame with.dispose(), and it gives me a nullPointerException. Neither do I want to do a System.exit(0). How do I access the JFrame directly, is there a workaround to close the 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();
            }           

        }
    });         

}

... (further down, and I cannot access the JFrame already, gives me a 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());
                        }
                    });         
4

2 回答 2

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();
    }
});  
于 2013-11-03T14:40:59.467 回答
1

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

可能不适用于这种情况,但只是需要考虑的事情。

于 2013-11-03T18:30:11.900 回答