如何防止JFrame关闭

我有一个Java GUI应用程序,使用reflection和加载从中调用另一个Java GUI应用程序。 它工作正常唯一的问题是,在关闭调用的应用程序的JFrame ,主GUI应用程序框架也会关闭。 如何防止主应用程序(框架)关闭?

我无法更改调用的应用程序的defaultCloseOperation ,但是可以对主应用程序进行更改。 它与线程有什么关系吗?

在此处输入图像描述

这是我执行目标应用程序的应用程序代码

 public class ClassExecutor{ private ClassLoaderOfExtClass classLoader; private byte[][] ArrayOfClasses; private String[] ArrayOfBinaryNames; @SuppressWarnings("rawtypes") private ArrayList loadedClasses; private ArrayList loadedClasesNames; private Object[] parameters; @SuppressWarnings("rawtypes") public ClassExecutor() { classLoader = new ClassLoaderOfExtClass(); new ArrayList(); loadedClasses = new ArrayList(); loadedClasesNames = new ArrayList(); } @SuppressWarnings("unchecked") public void execute(File[] file, String[] binaryPaths) { Object[] actuals = { new String[] { "" } }; Method m = null; try { Field classesx=ClassLoaderOfExtClass.class.getDeclaredField("classes"); classesx.setAccessible(true); } catch (SecurityException e1) { e1.printStackTrace(); } catch (NoSuchFieldException e1) { e1.printStackTrace(); } /*for (int i = 0; i < file.length; i++) { for (int j = 0; j < file.length; j++) { try { @SuppressWarnings("rawtypes") Class c = classLoader.loadClassCustom(file[i], binaryPaths[i]); //Fied classex=classLoader.getResource("classes"); }catch(Exception e){ } } } Class[]classesxx= getLoadedClasses(classLoader); System.out.println("Loaded classes have size "+ classesxx.length);*/ for (int i = 0; i < file.length; i++) { try { @SuppressWarnings("rawtypes") Class c = classLoader.loadClassCustom(file[i], binaryPaths[i]); try { if (c.getMethod("main", new Class[] { String[].class }) != null) { m = c.getMethod("main", new Class[] { String[].class }); } else { System.out.println("This class does not contain main"); continue; } } catch (NoSuchMethodException e) { // System.out.println("Main not found!!!"); // System.out.println("M here"); // e.printStackTrace(); // not printing stack trace } catch (SecurityException e) { e.printStackTrace(); } } catch (ClassNotFoundException e) { System.out.println("No such class definition exist!!"); // TODO Auto-generated catch block // e.printStackTrace(); } } try { m.invoke(null, actuals); // CallStack.print(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @SuppressWarnings({ "unchecked", "rawtypes" }) public void execute(ArrayList stuffedFiles, ArrayList binaryPaths) { convertToArray(stuffedFiles, binaryPaths); loadAllClasses(ArrayOfClasses, ArrayOfBinaryNames); Object[] actuals = { new String[] { "" } }; Method m = null; /* * Method[] m1= new Method[10]; for (Class c : loadedClasses) { * m1=c.getMethods(); } for(Method m2: m1){ * System.out.println(m2.getName()); } */ /* System.out.println(loadedClasses.size()); */ for (Class c : loadedClasses) { /* * System.out.println(c.toString()); * System.out.println(c.getConstructors()); */ // for (int i = 1; i < file.size(); i++) { /* * for(Method meth : c.getMethods()){ meth.setAccessible(true); * * } */ try { if (c.getMethod("main", new Class[] { String[].class }) != null) { m = c.getMethod("main", new Class[] { String[].class }); break; } else { // System.out.println("This class does not contain main"); continue; } } catch (NoSuchMethodException e) { System.out.println("Program does not contain main"); } catch (SecurityException e) { e.printStackTrace(); } } try { if(parameters==null){ m.invoke(null, actuals); } else{ try { System.out.println("It Fails Here"); m.invoke(null, parameters); } catch (Exception e) { System.out.println("Illegal arguments"); } } // CallStack.print(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } 

我不允许对正在调用的应用程序进行更改。

这是回复@JeffLaJoie的评论只是为了澄清,它不需要对其他应用程序的代码进行任何更改。只需要一个额外的方法调用或两个应用程序。 在运行时设置第三方框架的关闭操作。


如果做不到这一点,我能想到的最佳解决方案是在一个单独的Process中启动新框架,当用户关闭另一个应用程序时启动新的JVM,它和第二个JVM将结束,同时保留原始应用程序。 在屏幕上。

您将要使用DISPOSE_ON_CLOSE操作,因此它将是setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE)

EXIT_ON_CLOSE将是关闭所有窗口的选项,我认为这是您目前正在经历的。

defaultCloseOperation有以下选项:

  • DO_NOTHING_ON_CLOSE – 无操作默认窗口关闭操作;
  • HIDE_ON_CLOSE – 隐藏窗口默认窗口关闭操作;
  • DISPOSE_ON_CLOSE – 配置窗口默认窗口关闭操作。
  • EXIT_ON_CLOSE – 退出应用程序默认窗口关闭操作。 尝试在支持此function的Windows上设置此项(例如JFrame)可能会基于SecurityManager抛出SecurityException。 建议您仅在应用程序中使用它。

可以使用选项DISPOSE_ON_CLOSE以避免关闭所有窗口,只关闭所需的窗口。

如果您没有像上次发布的代码那样直接访问JFrame对象,则可以使用Window.getWindows()来接收所有窗口实例(因为JFrame也是一个Window它也将被列出)。 然后在其上设置defaultCloseOperation

可能你需要使用线程,因为在调用main方法之后需要设置defaultCloseOperation

理论上它有效,所以我认为这是一个很好的镜头;)