2

私はいくつかの奇妙なレガシーコードを扱っています。それらには、JPanelを実装するカスタムオブジェクトがあります。このJPanelオブジェクトは、メインアプリケーション内のセカンダリポップアップ画面です。私が抱えている問題は、セカンダリポップアップ画面が閉じられたことを検出することです。

WindowListenerクラスにを実装しようとしましたが、追加しようとすると、JFrameこのオブジェクトに関連付けられていません。これは、カスタムオブジェクトを使用していて、埋め込まれたポップアップ画面であるためだと思います。

私は使用して取得しようとしましたJFrame

JFrame parentFrame = (JFrame) SwingUtilities.getWindowAncestor(this);

これはで失敗しますNullPointerException。このページの右隅の「x」閉じるボタンを検出するのがなぜそれほど難しいのかわかりません。に埋め込まれているテーブルにマウスリスナーとキーリスナーを追加できたことに言及する必要がありますJPanel。しかし、ウィンドウ全体の外部リスナーが問題を引き起こしています。

(ご容赦ください。これは私の最初のstackoverflow投稿であり、Swingは初めてです。)

どうもありがとうございました!

4

3 に答える 3

5

その奇妙なパネルに対してgetParent()を呼び出してみてください。親GUIコンポーネントを返す必要があります。これがまだフレームではなく、代わりに中間パネルである場合は、getParent()も呼び出します。トップレベルのコンポーネントはnullを返します。

   Component p = strangePanel;
   while ( p != null && ! (p instanceof Window))
     p = p.getParent();

   ((Window) p ).addWindowListener(..);
于 2013-01-18T06:20:33.273 に答える
0

次の場所で「NullPointerException」が発生する理由を理解できません。

JFrame parentFrame = (JFrame) SwingUtilities.getWindowAncestor(this);

2つの場合、これが発生する可能性があります。

JFrame parentFrame = (JFrame) SwingUtilities.getWindowAncestor(null);

あなたの場合、これをパラメータとして使用しているため、これは不可能です。

次に、上記のコード行で次のような他の操作を行っていますか?

JFrame parentFrame = ((JFrame) SwingUtilities.getWindowAncestor(this)).someOperation();

この場合、このオブジェクトがトップウィンドウを表すと、トップの親の祖先が「null」として返されるため、「NullPointerException」が発生することになります。その他の場合は、この例外が発生する可能性があります。

例外が発生している場所にコードのブロックを投稿できますか?

于 2013-01-18T06:44:40.393 に答える
0

この答えのために、私はあなたが言及した行でNullpointerがスローされているのではなく、むしろWindowListenerをparentFrameに追加しようとしたときにスローされているとマイナーな仮定をしています。これは、電話をかけていることが原因である可能性が最も高いです

JFrame parentFrame = (JFrame) SwingUtilities.getWindowAncestor(this);

JPanelがJFrame階層に追加される前。

これを回避する方法の大まかなコードサンプルを次に示します。パネルが階層内のどこかでJFrameに接続されたことが通知されるのを待つと考えました。

package test;

import java.awt.event.HierarchyEvent;
import java.awt.event.HierarchyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class HierarchyTest extends JPanel {

    protected static void loadApp() {
        HierarchyTest test = new HierarchyTest();
        JFrame frame = new JFrame();
        frame.add(test);
        frame.setSize(200, 200);
        frame.setVisible(true);
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                loadApp();

            }
        });

    }

    public HierarchyTest() {
        this.addHierarchyListener(new HierarchyListener() {

            @Override
            public void hierarchyChanged(HierarchyEvent e) {
                // This can be optimized by checking the right flags, but I leave that up to you to look into
                boolean connected = setupListenersWhenConnected();

                if (connected) {
                    HierarchyTest.this.removeHierarchyListener(this);
                }
            }
        });
    }

    protected boolean setupListenersWhenConnected() {
        JFrame parentFrame = (JFrame) SwingUtilities.getWindowAncestor(this);
        if (parentFrame == null) {
            return false;
        }
        parentFrame.addWindowListener(new WindowAdapter() {

            @Override
            public void windowClosing(WindowEvent e) {
                // Implementation here
                System.out.println("This window is closing!");
            }
        });
        return true;
    }
}
于 2013-01-18T08:42:41.123 に答える