1. ホーム
  2. java

[解決済み] JavaでJPanelを使用した場合、addNotify()とrequestFocus()はどのように動作しますか?

2022-02-07 18:16:46

質問

がどのようなものなのか、はっきりしたことはわかりません。 super.addNotify()requestFocus() のメソッドは JPanel は、一般的に、特に以下のコード内で動作します。

public class Panel extends JPanel 
implements keyListener, MouseListener, MouseMotionListener {

    public Panel() {
        setPreferredSize(new Dimension(WIDTH, HEIGHT));
        setFocusable(true);
        requestFocus();
}

    public void addNotify() {
        super.addNotify();
        if (thread == null) {
            addKeyListener(this);
            addMouseListener(this);
            addMouseMotionListener(this);
            thread = new Thread(this);
            thread.start();
        }
    }

    // Some unrelated code follows

}

どなたか解説をお願いします。

どのように解決するのですか?

addNotify() が呼び出されるたびに Component に追加されます。 Container . したがって、この方法を用いれば、親情報を得るために null の親になる可能性が高いです(コンストラクタではその可能性が高い)。

requestFocus() は、与えられた Component がフォーカス状態に設定される。このメソッドでは、コンポーネントが表示可能、フォーカス可能、可視であること、そしてその祖先もすべて可視であることが要求されます。このため requestFocusInWindow() このメソッドはプラットフォームに依存しないためです。

このコード例では、あなたの JPanel は、フォーカスを当てる要求を送信します。これは便利です。 KeyLisener というように、パネルがフォーカスされた状態であることが必要です。このため addNotify() の場合、リスナーを追加するだけです。これは うまくいけば が一度だけ呼び出されることを保証するものではありません。