Как определить, когда пункт меню ComboBox действительно выбран пользователем? - PullRequest
0 голосов
/ 31 января 2019

В настоящее время я сталкиваюсь с ситуацией, когда пользователь нажимает на мой ComboBox и перемещает выделение своими клавишами, прослушиватель выбора будет вызываться, хотя для всех целей выбор все еще не был сделан пользователем.

Как я могу отличить эти "промежуточные" выборы от правильного, окончательного, пользовательского выбора в моем ComboBox?

Я пытался смотреть на такие переменные, как isPopupVisible или даже играть с PopupMenuListener, ноони, похоже, не очень помогли.

Спасибо

Редактировать: Пример кода обидчика:

public class Main extends JFrame {    
    public Main() {
        setLayout(new FlowLayout(FlowLayout.LEFT, 10, 10));

        JComboBox<String> comboBox = new JComboBox<>();
        comboBox.setModel(new DefaultComboBoxModel<>(new String[] { "a", "b", "c" }));
        comboBox.addItemListener(e -> {
            System.out.println(e.getItem());
        });
        add(comboBox);
    }    
}

1 Ответ

0 голосов
/ 31 января 2019

Мне нужно что-то, что срабатывает только тогда, когда пользователь фактически щелкает, а всплывающее окно исчезает.

comboBox.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE);

Установите указанное выше свойство, чтобы событие генерировалось только при отпускании мыши илиВведите ключ.

Примечание:

  1. , если вы используете ActionListner, событие всегда будет генерироваться при выборе элемента.

  2. если вы используете ItemListener, событие генерируется только в том случае, если вы измените выбранный элемент с предыдущего выбора.

Редактировать:

Вы можете отключитьвыбор ключа с помощью:

JComboBox comboBox = new JComboBox( model )
{
    @Override
    public boolean selectWithKeyChar(char keyChar)
    {
        return false;
    }
};

Редактировать 2:

Или, возможно, в качестве хака вы можете отключить слушателя, когда вы выполняете поиск ключа.Код может быть что-то вроде:

JComboBox comboBox = new JComboBox( model )
{
    @Override
    public boolean selectWithKeyChar(char keyChar)
    {
        // remove the listener here

        // This will cause the selected index to change
        Boolean result = super.selectWithKeyChar(keyChar);

        // add the listener back here

        return result;
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...