Java - 後でactionPerformedを定義するとJButtonのテキストが消えます

これはしばらく私を悩ませています。 setAction を定義する JButtonに setText を定義すると、そのテキストは消えます。

JButton test = new JButton();
test.setText("test"); //Before - disappears!
test.setAction(new AbstractAction() {
    public void actionPerformed(ActionEvent e) {
       //do something
    }
});
this.add(test);

after の場合は問題ありません。

JButton test = new JButton();
test.setAction(new AbstractAction() {
    public void actionPerformed(ActionEvent e) {
       //do something
    }
});
test.setText("test"); //After - no problem!
this.add(test);

さらに、JButtonコンストラクタにテキストを設定しても、それは問題ありません。ヤルハ!

なぜこれが起こるのですか?

5
ありがとうございました、+ 1周间。行く7分。
追加された 著者 Ben,

5 答え

ドキュメント

アクションを設定すると、すぐにすべてのプロパティが変更されます   アクションをサポートするSwing Componentsで説明されています。

これらのプロパティは、ここで説明されており、テキストも含まれています。

7
追加された
西部では最速の銃で、ドキュメンテーションもあります。
追加された 著者 Ben,
"疑問があるときは、ドキュメントを参照してください" ...
追加された 著者 MByD,

これは、Actionにもコントロールの名前が付いているためです。アクションに名前を設定していないので、空の文字列に設定されています。

1
追加された

見て

  private void setTextFromAction(Action a, boolean propertyChange)

AbstractButtonのアクションに基づいてsetText()を呼び出しているのがわかります。

あなたの問題を整理するために setHideActionText(true); を呼び出すことができるようです。

1
追加された
docs.oracle.com/javase/7/ docs/api/javax/swing /… アクションを設定する前にsetHideActionText(true)を呼び出していますが、動作していないため、テキストはまだ空です。これを解決するために、私は単にテンポラリ変数にテキストを保存し、アクションを設定した後にそれを設定しました。より良いコードを書くための提案は大歓迎です。
追加された 著者 Christophe Roussy,

1)リスナーは、すべてのイベントをEDTに置き、

2)すべてのイベントは、 EDTで待機し、画面に出力します一瞬で済む

3) you have to split that to the two separate Action inside Listener

0
追加された
質問とは無関係の-1ランダム弾
追加された 著者 kleopatra,

イベントだけを処理したい場合は、 Action は必要ありません。 ActionListener を追加できます:

JButton test = new JButton();
test.setText("test");  
test.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
       //do something
    }
});
this.add(test);

setAction を呼び出すと、あらかじめ設定されたテキストが上書きされます。

0
追加された