Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.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 赢得';不要消失_Java_Swing_Jframe_Dispose - Fatal编程技术网

Java 赢得';不要消失

Java 赢得';不要消失,java,swing,jframe,dispose,Java,Swing,Jframe,Dispose,我遇到了以下情况:我的程序反复调用一些东西,使带有文本的JFrame出现。我从那个框架里读课文。框架有一个特殊的类型,我们称之为MyFrameType,因此我通过类型识别它,并在每次调用结束时处理框架,以所有可能的方式关闭我知道的框架。。。(以下代码在循环中) 现在,问题是:当帧实际关闭时(由于某种原因,最后一帧并不总是如此-有时关闭,有时不关闭),关闭的帧仍然由帧数组列出,程序最终从错误的帧读取-它找到的第一个MyFrameType帧,虽然只有一个是真正开放的。我知道getFrames()获取

我遇到了以下情况:我的程序反复调用一些东西,使带有文本的JFrame出现。我从那个框架里读课文。框架有一个特殊的类型,我们称之为MyFrameType,因此我通过类型识别它,并在每次调用结束时处理框架,以所有可能的方式关闭我知道的框架。。。(以下代码在循环中)


现在,问题是:当帧实际关闭时(由于某种原因,最后一帧并不总是如此-有时关闭,有时不关闭),关闭的帧仍然由帧数组列出,程序最终从错误的帧读取-它找到的第一个MyFrameType帧,虽然只有一个是真正开放的。我知道
getFrames()
获取应用程序创建的所有帧。但我如何排除这些已处理的帧,以便它不只是拾取一个以前创建的、早已忘记的随机帧?所讨论的框架显然没有所有者,因此删除无所有者的框架不起作用

您只需检查
JFrame
是否可显示,下面是一个简单的示例,可用于验证:

 JFrame jFrame = new JFrame();
 jFrame.setVisible(true);
 jFrame.dispose();
 System.out.println(jFrame.isDisplayable());
输出:

false
因此,在循环中,您可以执行以下操作,而不只是检查
JFrame
是否为
实例:

for (Frame openFrame : frames) {
    if (openFrame instanceof MyFrameType && openFrame.isDisplayable()) {
    }
}

您应该将数组中的帧设置为null,或者以其他方式指示它已被“删除”。此外,要做到这一点,您需要使用标准for循环,而不是增强的for循环,如下所示:

    Frame[] frames = Frame.getFrames();
    for(int i=0; i<frames.length; i++) {
        if (frames[i] instanceof MyFrameType) {
            (do something, read the frame etc.)
            frames[i].setVisible(false);
            frames[i].dispose();
            frames[i].dispatchEvent(new WindowEvent(
                    frames[i],
                    WindowEvent.WINDOW_CLOSED));
            frames[i] = null;
           break;
        }
    }
Frame[]frames=Frame.getFrames();

对于(int i=0;i当你处理你的帧时,你是否也应该将其从
frames
数组中删除以避免再次访问它?该描述使该应用程序听起来像是一个可怕的体验。在这种情况下,该帧可能应该是一个对话框,而不是有许多对话框,只有1个,保留对它的引用,然后在需要的时候显示它。由
callMyFrame()
调用的程序不是我的,所以我不能对它做任何更改,它必须有许多帧(在每个循环中都有这些帧)。“所以我不能对它做任何更改。”…你熟悉“继承”和“重写”这两个术语吗?顺便说一句-类名
MyFrameType
,其中包含
My
,而不是一个有用的名称,这表明它要么是由你编写的,要么是另一个新手编写的。如果它是由你编写的,那么你可以更改它。如果它是由另一个新手编写的,那么你就不应该使用它。新手糟糕的代码,通常不适合人类观看,更不用说分发给其他新手了。因此,请给我涂上“不相信”的颜色,这是我在之前的评论中引用的。还有一个提示:提示:添加@OleV.V.(或者任何人,
@
很重要)通知此人新的评论。这很有帮助。看到了
isDisplayable
方法,但不确定其功能。
    Frame[] frames = Frame.getFrames();
    for(int i=0; i<frames.length; i++) {
        if (frames[i] instanceof MyFrameType) {
            (do something, read the frame etc.)
            frames[i].setVisible(false);
            frames[i].dispose();
            frames[i].dispatchEvent(new WindowEvent(
                    frames[i],
                    WindowEvent.WINDOW_CLOSED));
            frames[i] = null;
           break;
        }
    }