我遇到以下情况:我的程序反复调用使得带有文本的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()
获取应用程序创建的所有框架。但是,如何排除那些处置过的帧,以便它不会只选择一个随机创建的,长期被遗忘的帧?有问题的框架显然没有所有者,因此删除无主框架不起作用。
答案 0 :(得分:0)
您可以检查JFrame
是否可显示,这是一个可用于验证的简单示例:
JFrame jFrame = new JFrame();
jFrame.setVisible(true);
jFrame.dispose();
System.out.println(jFrame.isDisplayable());
输出:
false
因此,在您的循环中,而不仅仅是检查JFrame
是instanceof
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;
}
}