2011-12-19 47 views
5

这一直困扰着我一段时间。如果我定义setAction之前一个JButton 定义setText,文字消失:Java - JButton文本消失,如果actionPerformed后来定义

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!

为什么会发生这种情况?

+0

感谢伙计们,全是+1。 7分钟去。 – Ben 2011-12-19 07:28:29

回答

7

documentation描述:

设置操作的结果立即改变Swing组件支持行动中描述的所有属性 。

这些属性被描述为here,并且包括文本。

+0

西部最快的枪...还有文件。 – Ben 2011-12-19 07:36:38

+0

“如有疑问 - 请查阅文档”... – MByD 2011-12-19 07:39:15

1

看一看

private void setTextFromAction(Action a, boolean propertyChange) 
在AbstractButton中

。你可以看到它基于action来调用setText()。

看起来你可以拨打setHideActionText(true);来解决你的问题。

+0

http://docs.oracle.com/javase/7/docs/api/javax/swing/Action.html#buttonActions 我在设置动作之前调用setHideActionText(true),但它不起作用,文本是仍然是空的。为了解决这个问题,我简单地将文本保存在一个临时变量中,并在设置完动作后将其设置回来......不是很花哨,但它可以工作。任何建议编写更好的代码是值得欢迎的。 – 2012-07-02 12:34:27

1

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

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覆盖预先设置的文本。