【发布时间】:2012-07-20 18:00:05
【问题描述】:
我之前发布过一个问题,但没有明确的解决方案
How to prevent JFrame from closing.
所以我发布一个 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 当我们没有扩展类JFrames 时,我们如何访问这些框架及其setDefaultCloseOperation()?
在提到的另一个解决方案中,应该创建一个新的JVM 实例,并且应该在这个新的JVM 实例上的新进程中执行Applic2。但后来我遇到了 runtime.exec 将 Java 命令作为输入,而不是像 method.invoke() 这样的 Java 语句。
我可以通过加载 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 中实例化的帧。为什么会有这种行为??
【问题讨论】:
标签: java reflection jvm jframe classloader