Отличия ActionListener между Windows и Linux - PullRequest
2 голосов
/ 07 декабря 2010

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


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

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

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

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

alt text

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

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

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

Спасибо

1 Ответ

2 голосов
/ 08 декабря 2010

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

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

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

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

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

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

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