Java - 如果之后定义了actionPerformed,则JButton文本将消失

时间:2011-12-19 07:20:28

标签: java swing text action jbutton

这一直困扰着我。如果我在定义setText之前在JButton 上定义setAction,则文本会消失:

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

如果在之后,则没有问题。

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构造函数中设置文本,那很好! Yarghh!

为什么会这样?

5 个答案:

答案 0 :(得分:7)

documentation

中所述
  

设置Action会立即更改所有属性   在Swing组件支持行动中描述。

这些属性描述为here,并包含文字。

答案 1 :(得分:1)

看看

  private void setTextFromAction(Action a, boolean propertyChange)
在AbstractButton中。你可以看到它根据动作调用setText()。

您似乎可以致电setHideActionText(true);来解决问题。

答案 2 :(得分:1)

这是因为Action也有控件的名称。由于您未在Action中设置任何名称,因此将其设置为空字符串。

答案 3 :(得分:0)

1)Listeners将所有事件都放到了EDT,

2)所有事件都是waiting in EDT,输出到屏幕将在一瞬间完成

3)您必须将其拆分为Action

内的两个单独的Listener

答案 4 :(得分:0)

如果您只想处理此事件,则不需要Action。您可以添加ActionListener

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

调用setAction会覆盖预先设置的文字。