Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何关闭窗口而不是JFrame_Java_Swing - Fatal编程技术网

Java 如何关闭窗口而不是JFrame

Java 如何关闭窗口而不是JFrame,java,swing,Java,Swing,不知何故,我无法使用.dispose()访问并关闭JFrame,它会给我一个nullPointerException。我也不想执行System.exit(0)。如何直接访问JFrame,是否有关闭JFrame的解决方法 public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() {

不知何故,我无法使用.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)


您可以使用SwingUtilities方法GetWindowSenator来帮助您获取包含按钮的窗口,然后对其调用dispose:

btnBack.addActionListener(new ActionListener() 
{
    public void actionPerformed(ActionEvent e) 
    {
       AbstractButton button = (AbstractButton) e.getSource();
       Window window = SwingUtilities.getWindowAncestor(button);
       window.dispose();
    }
});  
另一个选项是获取当前类的封闭对象(如果是JFrame)。您可以在匿名内部类中使用类名、句点,后跟this,或者为您:
ScannerUI。this

btnBack.addActionListener(new ActionListener() 
{
    public void actionPerformed(ActionEvent e) 
    {
       ScannerUI.this.dispose();
    }
});  
您也可以签出并使用
ExitAction
。这是一个更通用的解决方案,将模拟用户单击窗口上的“X”。在这种情况下,在关闭窗口之前,将首先调用添加到框架中的任何WindowsListener


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

为什么假设“无法直接访问JFrame”?也许最好的解决方案是编写代码,使其功能齐全。例如,为保存JFrame的类提供一个公共方法,其他类可以调用该方法来更改其包含组件的行为,例如关闭JFrame。要获得更好的帮助,请显示相关代码。也许我们可以帮你找到具体的答案。另外,也许更好的解决方案不是打开和关闭窗口,但在我们看到您的代码之前,我们只能猜测。呃,窗口和JFrame是一样的。如果需要帮助,请发布代码。并发布异常的完整堆栈跟踪。不要仅仅因为你的代码有错误就认为某些事情是不可能的或必须解决的。你发布的代码不会试图关闭框架。您还没有发布异常堆栈跟踪。请尝试假设我们不知道您在做什么:您的代码片段中没有任何内容可以告诉我们“JFrame”在哪里,没有指示发生空指针错误的位置,并且总体上您也没有告诉我们您要做什么。我们不应该一点一点地(可以这么说)把信息从你身上拖出来;描述你的问题,就好像我们是不知道你在干什么的乐于助人的人一样。同样,我们不知道你的问题是基于你迄今为止给我们的一点点信息。为了避免我们不得不不断地向您索取一些小信息而产生的共同挫败感,请给我们一个更大更完整的关于您的问题的图片。否则我们无法帮助您。+1,用于不依赖于实例变量的通用代码。我喜欢第一种方法,因为这样您就可以创建任何类都可以使用的通用操作@用户2945412,SwingUtilities还有其他有趣的方法可以查看。
btnBack.addActionListener(new ActionListener() 
{
    public void actionPerformed(ActionEvent e) 
    {
       ScannerUI.this.dispose();
    }
});