我有一个问题,我之前发布过,但没有得到明确的解决方案
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
当我们没有扩展类时,我们如何访问这些框架及其 setDefaultCloseOperation()
JFrame
?
在提到的另一个解决方案中,应该创建一个新的 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 中实例化的框架。为什么会出现这种行为??
最佳答案
您可以使用 JFrame.getFrames()
返回一个 Frame
数组(您也可以使用 getWindows()
以获得更低的级别在当前应用程序上下文中创建的那些窗口的列表)。
然后,您需要遍历,检查每一帧以查看它是否符合您的要求。在那之后,您不需要反射,您可以直接访问框架
与其他 JVM 通信的唯一方法是通过套接字通信(例如 RMI)。
更新示例
Frame[] listOfFrames = JFrame.getFrames();
for (Frame : listOfFrames) {
if (frame instanceof JFrame) {
JFrame aFrame = (JFrame)frame;
}
}
关于java - 在这种情况下,新的 JVM 实例或反射会有帮助吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11573259/