Если вы хотите сделать что-либо еще во время итерации, может быть полезно получить как индекс (который гарантирует вам возможность ссылаться на него, например, если у вас есть список dicts), так и фактическое содержимое элемента списка.
inlist = [{'field1':10, 'field2':20}, {'field1':30, 'field2':15}]
for idx, i in enumerate(inlist):
do some stuff with i['field1']
if somecondition:
xlist.append(idx)
for i in reversed(xlist): del inlist[i]
enumerate
дает вам доступ к элементу и индексу за один раз. reversed
так, чтобы индексы, которые вы собираетесь удалить позже, не изменяются на вас.
Переопределение:
@Override
public void showPopup()
{
//do nothing
}
должно выполнить трюк.
У меня было аналогичное требование. Вызов 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: Также обратите внимание, что прослушиватели действий по-прежнему вызываются (с неизменным выбором).
Неправильно просто отключить JComboBox?
setEnabled(false);