2011-04-10 82 views
2

我有一個JComboBox中填充了一些隨機項目,可以在運行時更改。我已經使用getListCellRendererComponent(...)將它們設置爲JLabels。我也設置了一些Jlabel爲setEnabled(false)。檢測選定的JComboBox項目是啓用還是禁用

當用戶從該JComboBox中選擇一個項目時,有沒有辦法檢測它是啓用還是禁用?

+0

也許我誤解了你的描述,但是......決不會添加_components_作爲項目。你不 - 你呢? – kleopatra 2011-04-10 13:38:17

+0

@kleopatra:是的,我確實有這個問題嗎?我需要放置圖標+禁用某些項目。 – Brad 2011-04-10 14:10:45

+0

問題在於混合不同的擔憂(哪種擺動可以保持分離 - 這就是爲什麼有渲染器的原因;-)。看到我的答案,如何設計更多的擺動。 – kleopatra 2011-04-10 16:10:44

回答

2

renederer只是描繪它們,所以不會有isEnabled值來檢查。而是使用與cellRenderer用來確定是否允許值的相同邏輯,當您查看選擇時。或者可能從列表中刪除這些值而不是禁用該值。

+1

當然,如果您使用「相同的邏輯」,這意味着將其提取到方法中並調用該方法。 – 2011-04-10 13:20:34

+0

使用相同的邏輯是我的替代解決方案。我希望會有另一種方式。 – Brad 2011-04-10 13:28:43

1

列表/組合(或任何集合組件)中的項目應該是具有某種狀態的業務對象的表示。然後實現知道不同狀態的渲染器,並使渲染器(渲染器)將狀態映射爲適當的視覺表示。

// the item 
public class Valve { 
    private boolean open; 
    private boolean canOperate; 
    private Point location; 
    // getters and methods as appropriate 
    public boolean isOpen() { ... 
    ...  
} 

// custom renderer 
Component getListCellRendererComponent(....) { 
    // normal config, assuming you subclass DefaultListCellRender 
    super.getListCellRendererComponent(...) 
    if (value instanceof Valve) { 
     configFromValve((Valve) value) 
    } 
    return this; 
} 
private void configFromValve(Valve valve) { 
    setText("P: (" + valve.location().x + "," + valve.getLocation().y + ")"); 
    setIcon(valve.isOpen() ? openIcon : closedIcon); 
    setEnabled(valve.canOperate()); 
} 
+0

我喜歡你的實現很多......但我可以問(只是爲了理解),將組件定義爲組合模型中的項目有什麼不對? – Brad 2011-04-12 11:23:53

+1

@brad這樣做是錯誤的,因爲它會讓一些對象無意中遇到你需要的屬性。如果組件是您的業務對象(可能是f.i.中的可視化構建器),那可能會很好,但這非常罕見。 – kleopatra 2011-04-12 11:28:48

相關問題