2010-08-09 30 views
1

我試圖創建一個子類JButton組件的,這將使或者基於條件禁用本身(這看起來像下面)的JButton更新了自己的IsEnabled值

public interface Condition { 
    public static final Condition TRUE = new Condition() { 
              public boolean test() { 
               return true; 
              } }; 
    public static final Condition FALSE = new Condition() { 
              public boolean test() { 
               return false; 
              } }; 
    public boolean test(); 
} 

然而,將JButton代碼全部基於在JButton類中私有存儲的實際布爾值。我的問題是:可以重寫JButton的哪個方法來更新其存儲的isEnabled布爾值(通過setEnabled(boolean))?它會更新(圖形)?或repaint()?或者其他一些功能?

編輯:意識到我正在嘗試創建的東西實際上是不可能的,除非您有一個單獨的線程等待短時間並強制按鈕檢查其狀態(這是嚴重的,我不想去做)。事實是,按鈕只是被動的。使用按鈕類的人可能會花費一些開銷來完成這個任務,但是在那個時候,只要在實際上正在改變的任何事物上編寫監聽器並且在那一點上切換按鈕會更容易。 Woops。

回答

1

例如,DefaultButtonModel保持stateMask,其包括用於啓用狀態的位。您可以相應地實施ButtonModel界面。

附錄:作爲替代方案,並作爲製品Key Bindings中所指出的,「的Actions另一個優點是,它們具有使能狀態,這提供了一種簡單的方法來禁用動作,而無需跟蹤哪些組件它連接到。 「有關更多信息,請參閱How to Use Actions

+0

我結束了實現ButtonModel接口。這裏的目標是在我正在處理的庫中創建一個新的按鈕類,它可以使其「isEnabled」標誌成爲條件語句,以便它自動打開和關閉。它現在正在工作,但它看起來並不正確。當文本禁用時,文本會變灰,但該按鈕仍然顯示其主圖標(即不是「禁用」圖標) – Isaac 2010-08-09 20:25:42

+0

@Isaac:我必須同意@eugener,「Action」是更簡單的方法。如果您使用'ButtonModel',則需要管理'EventListenerList'並在啓用狀態更改時執行'fireStateChanged()':http://download-llnw.oracle.com/javase/6/docs/api /javax/swing/event/EventListenerList.html – trashgod 2010-08-10 03:13:39

1

我強烈建議使用Actions來實現這樣的功能。

您應該啓用/禁用附加到您的按鈕的動作。在Swing中,同樣的動作可以與許多類型的組件相關聯,例如按鈕,菜單項等。通過禁用特定動作,您將自動禁用所有關聯的組件。

當你有相同的一組動作的工具欄,上下文菜單等,這變得非常方便。