На самом деле невозможно удалить в Runtime любой из 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 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();
            }
        });
    }
}

Ответ 1

По крайней мере, ваш RemTask должен быть запущен на EDT, а не какой-либо произвольный поток (используйте также invokeLater для этой задачи). Я очень сомневаюсь, что вы должны называть Windows.getWindows() вне EDT.