3

以前に投稿した問題がありましたが、明確な解決策がありませんでした

JFrameが閉じないようにする方法

だから私はSSCCEを投稿していますこれは直面している問題をよりよく理解するのに役立つかもしれません

package myApp;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import javax.swing.JFrame;

import App2.Applic2;

public class MYApp {

    @SuppressWarnings({ "unchecked", "rawtypes" })
    public static void main(String arg[]){
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setTitle("Application frame 1");
        f.setSize(200,200);
        f.setVisible(true);
        Class cls = Applic2.class;
        Object[] actuals = { new String[] { "" } };


        Method m = null;
        try {
            m=cls.getMethod("main", new Class[] { String[].class } );
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
            try {
                m.invoke(null,actuals);
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    }

}

2番目のパッケージ

package App2;

import javax.swing.JFrame;

public class Applic2  {

    @SuppressWarnings("unused")
    public static void main(String args[]){

        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(200,200);
        f.setVisible(true);
        f.setTitle("This needs not to be changed");
        NewFrame3 Frame3 = new  NewFrame3();
    }

}

App2パッケージの2番目のクラス。

package App2;

import javax.swing.JFrame;

public class NewFrame3 {

    public NewFrame3(){

        JFrame f = new JFrame();
            f.setTitle("f3");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setSize(200,200);
            f.setLocation(200, 200);
            f.setVisible(true);
    }

}

MYAPPインスタンスを呼び出し、そのインスタンスApplic2をさらに呼び出しますNewFrame3。'NewFrame3'のインスタンスをApplic2閉じるか、プログラム全体のインスタンスが(のためにEXIT_ON_CLOSE)ステートメントを閉じるかを確認できます。

MYAPP閉じたり、閉じApplic2たりしても閉じないソリューションが必要NewFrame3です。

APPlic2またはNewFrame3に変更を加えることができません。リフレクションを介してクラスを拡張していないときに、これらのフレームとそのフレームにアクセスEXIT_ON_CLOSEするにはDISPOSE_ON_CLOSEどうすればよいですか?setDefaultCloseOperation()JFrames

前述の別のソリューションでは、新しいJVMインスタンスを作成しApplic2、この新しいインスタンスの新しいプロセスで実行する必要がありJVMます。しかし、runtime.execがJavaコマンドを入力として受け取り、.のようなJavaステートメントを受け取らないことに気づきましたmethod.invoke()

Applic2をロードしたローダーを介してApplic2にアクセスできます。メモリ内のApplic2のクラスファイルにしかアクセスできないため、jarを使用してruntime.exec()で実行することはできません。どうすれば解決できますか?

これらのステートメントをクラスに追加するMYAppと、フレームの閉じるボタンをクリックしても何も起こらないことが保証されますが、そうではないようです。

Frame[] f2 = JFrame.getFrames();

            for(Frame fx: f2){
                System.out.println(fx.getTitle());
                fx.addWindowListener(new WindowAdapter(){
                      public void windowClosing(WindowEvent we){


                      }
                      });

このコードは、インスタンス化された最後のフレームに追加する必要があります。そうしないと、すべてのフレームが返されます。つまり、このフレームがJFrame3クラスに追加された場合、MyAppに追加された場合はすべてのインスタンス化されたフレームが返されます。MyAppのJFrameが返され、Applic2が追加された場合は、MYAppおよびApplic2でインスタンス化されたフレームが返されます。なぜこの振る舞い??

4

3 に答える 3

2

JFrame.getFrames()の配列を返すwhichを使用できますFramegetWindows()現在のアプリケーションコンテキスト内で作成されたウィンドウのはるかに低いレベルのリストにも使用できます)。

次に、各フレームをチェックして、要件を満たしているかどうかを確認する必要があります。その後、リフレクションは必要ありません。フレームに直接アクセスできます。

他のJVMと通信する唯一の方法は、ソケット通信(RMIなど)を使用することです。

例を使用して更新

Frame[] listOfFrames = JFrame.getFrames();
for (Frame : listOfFrames) {
  if (frame instanceof JFrame) {

      JFrame aFrame = (JFrame)frame;

  }
}
于 2012-07-20T05:21:42.223 に答える
1

MadProgrammer amd mKorbel が提供する助けを借りてソリューションを完成させました。更新された MYApp クラスは次のとおりです。

package myApp;

import java.awt.Frame;
import java.awt.Window;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import javax.swing.JFrame;

import App2.Applic2;

public class MYApp {

    @SuppressWarnings({ "unchecked", "rawtypes" })
    public static void main(String arg[]){
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setTitle("Application frame 1");
        f.setSize(200,200);
        f.setVisible(true);
        Class cls = Applic2.class;
        Object[] actuals = { new String[] { "" } };




        Method m = null;
        try {
            m=cls.getMethod("main", new Class[] { String[].class } );


            Method[] m1  =Frame.class.getDeclaredMethods();







        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
            try {
                m.invoke(null,actuals);
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


            Frame[] f2 = JFrame.getFrames();
            //  Window[] f23=  JFrame.getFrames();

                for(Frame fx: f2){
                    System.out.println(fx.getTitle());
                    //  fx.setVisible(false);

                      if (fx instanceof JFrame) {

                          JFrame aFrame = (JFrame)fx;
                          aFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

                      }
                    }

    }

}
于 2012-07-20T10:00:05.513 に答える
1

クロス プロセス コミュニケーションは簡単なことではありません。基本的に、対話したい各プロセスには、ServerSocket着信要求を受け入れることができる が必要です。双方向通信を実行したい場合は、各プロセスに独自の が必要ですServerSocket。これにより、どのプロセスでも通信を開始できます。

これにより、ポート番号などの問題が発生しますが、実際には、マルチキャストを実行してそれを克服することができます (基本的には、「やあみんな、私はここにいます、私に話しかけてください」)。これを使用して、誰が利用可能かどうかを判断できます例として、複数の受信者へのブロードキャストをご覧ください。

そう。準備ができたら、問題のプロセス (localhost/127.0.0.1) へのソケット接続をそのポートで開き、チャットを開始します。

今。あなたが説明したことで私が目にする問題は、これを実行するには、サーバーソケットを作成してから既存のプログラムを実行できるある種のランチャーが必要になるという事実です(あなたが持っているように)すでに説明されている)、なぜ?という疑問が生じます。これらのフレームがアプリケーションを閉じないようにすることが唯一の目標である場合は、新しい JVM でプログラムを起動するだけでその目標を達成できます。明らかに、彼らからさらに多くの情報が必要な場合、それはすべてのハードワークに対する合理的な言い訳です.

さて、朗報です。ソケット間でオブジェクトをシリアル化できます (つまり、ソケット接続を介して Java オブジェクトを送信できます) 。詳細については、Discover the secret of the Java Serialization APIを確認してください。

それでも怖くない場合は、All About Socketsで詳細を確認してください。

そして最後に、新しい JVM を「どのように」実行するかという大きな問題です。Java ProcessBuilderを確認してください。実際に、新しい JVM を実行する方法について説明しています!!

于 2012-07-20T05:49:16.043 に答える