在这种情况下,新的 JVM 实例或反射会有所帮助吗?

2023-12-09

我之前发布过一个问题,但没有得到明确的解决方案

如何防止JFrame关闭.

所以我发布了 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 or NewFrame3.

我无法对 APPlic2 或 NewFrame3 进行任何更改。通过反思如果我们尝试转向EXIT_ON_CLOSE to 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 中实例化的框架。为什么会有这种行为?


你可以使用JFrame.getFrames()它返回一个数组Frame(你也可以getWindows()有关在当前应用程序上下文中创建的窗口的低级别列表)。

然后,您需要遍历并检查每个框架,看看它是否满足您的要求。之后,您不需要反射,您可以直接访问框架

与其他 JVM 通信的唯一方法是通过套接字通信(例如 RMI)。

更新示例

Frame[] listOfFrames = JFrame.getFrames();
for (Frame : listOfFrames) {
  if (frame instanceof JFrame) {

      JFrame aFrame = (JFrame)frame;

  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在这种情况下,新的 JVM 实例或反射会有所帮助吗? 的相关文章

随机推荐