Я пытаюсь создать пользовательские элементы управления для моего приложения JavaFx, и я немного заблудился в правильной архитектуре кода.
Я создал пользовательский элемент управления комбинированного списка, основанный на подробной настройке элемента управления по умолчанию ComboBox
.Поскольку после настройки я не могу гарантировать общую функцию элемента управления как тип ComboBox (некоторые методы могут «испортить» мою настройку и т. Д.), Я подумал, что правильным способом является инкапсуляция с использованием этой архитектуры:
- Мой
CustomComboControl
расширяет Control
, а не ComboBox
. - Содержит личное поле
internalCombo
, которое является моим настроенным экземпляром ComboBox
.Внутренняя комбинация является частью пользовательского элемента управления, а не его оболочки, поэтому я могу легко получать данные из внутренней комбинации, делегировать элементы внутренней комбинации и т. Д. - My
CustomComboControl
использует пользовательский Skin
, который использует внутреннюю комбинацию из элемента управления в качестве корневого узла.
Это правильная архитектура? В целом это работает хорошо, но я столкнулся с некоторыми проблемами, которые не могу решить.
Фокус и ключевые события .Если я сохраню свой пользовательский элемент управления и внутреннюю комбинацию setFocusTraversable(true)
, при цикле фокусировки фокусировка удваивается (необходимо дважды нажать клавишу TAB, чтобы перейти к моему пользовательскому элементу управления).
Если я сделаю фокусировку только на внутреннем комбо, я не смогу прислушиваться к своему пользовательскому элементу управления (который иногда необходим).
Если я сделаю фокусировку только для пользовательского элемента управления, внутренняя комбинация не получит события клавиатуры, что нарушает ее функцию.
Какая архитектура правильная?(Я знаю, что этот вопрос, вероятно, слишком широкий.)
Вопрос отредактирован:
Во втором предложенном решении (только для скинов, доступных для обработки, но не для самого элемента управления) передаются ключевые события изнастраиваемый элемент управления для внутренней комбинации как-то возможен?