2011-12-19 27 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覆蓋預先設置的文本。