以前に投稿した問題がありましたが、明確な解決策がありませんでした
だから私はSSCCEを投稿していますこれは直面している問題をよりよく理解するのに役立つかもしれません
package myApp;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import javax.swing.JFrame;
import App2.Applic2;
public class MYApp {
@SuppressWarnings({ "unchecked", "rawtypes" })
public static void main(String arg[]){
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setTitle("Application frame 1");
f.setSize(200,200);
f.setVisible(true);
Class cls = Applic2.class;
Object[] actuals = { new String[] { "" } };
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();
}
}
}
2番目のパッケージ
package App2;
import javax.swing.JFrame;
public class Applic2 {
@SuppressWarnings("unused")
public static void main(String args[]){
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(200,200);
f.setVisible(true);
f.setTitle("This needs not to be changed");
NewFrame3 Frame3 = new NewFrame3();
}
}
App2パッケージの2番目のクラス。
package App2;
import javax.swing.JFrame;
public class NewFrame3 {
public NewFrame3(){
JFrame f = new JFrame();
f.setTitle("f3");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(200,200);
f.setLocation(200, 200);
f.setVisible(true);
}
}
MYAPP
インスタンスを呼び出し、そのインスタンスApplic2
をさらに呼び出しますNewFrame3
。'NewFrame3'のインスタンスをApplic2
閉じるか、プログラム全体のインスタンスが(のためにEXIT_ON_CLOSE
)ステートメントを閉じるかを確認できます。
MYAPP
閉じたり、閉じApplic2
たりしても閉じないソリューションが必要NewFrame3
です。
APPlic2またはNewFrame3に変更を加えることができません。リフレクションを介してクラスを拡張していないときに、これらのフレームとそのフレームにアクセスEXIT_ON_CLOSE
するにはDISPOSE_ON_CLOSE
どうすればよいですか?setDefaultCloseOperation()
JFrames
前述の別のソリューションでは、新しいJVM
インスタンスを作成しApplic2
、この新しいインスタンスの新しいプロセスで実行する必要がありJVM
ます。しかし、runtime.execがJavaコマンドを入力として受け取り、.のようなJavaステートメントを受け取らないことに気づきましたmethod.invoke()
。
Applic2をロードしたローダーを介してApplic2にアクセスできます。メモリ内のApplic2のクラスファイルにしかアクセスできないため、jarを使用してruntime.exec()で実行することはできません。どうすれば解決できますか?
これらのステートメントをクラスに追加するMYApp
と、フレームの閉じるボタンをクリックしても何も起こらないことが保証されますが、そうではないようです。
Frame[] f2 = JFrame.getFrames();
for(Frame fx: f2){
System.out.println(fx.getTitle());
fx.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent we){
}
});
このコードは、インスタンス化された最後のフレームに追加する必要があります。そうしないと、すべてのフレームが返されます。つまり、このフレームがJFrame3クラスに追加された場合、MyAppに追加された場合はすべてのインスタンス化されたフレームが返されます。MyAppのJFrameが返され、Applic2が追加された場合は、MYAppおよびApplic2でインスタンス化されたフレームが返されます。なぜこの振る舞い??