У меня было аналогичное требование. Вызов setEnabled(false)
дает ужасный внешний вид, и пользователь не может просматривать раскрывающийся список. Переопределение showPopup()
не работает. Попытка прослушать открытие меню, а затем закрыть его с помощью invokeLater, заставляет меню мигать, и снова пользователь не может просматривать меню.
В конце концов я сделал это (не говоря о его совершенстве, но он делает именно то, что я хотел):
import javax.swing.JComboBox;
public class ReadOnlyComboBox<E> extends JComboBox<E>
{
private static final long serialVersionUID = 5866761337995322114L;
public ReadOnlyComboBox()
{
this.setModel(new ReadOnlyComboBoxModel<E>());
}
public void setReadOnly(boolean readOnly)
{
((ReadOnlyComboBoxModel<E>)this.getModel()).setReadOnly(readOnly);
}
}
import javax.swing.DefaultComboBoxModel;
public class ReadOnlyComboBoxModel<E> extends DefaultComboBoxModel<E>
{
private static final long serialVersionUID = -1923833835224513983L;
private boolean readOnly;
@Override
public void setSelectedItem(Object anItem)
{
if(!readOnly)
super.setSelectedItem(anItem);
}
public void setReadOnly(boolean readOnly)
{
this.readOnly = readOnly;
}
}
Перед установкой выбранного элемента программно, если необходимо, вам нужно вызвать setReadOnly(false)
на ReadOnlyComboBox
, а затем установить его, чтобы остановить выбор пользователя.
Обратите внимание на неконтролируемый актерский состав, не проблема для меня в моей маленькой программе, но, вероятно, следует переопределить метод setModel
, чтобы исключить исключение, если попытаться использовать любую другую модель .
Edit: Также обратите внимание, что прослушиватели действий по-прежнему вызываются (с неизменным выбором).
На окнах это - то, как это работает
Над командной строкой после установки фляги через зернышко в виртуальной среде, осуществите эту Проверку команды
>pip install psycopg2