一个不会消失的JFrame

时间:2016-07-05 14:02:15

标签: java swing jframe dispose

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

callMyFrame();
Frame[] frames = Frame.getFrames();
for (Frame openFrame : frames) {
    if (openFrame instanceof MyFrameType) {
        MyFrameType myFrame = (MyFrameType) openFrame;
        (do something, read the frame etc.)
        myFrame.setVisible(false);
        myFrame.dispose();
        myFrame.dispatchEvent(new WindowEvent(
                                        myFrame,
                                        WindowEvent.WINDOW_CLOSED));
       break;
    }
}

现在,问题是:当帧实际关闭时(由于某种原因, last 帧并非总是如此 - 有时它会被关闭,有时不会关闭),关闭的帧仍然是由frames数组列出,程序最终从错误的框架中读取 - 它找到的第一个MyFrameType,尽管其中只有一个实际打开。我知道getFrames()获取应用程序创建的所有框架。但是,如何排除那些处置过的帧,以便它不会只选择一个随机创建的,长期被遗忘的帧?有问题的框架显然没有所有者,因此删除无主框架不起作用。

2 个答案:

答案 0 :(得分:0)

您可以检查JFrame是否可显示,这是一个可用于验证的简单示例:

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

输出:

false

因此,在您的循环中,而不仅仅是检查JFrameinstanceof MyFrameType是否可以:

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

答案 1 :(得分:0)

您应该将数组中的帧设置为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;
        }
    }