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();
            }
        });
    }
}
mKorbel
  • 109,525
  • 20
  • 134
  • 319
  • @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... – mre Jun 10 '11 at 10:46
  • @mre 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 WooDoo – mKorbel Jun 10 '11 at 10:59
  • @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](http://download.oracle.com/javase/6/docs/api/java/awt/Window.html#dispose%28%29) more closely. maybe it's not doing what you expect it to do. – mre Jun 10 '11 at 11:22
  • @mre 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 that – mKorbel Jun 10 '11 at 11:42
  • @mre with same effect, every top-level component still exists, that's really joke – mKorbel Jun 10 '11 at 13:26
  • @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". :) – mre Jun 10 '11 at 13:35
  • 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. – Howard Jun 10 '11 at 14:29

1 Answers1

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.

jtahlborn
  • 52,909
  • 5
  • 76
  • 118