我正在测试问题的解决方案
我遇到的是,如果我尝试调用Real Estate game等应用程序,此解决方案将不起作用。因此,在调用 main 之后,只需添加以下代码 Applic2
Frame[] f2 = JFrame.getFrames();
for(Frame fx: f2){
if (fx instanceof JFrame) {
JFrame aFrame = (JFrame)fx;
aFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
}
我创建了一个异步线程,不断将动作 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);
}
}
}
}
}
并通过 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());
}
}
}
}
}
现在调用 MyApplication 包的 main,然后调用 RealEstate 游戏。这是解决方案不起作用的地方,尝试关闭不同的 RealEstate 框架并查看整个应用程序关闭。