#java #javafx #package
Вопрос:
В проекте javafx, который я разветвил, используется класс BehaviorSkinBase
из пакета com.sun.javafx.scene.control.skin
. Это старый проект, поэтому я ожидал, что какой-то код будет устаревшим, но этот класс не отображается в списке устаревших.
На этом веб-сайте я нашел всю документацию о недостающем классе, но там нет исходного кода или версии javafx.
Я попытался создать проект с несколькими версиями javafx с официального сайта, но ни одна из них не решила проблему.
Этот класс используется для определения пользовательского слайдера с другим классом javafx.
public class CustomSliderSkin extends BehaviorSkinBase<Slider, SliderBehavior>
Есть ли другой способ выполнить такого рода настройку, если этот класс определенно больше не используется ?
Комментарии:
1. Заменил комментарии ответом.
Ответ №1:
Использование внутренних com.sun
API-интерфейсов не поддерживается публично в JavaFX
BehaviorSkinBase
был com.sun
api.
Он никогда не поддерживался как общедоступный API, поэтому мог изменяться без предупреждения или осуждения (что он и сделал).
Лучше всего , чтобы код любого пользовательского приложения не полагался на BehaviorSkinBase
какой-либо другой com.sun
API.
Приведенная выше информация является фактическим ответом на этот вопрос.
Приведенная ниже информация является информацией о пользовательских элементах управления JavaFX и вариантах реализации, поэтому ее можно игнорировать, если она не имеет отношения к вам в данный момент.
Варианты Реализации
Есть ли другой способ выполнить такого рода настройку, если этот класс определенно больше не используется?
Да, существует несколько вариантов, см. Шаги ниже.
Решение о том, какой подход лучше всего подходит для вашего приложения, будет зависеть от объема настроек, которые вы хотите выполнить, а также от вашего уровня квалификации и количества времени, которое вы хотите потратить на эти усилия.
Как переписать свой пользовательский слайдер
- Сравните пользовательский слайдер со стандартным слайдером JavaFX, если вы можете просто использовать стандартный слайдер вместо пользовательского, сделайте это.
- Если единственными изменениями в вашем пользовательском слайдере являются визуальный стиль, возможно, будет достаточно предоставить некоторые пользовательские CSS для оформления стандартного слайдера.
- Если пользовательский слайдер имеет иерархию узлов, отличную от стандартного слайдера, то, скорее всего, просто стилизация стандартного слайдера не приведет к его сокращению, вам нужно будет создать пользовательский скин.
- Если вам нужно создать пользовательский скин, затем посмотрите, можете ли вы подкласс SliderSkin, это позволит вам предоставить другую иерархию узлов и совершенно другие визуальные эффекты для слайдера, сохраняя при этом общедоступный API для класса слайдера.
- Если для вашего пользовательского слайдера требуется другой общедоступный API из класса слайдера, создайте новый подкласс элемента управления и новый подкласс оболочки (теперь вы создаете полностью пользовательский элемент управления с нуля).
Обратите внимание, что пользовательские элементы управления часто подходят для библиотеки элементов управления общего назначения, но часто для типичного приложения не требуются, поскольку приложению не требуется формальность интерфейса управления, и вместо этого оно может определять свой пользовательский интерфейс с помощью панелей макета и коллекций встроенных элементов управления, интегрированных вместе с помощью контроллера и, возможно, определенных с помощью FXML. Таким образом, большая часть кода приложения проходит только с шагом 1 или 2 из приведенного выше списка (например, с использованием стандартного слайдера, возможно, настроенного в look с помощью CSS).
Обработка поведения в вашем настраиваемом элементе управления
Если вы использовали существующую оболочку слайдера, она поставляется со встроенной реализацией поведения, которая является внутренним, а не общедоступным API, но, вероятно, достаточна для вас, и вам вряд ли потребуется ее изменять.
Если вам пришлось создать свой собственный полностью настраиваемый элемент управления, то у него не будет реализации поведения, поэтому вам нужно будет добавить свой собственный с нуля. Реализация поведения будет выполнять обработку клавиатуры и ввода для элемента управления и, возможно, какую-то другую работу.
Если это простой элемент управления с простым поведением, это будет так же просто, как прикрепить несколько обработчиков событий к узлам в элементе управления.
Если это сложный элемент управления, который имеет разные сопоставления ключей для разных платформ, то, возможно, взгляните на внутреннюю реализацию поведения в JavaFX, чтобы увидеть, как он реализует моделирование поведения, и получите некоторые идеи из этого (или скопируйте и вставьте соответствующие материалы в свою собственную кодовую базу приложения), чтобы помочь с реализацией поведения для вашего элемента управления.
Историческая внутренняя реализация связывает поведение и кожу
См.раздел Изменение вики пользовательских элементов управления 4.
Изменение №4: У SkinBase больше нет общедоступной ссылки на API поведения.
Это было изменение с JavaFX 2 на 8. Скорее всего, код, с которым вы работаете, основан на версии JavaFX, которая давно устарела. Читайте также о коже по той же ссылке, это может вам помочь.
Справочная информация о поведении
Если вам интересно, текущий код поведения API находится по адресу:
Он не включает в себя BehaviorSkinBase, так как давным-давно понятия поведения и скинов были разделены в JavaFX. Поведение (насколько я понимаю) в основном предназначено для обработки отображения ввода с клавиатуры (хотя, вероятно, оно может делать и другие вещи). Многие из этих сопоставлений ввода зависят от целевой платформы, поэтому для пользователя Mac может использоваться другое сопоставление по сравнению с пользователем ПК, что позволяет вводить данные с клавиатуры в соответствии со стандартным использованием клавиатуры для целевой платформы. Поведение (я верю) помогает справиться с подобными особенностями.
Справочная информация о скинах
Скины представляют собой визуальный макет элемента управления. Подкласс управления определяет общедоступный API и часто абстрагируется от внутренней реализации оболочки. Это позволяет определить элемент управления, такой как счетчик, который может содержать стрелки вверх и вниз для изменения целого значения в пределах диапазона на ПК, но на сенсорном устройстве, таком как iOS, он может быть реализован в виде прокрутки в стиле rolodex. Интерфейс общественного контроля не меняется, но к элементу управления для разных платформ подключены разные реализации оболочки, позволяющие по-разному выглядеть и чувствовать себя в зависимости от целевого устройства.
Пользовательские элементы управления, которые вы создаете с нуля, могут расширить интерфейс оболочки, чтобы сделать их доступными для скина, как описано выше.
Кроме того, оболочки всех встроенных элементов управления на платформе JavaFX доступны в виде общедоступного API в пакете javafx.scene.control.skin. Поэтому, если вы хотите предоставить новую оболочку для существующего элемента управления, вы можете расширить и переопределить существующую реализацию оболочки (что будет намного проще, чем создание пользовательского элемента управления с нуля, если настраиваемый элемент управления имеет функциональность, близкую к желаемому элементу управления).
Предыстория интеграции поведения/кожи
Внутри скины могут ссылаться на поведение для дополнительной настройки, например, различные карты ввода ускорителя клавиш для разных платформ, как обсуждалось ранее.
Платформа JavaFX реализует внутреннюю структуру поведения и систему для поддержки общедоступных элементов управления API в базовой платформе. Эта структура поведения является полностью частным API, хотя (в com.sun
) классах, и поэтому может быть изменена без предварительного уведомления.
Вы никогда не должны писать код, который зависит от com.sun
классов из фреймворка JavaFX, так как в следующий раз, когда фреймворк будет выпущен для новой функции или исправления ошибок, он может нарушить ваш код, в отличие от общедоступного API, который стабилен и предоставляет предварительное уведомление о любых устаревших функциях.
Так что не полагаться на внутреннюю структуру поведения в JavaFX, вероятно, хорошо. Однако вы можете реализовать свое собственное поведение для пользовательских элементов управления, если они вам нужны. Для этого вы можете посмотреть реализацию встроенных элементов управления в исходном коде openjfx и эмулировать нужные элементы (либо путем копирования и вставки частного API в новые классы в вашем проекте, либо путем реализации поведения ввода для пользовательских элементов управления с нуля).
Обратите внимание, что если ваш пользовательский элемент управления представляет собой просто группу встроенных основных элементов управления с платформы JavaFX или подкласс одного из этих элементов управления, то он унаследует поведение этих элементов управления по умолчанию. Часто этого будет достаточно, и вам не нужно будет кодировать свое собственное поведение.
Ответ №2:
Итак, после многократной переустановки Java я обнаружил, что с Java sdk 8 код работает нормально, должно быть, я допустил ошибку в конфигурации.
Однако, как указано в комментариях jewelsea, эти технологии больше не поддерживаются, поэтому нецелесообразно продолжать проект с их использованием.