Как делать товары в JComboBox только для чтения? [Дубликат]

Если вы хотите сделать что-либо еще во время итерации, может быть полезно получить как индекс (который гарантирует вам возможность ссылаться на него, например, если у вас есть список 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 так, чтобы индексы, которые вы собираетесь удалить позже, не изменяются на вас.

5
задан morpheus05 7 May 2014 в 09:19
поделиться

4 ответа

7
ответ дан splungebob 28 August 2018 в 01:51
поделиться

Переопределение:

@Override
public void showPopup()
{
    //do nothing
}

должно выполнить трюк.

1
ответ дан DSquare 28 August 2018 в 01:51
поделиться

У меня было аналогичное требование. Вызов 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: Также обратите внимание, что прослушиватели действий по-прежнему вызываются (с неизменным выбором).

0
ответ дан Duncan Macleod 28 August 2018 в 01:51
поделиться

Неправильно просто отключить JComboBox?

setEnabled(false);
0
ответ дан Durandal 28 August 2018 в 01:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: