2011-06-22 62 views
1

我需要獲取JTabbedPane的一部分的JPanel組件(其中一個選項卡)的內容。從定義了JTabbedPane的類中,有一個事件偵聽器獲取當前選定的選項卡(狀態更改時)。獲取Java Swing組件的內容

下面是示例代碼:

... 
Component tab = jTabbedPane1.getSelectedComponent(); 
... 

我需要的所有組件在該選項卡。例如:

Component[] comps = tab.getComponents(); // obviously it didn't work 

我需要這個,因爲我必須根據用戶權限禁用/啓用某些按鈕。

+0

通過調用「組件[]譜曲」,您可以得到任何Container上的所有JConponents,但你必須內部迭代「組件[]譜曲」和測試「如果(譜曲[INT] instenceof JButton的,但對於正確的方式跟隨@Hovercraft Full of Eels +1對來自UserAccess/Rights的分離的GUI邏輯的建議 – mKorbel

回答

3

更好地使用你自己的類和按鈕作爲字段,然後能夠直接獲得對組件所持按鈕的引用,或者更好的是能夠與公共增變器方法進行交互,這些方法可以改變按鈕狀態爲你(你想要的信息最少暴露於外界儘可能 - 封裝您的信息),是這樣的:

// assuming the JButtons are in an array 
public void setButtonEnabled(int buttonIndex, boolean enabled) { 
    buttonArray[buttonIndex].setEnabled(enabled); 
} 

或者若將按鈕都在使用該按鈕一個HashMap相同的例子text字符串作爲鍵值:

// assuming the JButtons are in an hashmap 
public void setButtonEnabled(String buttonMapKey, boolean enabled) { 
    JButton button = buttonMap.get(buttonMapKey); 
    if (button != null) { 
     button.setEnabled(enabled); 
    } 

} 

此外,您的代碼建議您使用NetBeans創建Swing代碼。我建議您在完全理解Swing之前避免這樣做,而是使用教程來幫助您學習如何手動創建Swing,因爲這會讓您更好地理解Swing的基礎。然後,當你理解得很好時,當然可以使用代碼生成軟件來加速開發時間,只有現在你纔會知道它在表面下的作用,並且你將能夠更好地控制它。

好運!

+0

暴露'buttonIndex'或'buttonMapKey'不是很好的封裝imho。最好給面板提供信息並讓它自行排序 – Qwerky

+0

@Qwerky:不知道你的意思到底是什麼意思直到我讀到你的答案,好點!1+給你。 –

1

我會在面板中封裝這個邏輯。

如何延伸JPanel以創建一個包含按鈕的RoleAwareButtonPanel。然後,您可以傳入某種Role對象並根據需要設置面板​​啓用/禁用按鈕。

class Role { 
    private boolean canCreate; 
    private boolean canEdit; 
    //etc... 

    //getters and setters 
} 

class RoleAwareButtonPanel extends JPanel { 

    private JButton createButton; 
    private JButton editButton; 

    //other stuff you need for your panel 

    public void enableButtonsForRole(Role role) { 
    createButton.setEnabled(role.canCreate()); 
    editButton.setEnabled(role.canEdit()); 
    } 

}