Отличия ActionListener между Windows и Linux

У меня есть JComboBox. Я добавляю ActionListener, используя следующий код:


addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                textComboActionPerformed(evt);
            }
        });

Вот как это выглядит при первом отображении. В нем есть несколько вариантов.
alt text

Вы заметите, что основное текстовое поле - это первый элемент, поэтому он будет тем элементом, который отображается при первом отображении JComboBox.

Если вы нажмете на JComboBox, вы увидите параметры, доступные под ним.

alt text

Однако, если я выберу «Базовое текстовое поле», это не вызовет срабатывания ActionEvent. Это как-то связано с тем, что это первый элемент в списке. Если я выберу любой другой JComboBox, ActionEvent будет запущен.

РЕДАКТИРОВАТЬ: в Linux, скажем, вы выбираете элемент, и событие запускается. Затем вы снова выбираете этот элемент, второй раз он не сработает. Он не изолирован только от первого элемента. Это связано с двойным выбором уже выбранного элемента.

Такое поведение происходит только в Linux. В Windows событие срабатывает независимо от того, на каком элементе я нажимаю, даже на первом. Любые идеи о том, почему это должно быть? Отличается ли подобное поведение от JVM к JVM?

Спасибо


person user489041    schedule 07.12.2010    source источник
comment
Какие образы и ощущения есть на каждой платформе?   -  person EboMike    schedule 07.12.2010
comment
Каково поведение, когда вы выбираете уже выбранный элемент? Я подозреваю, что linux не позволяет ничего выбирать, но окна не позволяют ничего выбирать, однако он показывает первый элемент как выбранный.   -  person Jacob Tomaw    schedule 07.12.2010
comment
@Jacob Tomaw В Linux, если вы снова выберете элемент, который был выбран ранее, вы увидите такое же поведение. Событие не сработает. В Windows событие снова запускается, как и ожидалось.   -  person user489041    schedule 07.12.2010
comment
@user: попробуйте установить одинаковый внешний вид на обеих платформах. Или это уже так?   -  person EboMike    schedule 07.12.2010
comment
@EboMike Да, это Nimbus на обоих. Я верю, что это OpenJDK для Linux. Я не знал, может ли это иметь какой-то эффект.   -  person user489041    schedule 07.12.2010
comment
При добавлении содержимого в поле со списком к вам прикреплен слушатель?   -  person willcodejavaforfood    schedule 09.12.2010


Ответы (1)


Во-первых, я думаю, что правильным слушателем будет ItemListener (вместо ActionListener).

Как вы указываете в своем комментарии, это дает вам согласованное поведение на разных платформах: вы вообще не получаете событие, когда уже выбранный элемент «повторно выбран». Именно так должен работать ItemListener согласно JavaDocs:

aListener получит одно или два ItemEvents при изменении выбранного элемента.

Когда вы выбираете то же значение, которое уже выбрано, очевидно, что вы не изменяете значение, поэтому событие не запускается. Однако, очевидно, это не совсем то, что вам нужно. В качестве альтернативы я предлагаю отображать JComboBox без предварительно выбранного элемента:

JComboBox comboBox = new JComboBox(model);
comboBox.setSelectedItem(null);

Я не знаю, возможно ли это для вашего приложения, но таким образом вы обязательно получите событие всякий раз, когда будет выбрано фактическое значение. (Я думаю, это также имеет больше смысла с точки зрения удобства использования, потому что зачем неспециалисту щелкать поле со списком, чтобы выбрать значение, которое уже выбрано?)

person Thomas    schedule 08.12.2010
comment
Нет, это не сработало. Я переключил его на ItemListener. Затем я попробовал его на окнах. Теперь он демонстрирует то же поведение, что и в Linux. На изображениях выше: если я загружаю программу и первым делом нажимаю на «Основное текстовое поле», событие не срабатывает. - person user489041; 08.12.2010
comment
Возможно, у вас просто не могло быть изначально выбранного значения в поле со списком? Соответственно я изменил текст своего ответа ... - person Thomas; 09.12.2010