Всплывающее меню JComboBox не появляется

У меня есть JComboBox внутри JPanel (который сам вложен в несколько других JPanel). Он заполняется членами перечисления. Я столкнулся с проблемой, когда всплывающее меню не появляется, когда я нажимаю кнопку «Развернуть».

Вот информация, которую я собрал на данный момент:

1) Первый щелчок по кнопке расширения ничего не дает. Второй щелчок выделяет содержимое окна, но всплывающее окно все еще не появляется.

2) После того, как я нажал кнопку и перевел на нее фокус, нажатия клавиш вверх/вниз проходят по записям правильно.

3) Я попытался добавить PopupMenuListener для распечатки событий, и события срабатывают необъяснимым образом:

mouse down: popupMenuWillBecomeVisible fires
mouse up: nothing
mouse down: popupMenuWillBecomeInvisible fires
mouse up: nothing

Вот мой код инициализации для JComboBox:

comboBox = new JComboBox();
comboBox.setPreferredSize(new Dimension(175, 30));
comboBox.setMaximumSize(new Dimension(175, 30));
comboBox.setAlignmentX(0.5f);

comboBox.addItem(Enum.Value1);
...     

parentPanel = new JPanel();
parentPanel.setLayout(new BoxLayout(parentPanel, BoxLayout.X_AXIS));
parentPanel.setMaximumSize(new Dimension(37267, 50));

... add some other stuff to parentPanel ...

parentPanel.add(comboBox);

Кто-нибудь знает, почему всплывающее меню может не появляться?

Спасибо за помощь!


person Seth    schedule 02.02.2011    source источник
comment
Опубликуйте свой SSCCE (sscce.org), демонстрирующий проблему.   -  person camickr    schedule 03.02.2011


Ответы (3)


У меня была аналогичная проблема с Java (1.6) на Mac (10.5+), и это было связано с тем, что диалоговое окно, в котором появлялся jCombobox, было модальным.

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

  • заполнить раскрывающийся список многими элементами.
  • установите его спецификацию, чтобы возвращать достаточно большое число на «getMaximumRowCount».

Надеюсь, поможет.

person tommys    schedule 07.02.2011

У меня была такая же проблема, и мне было интересно, что не так, потому что обычно это работает, и такая ошибка была бы очень критической.

Поэтому я удалил все, что у меня только что был основной метод с JDialog только с JComboBox внутри него.

В тот момент, когда я удалил все, я понял, что я сделал неправильно: я использовал getRootPane() вместо getContentPane().

Я обычно использую ESC для закрытия диалога и добавляю KeyStroke в rootPane. Это было причиной моей неосторожной ошибки.

Я надеюсь, что это поможет следующим, кто сделает эту ошибку :)

person Sehtim    schedule 30.03.2015
comment
OMG, я боролся с этим в течение нескольких месяцев! (надеюсь, во внутреннем приложении). getContentPane() действительно нужно вызывать вместо getRootPane() в окне верхнего уровня (которое для меня было JFrame). - person Matthieu; 11.10.2017

Я не уверен, что это происходит в вашем случае, но значительная часть проблем, связанных с пользовательским интерфейсом, связана с тем, что код пользовательского интерфейса не запускается в потоке диспетчеризации событий. Swing предписывает, чтобы весь код выполнялся в этом потоке, иначе вы можете столкнуться с проблемами, связанными с неправильным отображением графического интерфейса пользователя или неправильным запуском событий и т. д. Если вы запускаете весь этот код в потоке диспетчеризации событий, вы можете игнорировать это, в противном случае проверьте эту ссылку:

http://download.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html

person jluzwick    schedule 02.02.2011