我有一個JComboBox中填充了一些隨機項目,可以在運行時更改。我已經使用getListCellRendererComponent(...)將它們設置爲JLabels。我也設置了一些Jlabel爲setEnabled(false)。檢測選定的JComboBox項目是啓用還是禁用
當用戶從該JComboBox中選擇一個項目時,有沒有辦法檢測它是啓用還是禁用?
我有一個JComboBox中填充了一些隨機項目,可以在運行時更改。我已經使用getListCellRendererComponent(...)將它們設置爲JLabels。我也設置了一些Jlabel爲setEnabled(false)。檢測選定的JComboBox項目是啓用還是禁用
當用戶從該JComboBox中選擇一個項目時,有沒有辦法檢測它是啓用還是禁用?
renederer只是描繪它們,所以不會有isEnabled值來檢查。而是使用與cellRenderer用來確定是否允許值的相同邏輯,當您查看選擇時。或者可能從列表中刪除這些值而不是禁用該值。
當然,如果您使用「相同的邏輯」,這意味着將其提取到方法中並調用該方法。 – 2011-04-10 13:20:34
使用相同的邏輯是我的替代解決方案。我希望會有另一種方式。 – Brad 2011-04-10 13:28:43
列表/組合(或任何集合組件)中的項目應該是具有某種狀態的業務對象的表示。然後實現知道不同狀態的渲染器,並使渲染器(渲染器)將狀態映射爲適當的視覺表示。
// 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());
}
也許我誤解了你的描述,但是......決不會添加_components_作爲項目。你不 - 你呢? – kleopatra 2011-04-10 13:38:17
@kleopatra:是的,我確實有這個問題嗎?我需要放置圖標+禁用某些項目。 – Brad 2011-04-10 14:10:45
問題在於混合不同的擔憂(哪種擺動可以保持分離 - 這就是爲什麼有渲染器的原因;-)。看到我的答案,如何設計更多的擺動。 – kleopatra 2011-04-10 16:10:44