本文介绍了真的不可能在运行时删除任何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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!