2012-07-02 36 views
7

Tôi có một ứng dụng Java GUI mà từ đó một ứng dụng GUI Java khác được gọi bằng cách sử dụng sự phản chiếu và tải. Nó hoạt động tốt vấn đề duy nhất phải đối mặt là, khi đóng JFrame của ứng dụng được gọi, khung ứng dụng chính GUI cũng đóng. Làm thế nào tôi có thể ngăn chặn các ứng dụng chính (khung) từ đóng cửa ??Cách ngăn JFrame đóng

Tôi không thể thay đổi defaultCloseOperation của ứng dụng được gọi, Tuy nhiên, có thể thực hiện thay đổi đối với ứng dụng chính. Liệu nó có bất kỳ điều gì để làm với chủ đề?

enter image description here

Đây là mã ứng dụng của tôi mà thực hiện một mục tiêu ứng dụng

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

nhưng bạn không có quyền truy cập đối tượng JFrame? nếu có bạn chỉ có thể thiết lập 'defaultCloseOperation' –

+0

@Spaeth Tôi không có quyền truy cập defaultcloseOperation của ứng dụng được gọi như tôi đã đề cập –

+0

làm thế nào để bạn làm gì để mở cửa sổ thứ hai? bạn đã đề cập đến sự phản chiếu, bạn có thể chỉ ra chính xác cách bạn làm để mở cửa sổ thứ hai không? –

Trả lời

3

Tôi không được phép thay đổi ứng dụng đang được gọi.

Đó là một nhận xét trả lời @JeffLaJoie chỉ cần làm rõ, nó sẽ không đòi hỏi bất kỳ thay đổi mã của ứng dụng khác., Chỉ cần một phương pháp gọi thêm hoặc hai bởi ứng dụng của bạn. tại thời gian chạy để đặt hoạt động đóng của khung bên thứ 3.


Không đó, giải pháp tốt nhất mà tôi có thể nghĩ đến là bắt đầu khung mới trong một riêng biệt Process bắt đầu một JVM mới, khi người dùng đóng ứng dụng khác., Nó và JVM 2 sẽ kết thúc, trong khi rời khỏi ứng dụng gốc. trên màn hình.

6

Bạn có các tùy chọn sau đây cho defaultCloseOperation:

  • DO_NOTHING_ON_CLOSE - Cửa sổ mặc định do-không có gì gần gũi hoạt động;
  • HIDE_ON_CLOSE - Hoạt động đóng cửa sổ mặc định của cửa sổ ẩn;
  • DISPOSE_ON_CLOSE - Hoạt động đóng cửa sổ mặc định của cửa sổ dispose.
  • EXIT_ON_CLOSE - Hoạt động đóng cửa sổ mặc định của ứng dụng thoát. Cố gắng thiết lập điều này trên Windows có hỗ trợ điều này, chẳng hạn như JFrame, có thể ném một SecurityException dựa trên SecurityManager. Chúng tôi khuyên bạn chỉ nên sử dụng ứng dụng này trong một ứng dụng.

Tùy chọn DISPOSE_ON_CLOSE có thể được sử dụng để tránh đóng tất cả các cửa sổ, chỉ đóng cửa sổ bạn muốn.

Nếu bạn không có quyền truy cập trực tiếp vào đối tượng JFrame như bạn có mã được đăng lần cuối, bạn có thể sử dụng Window.getWindows() để nhận tất cả phiên bản cửa sổ (như JFrame cũng là một số Window cũng sẽ được liệt kê). Và sau đó đặt defaultCloseOperation trên đó.

Có thể bạn sẽ cần sử dụng chuỗi vì cần phải đặt defaultCloseOperation sau khi gọi phương thức chính.

Về mặt lý thuyết nó hoạt động, vì vậy tôi nghĩ rằng đây là một shot tốt;)

+0

Không có điều này không giải quyết được vấn đề của tôi Ứng dụng invoker có JFrame riêng của nó mà phải được ngăn chặn đóng trên Jframe của ứng dụng được gọi –

+1

Có thể là một trình lắng nghe cửa sổ đã đăng ký thực hiện 'System.exit' cũng ... – dacwe

11

Bạn sẽ muốn sử dụng các hoạt động DISPOSE_ON_CLOSE, vì vậy nó sẽ là setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE)

EXIT_ON_CLOSE sẽ là lựa chọn để đóng tất cả các cửa sổ mà tôi tin là những gì bạn đang trải qua.

+3

Có thể là một người nghe cửa sổ đã đăng ký thực hiện 'System.exit' cũng ... – dacwe

+0

Có quyền của bạn tất cả các cửa sổ đang đóng và lý do của bạn có vẻ đúng. Tuy nhiên, tôi không có quyền truy cập vào mã nguồn của ứng dụng được gọi do đó không thể thay đổi hoạt động đóng mặc định của nó –

+0

Nếu bạn đang gọi ứng dụng bằng cách sử dụng sự phản chiếu thì tại sao bạn không thể đặt hoạt động đóng mặc định bằng cách sử dụng sự phản chiếu trong khi bạn đang ở nó? –

Các vấn đề liên quan