На этом я опаздываю, но я только что закончил длительную сессию "бить головой об стену" по поводу чего-то, связанного с этим, и подумал, что сделаю быстрый отчет:
Если ваш контроль имеетchildren, setFocus(myControl)
выполнит поиск в глубину по дочернему дереву и установит фокус на младший первый дочерний элемент.С другой стороны, forceFocus(myControl)
просто установит фокус на myControl и покончит с ним.
У меня была ситуация с немодальным диалогом с GridLayout, где большинство ячеек сетки представляли собой набор подклассов Canvas.объекты, которые нуждались в фокусе.(Да, это немного странно, но я хотел, чтобы можно было наводить курсор на ячейку и вводить в нее материал.) Последним элементом управления в сетке была кнопка «Готово», которую я установил в качестве выбора по умолчанию.
Когда мышь покинула ячейки холста, я выполнял setFocus(myDialogShell)
, который мгновенно устанавливал фокус на первый элемент холста, не давая кнопке «готово» получить \ r и избавиться от всего грязного бизнеса.С другой стороны, forceFocus(myDialogShell)
сделал свое дело.