San*_*oel -2 java reflection swing jframe
我正在测试问题的解决方案
我遇到的是,如果我尝试调用诸如房地产游戏之类的应用程序,则此解决方案不起作用.因此,在调用main之后只需添加以下代码即可 Applic2
Frame[] f2 = JFrame.getFrames();
for(Frame fx: f2){
if (fx instanceof JFrame) {
JFrame aFrame = (JFrame)fx;
aFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个异步线程,不断将操作JFrame.EXIT_ON_CLOSE更改为JFrame.DISPOSE_ON_CLOSE,如下所示
import java.awt.Frame;
import javax.swing.JFrame;
public class FrameMonitor extends Thread{
@Override
public void run(){
while(true){
Frame[] f2 = JFrame.getFrames();
for(Frame fx : f2){
if(fx instanceof JFrame){
JFrame aframe =(JFrame)fx;
aframe.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
并通过MyApp类中的start方法调用此线程实例.但解决方案无效.我仍然面临关闭一帧时所有帧关闭的相同问题.为什么会发生任何建议以及如何克服这个?
请仔细检查以下问题:
让我更详细地介绍这个问题
将房地产游戏代码添加到工作区
将以下包添加到RealEstate代码中
package MyApplication;
import java.awt.Frame;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import javax.swing.JFrame;
import edu.ncsu.realestate.gui.Main;
public class MYApp {
@SuppressWarnings({ "unchecked", "rawtypes" })
public static void main(String arg[]){
FrameMonitor monitor = new FrameMonitor();
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(200,200);
f.setVisible(true);
Class cls = Main.class;
Object[] actuals = { new String[] {} };
// cls.
Method[] mts=cls.getMethods();
for(Method m : mts){
//System.out.println(m);
}
Method m = null;
try {
m=cls.getMethod("main", new Class[] { String[].class } );
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
m.invoke(null,actuals);
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Frame[] f2 = JFrame.getFrames();
for(Frame fx: f2){
System.out.println(fx.getTitle());
// fx.setVisible(false);
if (fx instanceof JFrame) {
// System.out.println("M here");
// System.out.println(fx.getTitle());
System.out.println(fx.getName());
JFrame aFrame = (JFrame)fx;
aFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
}
}
}
package MyApplication;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.Timer;
public class FrameMonitor{
public FrameMonitor(){
Timer timer = new Timer(10000, new FrameMonitor2());
timer.setCoalesce(true);
timer.setRepeats(true);
timer.start();
}
public static class FrameMonitor2 implements ActionListener {
@Override
public void actionPerformed(ActionEvent ae) {
Frame[] frames = Frame.getFrames();
for (Frame frame : frames) {
if (frame instanceof JFrame) {
JFrame change = (JFrame) frame;
System.out.println("Before = " + change.getTitle() + " = " + change.getDefaultCloseOperation());
((JFrame)frame).setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
System.out.println("After = " + change.getTitle() + " = " + change.getDefaultCloseOperation());
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在调用MyApplication包的主要内容,并调用RealEstate游戏.这是解决方案不起作用的地方,尝试关闭不同的RealEstate框架并查看整个应用程序关闭.
我快速检查了房地产游戏的代码,发现你的问题MainWindow.java:
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
Run Code Online (Sandbox Code Playgroud)
如果你仍然希望窗户关闭,我不确定你能从外面做什么.