本文介绍了真的不可能在运行时删除任何JDialog或JWindow的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

就像我尝试过的那样,看起来像是不可能的,就像我尝试过的那样没有成功,还是存在另一种方式?

as I tried, looks like as that isn't possible, without success as I tried, or exist there another way?

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().

At the very least, your RemTask should be running on the EDT, not some arbitrary thread (use invokeLater for that task as well). I very much doubt you should be calling Windows.getWindows() outside of the EDT either.

这篇关于真的不可能在运行时删除任何JDialog或JWindow的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

06-12 15:47