San*_*oel 7 java user-interface swing jframe windowlistener
我有一个Java GUI应用程序,使用反射和加载从该应用程序调用另一个Java GUI应用程序.它工作正常唯一的问题是,在关闭JFrame调用的应用程序时,主GUI应用程序框架也会关闭.如何防止主应用程序(框架)关闭?
我无法更改defaultCloseOperation调用的应用程序,但是可以对主应用程序进行更改.它与线程有什么关系吗?

这是我执行目标应用程序的应用程序代码
public class ClassExecutor{
private ClassLoaderOfExtClass classLoader;
private byte[][] ArrayOfClasses;
private String[] ArrayOfBinaryNames;
@SuppressWarnings("rawtypes")
private ArrayList<Class> loadedClasses;
private ArrayList<String> loadedClasesNames;
private Object[] parameters;
@SuppressWarnings("rawtypes")
public ClassExecutor() {
classLoader = new ClassLoaderOfExtClass();
new ArrayList<Class>();
loadedClasses = new ArrayList<Class>();
loadedClasesNames = new ArrayList<String>();
}
@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<byte[]> stuffedFiles,
ArrayList<String> 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();
}
Run Code Online (Sandbox Code Playgroud)
Jef*_*oie 11
你会想要使用DISPOSE_ON_CLOSE操作,所以它会 setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE)
EXIT_ON_CLOSE将是关闭所有窗口的选项,我认为这是您目前正在经历的.
您有以下选项defaultCloseOperation:
DO_NOTHING_ON_CLOSE - 无操作默认窗口关闭操作;HIDE_ON_CLOSE - 隐藏窗口默认窗口关闭操作;DISPOSE_ON_CLOSE - dispose-window默认窗口关闭操作.EXIT_ON_CLOSE - 退出应用程序默认窗口关闭操作.尝试在支持此功能的Windows上设置此项(例如JFrame)可能会基于SecurityManager抛出SecurityException.建议您仅在应用程序中使用它.DISPOSE_ON_CLOSE可以使用选项以避免关闭所有窗口,只关闭您想要的窗口.
如果你没有到JFrame的对象直接访问你有与上次发布的代码,你可以使用Window.getWindows() ,以便接收所有窗口实例(因为JFrame是Window过于它也将被列出).然后设置defaultCloseOperation就可以了.
可能您需要使用线程,因为defaultCloseOperation需要在调用main方法后设置.
理论上它有效,所以我认为这是一个很好的镜头;)
我不允许对正在调用的应用程序进行更改。
这是回复 @JeffLaJoie 的评论,只是为了澄清,它不需要对其他应用程序的代码进行任何更改,只需您的应用程序进行一两个额外的方法调用即可。在运行时设置第3方框架的关闭操作。
如果做不到这一点,我能想到的最好的解决方案是在一个单独的框架中启动新的框架Process,启动一个新的 JVM,当用户关闭另一个应用程序时,它和第二个 JVM 将结束,同时保留原始应用程序。在屏幕上。