Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.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中的windows?_Java_Swing_Dispose - Fatal编程技术网

如何摆脱;“死亡”;Java中的windows?

如何摆脱;“死亡”;Java中的windows?,java,swing,dispose,Java,Swing,Dispose,我正在使用一些遗留代码。在执行过程中,该代码创建多个窗口并对其进行处理。但是,它们仍然是可访问的,即调用java.awt.Window.getWindows()返回大量java.awt.Window、javax.swing.JFrame、javax.swing.JDialog等,所有这些名称都以“dead-”开头。这现在越来越成为一个问题 下面是我的问题:我是否正确,名称的“dead-”前缀是由系统创建的? 如何正确处理旧窗口,使其不再可访问,并由java.awt.Window.getWindo

我正在使用一些遗留代码。在执行过程中,该代码创建多个窗口并对其进行处理。但是,它们仍然是可访问的,即调用
java.awt.Window.getWindows()
返回大量
java.awt.Window
javax.swing.JFrame
javax.swing.JDialog
等,所有这些名称都以“dead-”开头。这现在越来越成为一个问题

下面是我的问题:我是否正确,名称的“dead-”前缀是由系统创建的?
如何正确处理旧窗口,使其不再可访问,并由
java.awt.Window.getWindows()返回?非常感谢

我在项目中发现了以下代码:

private void disposeWindow(final java.awt.Window window) {
    SwingEnvironment.runOnEventDispatchingThread(new Runnable() {
        @Override
        public void run() {
            window.dispose();
            window.setVisible(false);
            window.removeNotify();

            String oldName = window.getName();
            if (oldName == null) {
                oldName = "unnamed";
            }

            if (!oldName.startsWith("dead-")) {
                window.setName("dead-" + oldName);
            }
        }
    });
}
这就是为什么这些窗口被命名为“死-”的原因


但是,它们被正确地处理,仍然显示在由
java.awt.Window.getWindows()返回的Windows数组中。为了摆脱它们,我必须创建一个单独的
ThreadGroup
,并通过
SunToolkit.createNewAppContext()创建一个单独的
AppContext
。在我的例子中,处理AppContext也正确地处理了窗口。另请参见。

您能否提供一段代码,显示遗留代码当前如何创建/处置windows。顶级容器不进行GC'ed,那么所有容器都可以访问,直到当前JVM存在,结果应该是重用合理数量的容器(减少到一次可在屏幕上看到的最大容器数量)这些容器并不是死的,只有从isDisplayable返回false的容器才有可访问的all JOptionPanes,但是通过从其父级JDialogSee强制转换,也可以看到这个相关的。