Определение того, включен или отключен выбранный элемент JComboBox

У меня есть JComboBox, заполненный некоторыми случайными элементами, которые могут меняться во время выполнения. Я установил их как JLabels, используя getListCellRendererComponent(...). Я также установил некоторые из этих Jlabels как setEnabled(false).

Когда пользователь выбирает элемент из этого JComboBox, есть ли способ определить, включен он или отключен?


person Brad    schedule 10.04.2011    source источник
comment
возможно, я неправильно понимаю ваше описание, но... никогда не добавляйте компоненты в качестве элементов. Вы не - не так ли?   -  person kleopatra    schedule 10.04.2011
comment
@kleopatra: Да, знаю ... Есть ли проблема с этим? Мне нужно поставить иконки + отключить некоторые пункты.   -  person Brad    schedule 10.04.2011
comment
проблема заключается в смешивании отдельных задач (какие колебания имеют большое значение для разделения - вот почему существуют рендереры ;-). Смотрите мой ответ о том, как проектировать более гибко.   -  person kleopatra    schedule 10.04.2011


Ответы (2)


Рендерер просто рисует их, поэтому не будет значения isEnabled для проверки. Вместо этого используйте ту же логику, которую использует cellRenderer, чтобы определить, разрешено ли значение, когда вы смотрите на выделение. Или, возможно, удалите эти значения из списка вместо отключения.

person jzd    schedule 10.04.2011
comment
И, конечно же, если вы используете «ту же логику», это означает извлечение ее в метод и вызов этого метода. - person Jens Schauder; 10.04.2011
comment
Использование той же логики было моим альтернативным решением. Я надеялся, что есть другой путь. - person Brad; 10.04.2011

Элементы в списке/комбо (или любой из компонентов коллекций) должны быть представлениями бизнес-объектов с некоторым состоянием. Затем реализуйте средства визуализации, которые знают о другом состоянии, и заставьте их (средство визуализации) отображать состояние в соответствующее визуальное представление.

// 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());
}
person kleopatra    schedule 10.04.2011
comment
Мне очень нравится ваша реализация ... Но могу ли я спросить (просто чтобы понять), что не так с определением компонентов как элементов в комбинированной модели? - person Brad; 12.04.2011
comment
@brad неправильно делать это как кладж, чтобы случайно иметь какой-то объект с нужными вам свойствами. Это может быть нормально, если компоненты являются вашими бизнес-объектами (как это может быть, например, в визуальном конструкторе), но это действительно редко. - person kleopatra; 12.04.2011