У меня есть простой графический интерфейс с JTextField и AWT Canvas (чтобы предотвратить встречный вопрос о том, почему я использую AWT Canvas: мне нужен дескриптор окна).
Canvas предназначен для обработки входных событий, а это значит, что он должен быть фокусируемым. Я убеждаюсь в этом, используя setFocusable(true)
в его конструкторе, более поздние проверки с использованием isFocusable()
подтверждают, что он действительно доступен для фокусировки.
Теперь JTextField получает фокус по умолчанию, когда открывается графический интерфейс. Меня пока это устраивает. Однако нет никакого способа убрать фокус вдали от этого JTextField.
Статья "Подсистема AWT Focus" " ясно указывает, что если щелкнуть компонент, на который можно навести фокус, он получит фокус. На самом деле этого не происходит, я получаю нулевые события изменения фокуса, только если окно деактивируется и снова активируется, но затем фокус снова возвращается к JTextField.
Явные вызовы requestFocus()
и requestFocusInWindow()
тоже не помогают, последний всегда возвращает false
.
Я получил те же результаты с любым фокусируемым компонентом, если заменил JTextField. Если Canvas является единственным фокусируемым контейнером, все работает нормально, потому что он всегда будет в фокусе.
Я что-то упустил здесь? Есть ли способ заставить мой Canvas сфокусироваться в присутствии другого фокусируемого компонента, желательно, не делая его нефокусируемым?
requestFocusInWindow
всегда возвращаетfalse
,requestFocus
тоже ничего не делает). Кстати, этого методаgrabFocus
не существует (я использую не JComponent, аjava.awt.Canvas
. 01.06.2011