問題の解決策をテストしていました
この場合、JVM またはリフレクションの新しいインスタンスが役立ちますか
私が遭遇したのは、不動産ゲームなどのアプリケーションを呼び出そうとすると、このソリューションが機能しないということでした。そのため、 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 メソッドでこのスレッド インスタンスを呼び出します。しかし、解決策は機能していません。それでも、1つのフレームを閉じるとすべてのフレームが閉じるという同じ問題に直面しています。なぜそれが提案され、これを克服する方法が起こっているのですか??
次の問題を解いてください:
問題をより詳細に提示しましょう
Real Estate ゲームコードをワークスペースに追加する
次のパッケージを 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 パッケージのメインを呼び出します。これにより、RealEstate ゲームが呼び出されます。これは解決策が機能しない場所です。別の RealEstate フレームを閉じてみて、アプリケーション全体が閉じることを確認してください。