2012-05-05 56 views
1

我正在開發一個Wicket應用程序。但我的問題並不真正與Wicket相關。在那個應用程序中,我有一個水平菜單。該菜單由少量鏈接創建。點擊鏈接後,你將被導航到某個頁面。現在基於您正在查看的菜單鏈接的css class屬性將被更改爲「selected」。這是對問題的描述。switch語句的替代方法

現在我正在通過使用整數值解決此問題。該值保存在會話中,並且在任何一個鏈接被點擊時更新。根據保存的值,哪個鏈接將被「選擇」,將在運行時確定。

我在下面的方式實現這一點:

//On link click I set a number in session 

public void onClick() { 
    session.setValue(1);// or 2 or 3 
} 

當菜單創建我的價值之間切換,修改CSS類,如下所示:

switch(session.getValue){ 
    case 1: add css to home; 
    case 2: add css to profile; 
    // and so on. 
} 

我想知道這是這是唯一正確的方法嗎?或者還有其他更好的技術或設計模式可以幫助我以更好的方式實現這一目標?

回答

4

存儲在數組中的菜單項(或一個ArrayList):

items[0] = home 
items[1] = profile 

並使用數組作爲菜單標識符的索引。當您收到所選菜單itentifier,與

items[selectedItem] 

獲取相應的項目,您還可以使用地圖,如果標識符不是數字,或者不從0到N.

2

首先,使用enum或靜態常量而不是幻數(1,2,3)。

0

我一直在使用EnumMap的和一個枚舉類型作爲其關鍵實現它。我已經定義了一個枚舉:

public enum NavigationStatus { 
    HOME, 
    PROFILE; 
} 

在會議上,我設置了當前導航爲一體的值:

private NavigationStatus activeUserNavigationStatus; 

public NavigationStatus getActiveUserNavigationStatus() { 
    return activeUserNavigationStatus; 
} 

public void setActiveUserNavigationStatus(NavigationStatus activeUserNavigationStatus) { 
    this.activeUserNavigationStatus = activeUserNavigationStatus; 
} 

主要是我將它設置爲:setActiveUserNavigationStatus(NavigationStatus.HOME);

現在在菜單正在建設我創建一個EnumMap:

EnumMap<NavigationStatus, Component[]> menuMap = new EnumMap<NavigationStatus, Component[]>(NavigationStatus.class); 

並添加到它的元素,如:

menuMap.put(NavigationStatus.HOME, new Component[] { homeContainer, home }); 

而且還上的鏈接點擊的方法我設置的狀態值:

public void onClick() { 
    session.setActiveUserNavigationStatus(NavigationStatus.PROFILE); 
} 

最後都是我從會話檢查當前值,並相應設置CSS類:

Component[] menuComponents = menuMap.get(getSession().getActiveUserNavigationStatus()); 
menuComponents[0].add(new AttributeAppender("class", new Model<Serializable>(" active"))); 
menuComponents[1].add(new AttributeAppender("class", new Model<Serializable>(" active"))); 

這是沒有switch語句,並結合JB Nizet's ArrayList索引和Oli Charlesworth's枚舉的想法。

謝謝。