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();
}
});
}
}
pack
orshow
on the disposed component. I'm sure that if you nullify the reference, then the components will be garbage collected and essentially "removed". :) – PintaRemTask.run()
you initialize an array of windows namedwins
which you do not unreference (it is still valid until the end of the method). Just add a linewins = null;
right beforeSystem.out.println(" Remove Done ");
and all unnecessary references will be gone and gc does indeed release your windows. – Ful