2010-08-17 43 views
0

我想在運行時將一系列Swing動作加載到容器中,並像Enum一樣通過常量名稱訪問它們。這樣做的目的是既限制動作,也提高可讀性。AbstractActions的Enumset包裝

最初,我正在考慮一種動態枚舉(請參閱http://blog.xebia.com/2009/04/02/dynamic-enums-in-java/),但正如Java飲者指出的那樣,這是不必要的,因爲操作保持不變。

理想情況下,我想要做的是一種包含AbstractAction實例的包裝,它可以啓用/禁用,並且能夠通過符號名稱引用每個動作。

編輯:問題已重新配置。

+0

但是,這不是可能的行動限制?至少適用於應用程序的任何特定版本?你有沒有標準的靜態枚舉,所有可能的動作,並且在運行時你有一個允許的動作的子集(在Java中的EnumSet)。然後你可以檢查這個,看看你能不能。我想我不知道你的問題的全部範圍,但... – 2010-08-17 20:17:45

+0

你的「Swing行動」究竟是什麼?菜單項目等面向用戶? – 2010-08-17 20:22:19

+0

@Java Drinker:是的,這組動作本質上是靜態的。最理想的是Enum充當Action實例的包裝,爲每個Action賦予一個符號名稱並根據給定的用戶加載或啓用它們。我想要做的事情可能是不必要的,我會用Enumset解決問題。考慮到這一點,我將重新闡述我的問題。 – 2010-08-17 20:33:10

回答

2

你可以做這樣的事情:

public enum Actions { 
    COPY(new AbstractAction() { 
     public void actionPerformed(ActionEvent e) { 
      //do something 
     } 
    }), 
    PASTE(new PasteAction()); 

    public final AbstractAction action; 
    private Actions(AbstractAction action) { 
     this.action = action; 
    } 

} 

//... 
Actions.COPY.action...; 

然後如其他人所說,用枚舉在一個EnumSet或EnumMap的結合。就我個人而言,我沒有看到它有一個巨大的價值,只是有幾個沒有枚舉的命名字段。

我想你真正想要的是某種操作註冊表是這樣的:

public class ActionsManager { 
    private final Map<String, Action> actions; 
    private final Map<User, Set<String>> enabledActions; 
    public Action get(String id); 
    public void register(String id, Action action); 
    public void deregister(String id); 
    public boolean isEnabled(User user, Action action); 
} 

實現留作練習。

+2

從我所瞭解的問題中,我同意這一點。如果你已經在處理Action對象,那麼枚舉是多餘的。Mark提出的ActionsManager是一條可行的路線。 – 2010-08-17 21:02:25

+0

謝謝馬克!一個動作註冊表是一個好主意。我會看看有什麼可能的,並在稍後的日期發佈回來:) – 2010-08-17 21:04:05