JavaFX 9 -JEP 253 Skin API и несколько проблем
С выпуском Java JDK 9, как указано в JEP 253, классы, связанные с оболочками элементов управления JavaFX, перемещены из закрытого пакета. com.sun.javafx.scene.control.skin
для общественности javafx.scene.control.skin
,
Причина этого изменения заключается в том, что разработчики использовали для программирования своего пользовательского элемента управления, несмотря на то, что Oracle отказалась от этой практики, создав подкласс оболочки частного пакета. Поэтому, переместив эти классы в общедоступный пакет, Java теперь предлагает общедоступный API для оформления пользовательского элемента управления.
Но все не так просто. Я нашел несколько проблем, которые я хотел бы, чтобы кто-то мог оправдать.
Первая проблема заключается в том, что, хотя сейчас есть публичный пакет javafx.scene.control.skin
, нет общедоступного API для изменения или настройки скина. Это просто создать простую кнопку (это было также просто путем подкласса абстрактного класса SkinBase
) но очень сложно настроить ColorPicker
или TextField
или более сложный контроль. Проблема в том, что мы, разработчики, не имеем доступа к более простым компонентам, составляющим сложный составной элемент управления. Добавьте тот факт, что с введением новой модульной системы очень сложно использовать отражение, это означает, что помимо простой настраиваемой кнопки или другого простого элемента управления очень трудно работать с интерфейсом Skin API.
Вторая проблема, которую я обнаружил, это ошибка в ComboBoxPopupControl
учебный класс. Я хотел создать настроенную версию ColorPicker
поэтому я создаю класс, который расширен ColorPickerSkin
, Как я только что сказал, мне было очень трудно работать с этим классом, поэтому я делаю свой класс, чтобы расширить ComboBoxPopupControl
(прямой подкласс ColorPickerSkin
), что я нашел более чистым, чтобы создать из основы мой пользовательский палитры цветов. Но этот класс имеет ошибку, он поднимает NullPointerException
Поскольку переменная с частной видимостью пакета не инициализирована. Эта переменная имеет тип ColorPickerBehaviour
то, что в Java 8 было возможно инициализировать его, передавая vaule в конструктор, конструктор, который в Java 9 не принимает параметр этого типа.
Я хотел бы знать, работали ли вы или работаете, как я, используя этот API JavaFX, какое решение вы приняли или какое решение вы нашли.