真的不可能在运行时删除任何JDialog或JWindow

正如我所尝试的那样,看起来那是不可能的,没有成功,因为我尝试过,或者存在另一种方式?

import java.awt.*; import java.awt.event.WindowEvent; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.*; public class SuperConstructor extends JFrame { private static final long serialVersionUID = 1L; private int i = 1; private boolean runProcess; private int top = 20; private int left = 20; public SuperConstructor() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setPreferredSize(new Dimension(300, 300)); setTitle("Super constructor"); setLocation(150, 150); pack(); setVisible(true); Point loc = this.getLocation(); top += loc.x; left += loc.y; runProcess = true; Thread th = new Thread(new AddTask()); th.setDaemon(false); th.setPriority(Thread.MIN_PRIORITY); th.start(); } private class AddTask implements Runnable { @Override public void run() { while (runProcess) { for (int j = 0; j < 6; j++) { if (j % 2 == 0) { EventQueue.invokeLater(new Runnable() { @Override public void run() { SecondDialog secondDialog = new SecondDialog(); } }); } else { EventQueue.invokeLater(new Runnable() { @Override public void run() { FirstDialog firstDialog = new FirstDialog(); } }); } Window[] wins = Window.getWindows(); for (int i = 0; i < wins.length; i++) { if (wins[i] instanceof JFrame) { System.out.print("JFrame"); } else if (wins[i] instanceof JDialog) { System.out.print(", JDialog"); } else if (wins[i] instanceof JWindow) { System.out.print(", JWindow"); } } System.out.println(" "); try { Thread.sleep(1000); } catch (InterruptedException ex) { Logger.getLogger(SuperConstructor.class.getName()).log(Level.SEVERE, null, ex); } } try { Thread.sleep(1000); } catch (InterruptedException ex) { Logger.getLogger(SuperConstructor.class.getName()).log(Level.SEVERE, null, ex); } runProcess = false; } remWins(); } } public void remWins() { runProcess = true; Thread th = new Thread(new RemTask()); th.setDaemon(false); th.setPriority(Thread.MIN_PRIORITY); th.start(); } private class RemTask implements Runnable { @Override public void run() { while (runProcess) { Window[] wins = Window.getWindows(); for (int i = 0; i < wins.length; i++) { if (wins[i] instanceof JFrame) { System.out.print("JFrame"); } else if (wins[i] instanceof JDialog) { System.out.print(", Remove JDialog"); wins[i].setVisible(false); wins[i].dispose(); WindowEvent windowClosing = new WindowEvent(wins[i], WindowEvent.WINDOW_CLOSING); wins[i].dispatchEvent(windowClosing); Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(windowClosing); Runtime runtime = Runtime.getRuntime(); runtime.gc(); runtime.runFinalization(); } else if (wins[i] instanceof JWindow) { System.out.print(", Remove JWindow"); wins[i].setVisible(false); wins[i].dispose(); WindowEvent windowClosing = new WindowEvent(wins[i], WindowEvent.WINDOW_CLOSING); wins[i].dispatchEvent(windowClosing); Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(windowClosing); Runtime runtime = Runtime.getRuntime(); runtime.gc(); runtime.runFinalization(); } try { Thread.sleep(1000); } catch (InterruptedException ex) { Logger.getLogger(SuperConstructor.class.getName()).log(Level.SEVERE, null, ex); } } System.out.println(" Remove Done "); Runtime.getRuntime().runFinalization(); Runtime.getRuntime().gc(); System.out.println(" Checking if still exists any of TopLayoutContainers "); Window[] wins1 = Window.getWindows(); for (int i = 0; i < wins1.length; i++) { if (wins1[i] instanceof JFrame) { System.out.print("JFrame"); wins1[i].setVisible(true); } else if (wins1[i] instanceof JDialog) { System.out.print(", JDialog"); wins1[i].setVisible(true); } else if (wins1[i] instanceof JWindow) { System.out.print(", JWindow"); wins1[i].setVisible(true); } } System.out.println(" "); System.out.println(" No Idea, That's it "); runProcess = false; } } } private class FirstDialog extends JWindow { private static final long serialVersionUID = 1L; FirstDialog(final Frame parent) { super(parent); Point loc = parent.getLocation(); setLocation(top, left); top += 20; left += 20; setPreferredSize(new Dimension(200, 200)); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); setVisible(true); } private FirstDialog() { setLocation(top, left); top += 20; left += 20; setPreferredSize(new Dimension(200, 200)); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); setVisible(true); } } private class SecondDialog extends JDialog { private static final long serialVersionUID = 1L; SecondDialog(final Frame parent) { super(parent, "SecondDialog " + (i++)); setLocation(top, left); top += 20; left += 20; setPreferredSize(new Dimension(200, 200)); setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); setModalityType(Dialog.ModalityType.MODELESS); pack(); setVisible(true); } private SecondDialog() { setTitle("SecondDialog " + (i++)); setLocation(top, left); top += 20; left += 20; setPreferredSize(new Dimension(200, 200)); setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); setModalityType(Dialog.ModalityType.MODELESS); pack(); setVisible(true); } } public static void main(String args[]) { EventQueue.invokeLater(new Runnable() { @Override public void run() { SuperConstructor superConstructor = new SuperConstructor(); } }); } } 

至少,你的RemTask应该在EDT上运行,而不是一些任意的线程(对于那个任务也使用invokeLater)。 我非常怀疑你应该在EDT之外调用Windows.getWindows()