Как передать фокус пользовательскому компоненту, когда клавиши обхода отключены?

Я создал пользовательский JComboBox с пользовательским всплывающим окном, которое реализует KeyListener. Я хотел, чтобы элемент выбирался из всплывающего окна cmbBox при нажатии Tab или Enter, поэтому я установил setFocusTraversalKeysEnabled(false) как для поля со списком, так и для всплывающего окна.

Проблема с этим подходом заключается в том, что теперь мне нужно добавить еще один KeyListener в поле со списком, когда я использую его в контейнерах, чтобы сместить фокус.

Могу ли я запустить событие передачи фокуса (гипотетически) или что-то подобное в моем пользовательском JComponent, который перенесет фокус в свой родительский компонент, чтобы мне не приходилось добавлять ключевых слушателей везде, где я его использую. Я использовал transferFocus(), но он не передает фокус.

Я еще не запачкал руки привязками клавиш, но есть ли привязка клавиш для переноса фокуса?

Спасибо

Я пытаюсь воссоздать sscce, но это оказывается сложно. Пожалуйста, несите.


person Nitin Chhajer    schedule 11.04.2012    source источник


Ответы (1)


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

  • Я бы предложил использовать KeyBindings, потому что этот прослушиватель предназначен для Swing JComponents, и, конечно, вы можете (точно так же, как для KeyListener) добавить этот прослушиватель к конкретному JComponent или его производным (ям)

  • вы можете добавить Listener к производному всплывающему окну на firePopupMenuWillBecomeVisible

  • вы можете добавить ItemListener в производный JList

  • возможно, неправильный способ, но защитите все дефекты, реализованные в KeyListener, что только владелец Focus может принимать события с клавиатуры, надежный обходной путь для KeyBindings OS более настраиваемый и удобный

обратите внимание пожалуйста, прочитайте этот ответ

person mKorbel    schedule 11.04.2012
comment
Спасибо. Пули 2 и 3 были частью моего кода, и я пытаюсь перейти на привязки клавиш. В чем хитрость заключалась в том, что в клавиатуре со списком мне пришлось заменить transferFocus() на ((JComponent)e.getSource()).transferFocus(). Во время отладки я обнаружил, что источником был редактор поля со списком, а не предполагаемое поле со списком. Но я не понимаю, почему фокус не смещался раньше. - person Nitin Chhajer; 12.04.2012
comment
Focus и FocusSubsystem довольно асинхронны, потому что пришли из Native OS, в большинстве случаев это невозможно (возможно, ваша проблема, когда более одного Listeners запускали события в EDT), управляя тем, что обернуто в invokeLater(), и не поймать это как обычное событие - person mKorbel; 12.04.2012