6

いくつかのsとsを含むCardDetailsPanelクラスがあります。このクラスはに含まれ、次のように初期化されます。JLabelJTextFieldAddCardsPanel

    cardDetailsPanel = new CardDetailsPanel(true);
    add(cardDetailsPanel, java.awt.BorderLayout.CENTER);

説明書もJLabel入っています。CardDetailsPanel最初に表示されたとき、およびフォーカスがそれぞれに変更されたときに、このラベルを更新したいと思いますJTextFieldaddFocusListener()私は後でうまくいく方法を見つけました。ただし、私のcompenentShown()方法は前者では機能しません。

    addComponentListener(new java.awt.event.ComponentAdapter() {
        public void componentShown(java.awt.event.ComponentEvent evt) {
            formComponentShown(evt);
        }
    });

(わかりました。これは醜いです。NetBeansによって生成されました。)

private void formComponentShown(java.awt.event.ComponentEvent evt) {
    this.frame = (BaseballFrame) this.getParent().getParent().getParent().getParent().getParent().getParent();
}

(ええ、これはさらに醜いです。連鎖getParent()呼び出しについては後で扱います。ここでも他のことをしたいと思います。)

では、なぜリスナーが呼び出されないのですか?CardDetailsPanelまた、画面に表示されるたびにいくつかのアクションを実行するリスナーを作成するにはどうすればよいですか?

4

1 に答える 1

8

ダイアログフォーカスAncestorListenerで説明されているようにを使用します。

JDialog(またはそのJFrameことについては)が表示されると、デフォルトで最初のフォーカス可能なコンポーネントにフォーカスが置かれます。この動作を変更したい場合があります。明らかな解決策は、requestFocusInWindow()フォーカスを取得したいコンポーネントでメソッドを呼び出すことです。問題は、これが常に機能するとは限らないことです。

..。

問題は、「実現された」ダイアログに追加されていない限り、コンポーネントがフォーカスを要求できないことです。JDialog実現されたダイアログは、基本的に、基盤となるOS上のダイアログを表すピアコンポーネントにSwingが追加されたことを意味します。pack()これは、でまたはsetVisible(true)メソッドを呼び出すときに発生しますJDialog

そして、それは祖先のリスナーが役に立つところです。モーダルダイアログのコンポーネントの場合、コンポーネントが表示されると起動され、実現されてフォーカス可能になります。

編集: 上記のコメントは、JFrameやを含むすべてのSwingコンテナのコンポーネントに適用されますJPanel

于 2012-09-10T18:33:05.157 に答える