我有一个问题,我之前发布过,但没有明确的解决方案
所以我发布了一个 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();
}
}
}
第二包
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 包。
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 命令作为输入,而不是像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 中实例化的帧。为什么会有这种行为??