7

リフレクションとロードを使用して別の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();
        }
4

3 に答える 3

11

DISPOSE_ON_CLOSE 操作を使用する必要があるため、次のようになります。setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE)

EXIT_ON_CLOSE は、現在発生していると思われるすべてのウィンドウを閉じるオプションです。

于 2012-07-02T20:31:11.487 に答える
6

には次のオプションがありますdefaultCloseOperation

  • DO_NOTHING_ON_CLOSE- 何もしないデフォルトのウィンドウ クローズ操作。
  • HIDE_ON_CLOSE- 非表示ウィンドウのデフォルト ウィンドウ クローズ操作。
  • DISPOSE_ON_CLOSE- dispose-window デフォルト ウィンドウ クローズ操作。
  • EXIT_ON_CLOSE- アプリケーションの既定のウィンドウを閉じる操作を終了します。これをサポートする Windows (JFrame など) でこれを設定しようとすると、SecurityManager に基づいて SecurityException がスローされる場合があります。これはアプリケーションでのみ使用することをお勧めします。

OptionDISPOSE_ON_CLOSEを使用すると、すべてのウィンドウを閉じずに、必要なウィンドウだけを閉じることができます。

最後に投稿されたコードのように JFrame オブジェクトに直接アクセスできない場合は、すべてのウィンドウ インスタンスを受け取るためにWindow.getWindows()JFrameを使用できます (これもリストされWindowます)。そして、そのdefaultCloseOperation上に設定します。

defaultCloseOperationメインメソッドを呼び出した後に設定する必要があるため、おそらくスレッドを使用する必要があります。

理論的にはうまくいくので、これは良いショットだと思います;)

于 2012-07-02T20:29:38.383 に答える
3

起動中のアプリケーションを変更することはできません。

これは、明確にするために @JeffLaJoie に返信したコメントでした。他のアプリのコードを変更する必要はありませんアプリによる追加のメソッド呼び出しが 1 つまたは 2 つだけです。実行時にサードパーティ フレームのクローズ操作を設定します。


それができない場合、私が考えることができる最善の解決策はProcess、ユーザーが他のアプリを閉じると、新しいJVMを開始する別のフレームで新しいフレームを開始することです。元のアプリを残しながら、それと2番目のJVMが終了します。画面上で。

于 2012-07-03T07:21:15.997 に答える