2012-07-02 43 views
7

Tengo una aplicación de GUI de Java desde la que se invoca otra aplicación de GUI de Java mediante reflexión y carga. Funciona bien, el único problema al que se enfrenta es que, al cerrar el JFrame de la aplicación invocada, también se cierra el marco de la aplicación Main GUI. ¿Cómo puedo evitar que se cierre la aplicación principal (marco)?Cómo evitar que JFrame se cierre

No puedo cambiar el defaultCloseOperation de la aplicación invocada. Sin embargo, se puede realizar un cambio en la aplicación principal. ¿Tiene algo que ver con los hilos?

enter image description here

Esta es mi código de aplicaciones que ejecuta una aplicación de destino

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(); 
     } 
+0

pero no tiene acceso al objeto JFrame? en caso afirmativo, puede configurar 'defaultCloseOperation' –

+0

@Spaeth. No tengo acceso a la operación de cierre predeterminado de la aplicación invocada, como mencioné –

+0

, ¿cómo se hace para abrir la segunda ventana? mencionó la reflexión, ¿podría mostrar exactamente cómo lo hace para abrir la segunda ventana? –

Respuesta

3

No tengo permiso para realizar cambios en la aplicación que se invoca.

Eso fue un comentario en respuesta a @JeffLaJoie sólo para aclarar, que no requeriría ningún cambios en el código de la otra aplicación., Sólo una llamada a un método adicional o dos por su aplicación. en tiempo de ejecución para establecer la operación de cierre del marco de terceros.


De no ser así, la mejor solución que se me ocurre es empezar el nuevo marco en una separada Process que se inicia una nueva JVM, cuando el usuario cierra la otra aplicación., Y el segundo JVM va a terminar, mientras salía de la aplicación original. en la pantalla.

6

Tiene las siguientes opciones para el defaultCloseOperation:

  • DO_NOTHING_ON_CLOSE - La ventana por defecto de no hacer nada cerca operación;
  • HIDE_ON_CLOSE - La ventana predeterminada de la ventana oculta funciona;
  • DISPOSE_ON_CLOSE - La operación de ventana predeterminada de la ventana de disposición final.
  • EXIT_ON_CLOSE - Operación de cierre de la ventana predeterminada de la aplicación de salida. Intentar configurar esto en Windows que lo admite, como JFrame, puede arrojar una SecurityException basada en el SecurityManager. Se recomienda que solo use esto en una aplicación.

La opción DISPOSE_ON_CLOSE se puede utilizar para evitar cerrar todas las ventanas, cerrando solo la que desea.

Si usted no tiene acceso directo al objeto JFrame como que tiene con el último código publicado, se puede usar Window.getWindows() el fin de recibir todas las instancias de Windows (como JFrame es una Window también aparecerá en la lista también). Y luego configure el defaultCloseOperation en eso.

Posiblemente necesitará usar subprocesos porque el defaultCloseOperation debe configurarse después del método principal de invocación.

En teoría funciona, así que creo que esto es un disparo;)

+0

No, esto no resuelve mi problema La aplicación invocador tiene su propio JFrame que debe evitarse al cerrarse al cerrar Jframe de la aplicación invocada –

+1

Podría ser un escucha de ventana registrado que también haga 'System.exit' ... – dacwe

11

Usted querrá utilizar la operación DISPOSE_ON_CLOSE, por lo que sería setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE)

EXIT_ON_CLOSE sería la opción que se cierra todas las ventanas que creo que es lo que estás experimentando actualmente.

+3

Podría ser un Oyente de la ventana registrada que hace 'System.exit' también ... – dacwe

+0

Sí, su derecho todas las ventanas se están cerrando y su razón parece ser correcta. Sin embargo, no tengo acceso al código fuente de la aplicación invocada, por lo tanto, no puedo cambiar su operación de cierre predeterminada. –

+0

Si está invocando la aplicación usando reflexión, ¿por qué no puede establecer la operación de cierre predeterminada usando reflexión mientras está en ¿eso? –

Cuestiones relacionadas