Is really not possible remove on Runtime any of JDialog or JWindow [closed]
Asked Answered
O

1

1

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();
            }
        });
    }
}
Osprey answered 10/6, 2011 at 10:36 Comment(7)
@mKorbel, what do you mean by "remove"? I see that you're attempting to dispose of the top-level components, but you still hold references to them in an array...Pinta
@Pinta can you be more concrete 1) are you meaning reset Array to null, 2) checking for exists of the top-level components on separate void/class 3) another WooDooOsprey
@mKorbel, I think holding references to those objects in the array makes them ineligible for garbage collection. also, you should read the specifications of dispose more closely. maybe it's not doing what you expect it to do.Pinta
@Pinta well ineligible for gc, then here my knowlegde ends, because I don't "able" get Class from top-level component comings and remove Object by this reference..., thanks for your time, I'll look for thatOsprey
@Pinta with same effect, every top-level component still exists, that's really jokeOsprey
@mKorbel, well...the problem, I believe, is that you're still holding references to the disposed components. I think the API makes it clear that all the resources are released, but the component is capable of being rebuilt through a simple invocation of pack or show on the disposed component. I'm sure that if you nullify the reference, then the components will be garbage collected and essentially "removed". :)Pinta
As already mentioned in the comments: there still exist references when you call your last gc run. In method RemTask.run() you initialize an array of windows named wins which you do not unreference (it is still valid until the end of the method). Just add a line wins = null; right before System.out.println(" Remove Done "); and all unnecessary references will be gone and gc does indeed release your windows.Ful
L
3

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.

Laky answered 10/6, 2011 at 11:42 Comment(2)
nothing changed, thanks for good ideaOsprey
for only reall post to the topic +1Osprey

© 2022 - 2024 — McMap. All rights reserved.