Существует простое решение, чтобы ваш вложенный элемент управления работал и был импортирован Scene Builder.
Проблема связана с непустым конструктором, который вы использовали для элементов управления.
ХотяNumberField
работает (как его можно импортировать) с этим конструктором:
public NumberField(@NamedArg("intField") boolean intField, @NamedArg("value") double value, @NamedArg("min") double min,
@NamedArg("max") double max);
Внешний элемент управления NumberSlider
, который использует элемент управления NumberField
, и имеет этот конструктор:
public NumberSlider(@NamedArg("logarithmic") boolean logarithmic, @NamedArg("ticks") boolean ticks,
@NamedArg("intSlider") boolean intSlider, @NamedArg("value") double value,
@NamedArg("min") double min, @NamedArg("max") double max);
не удается импортировать.
В этот раз это не проблема загрузчика классов, а проблема, связанная с аргументами и соответствующими значениями по умолчанию.
@ NamedArg defaultзначения
Итак, каковы значения по умолчанию для этих аргументов при создании и экземпляра элемента управления из Scene Builder?
- Для логических значений:
false
- Для целых чисел:
0
- Для двойных чисел:
0.0
Это означаетчто при создании элемента управления вы вызываете:
final NumberSlider slider = new NumberSlider(false, false, false, 0, 0, 0);
И если вы попробуете это в своем проекте, он потерпит неудачу !!
Caused by: java.lang.IllegalArgumentException: MajorTickUnit cannot be less than or equal to 0.
at javafx.scene.control.Slider.setMajorTickUnit(Slider.java:397)
at com.mycompany.numberslider.NumberSlider.<init>(NumberSlider.java:118)
at com.mycompany.numberslider.NumberSliderApp.start(NumberSliderApp.java:20)
Из-за этого исключения произойдет сбой элемента управлениячтобы быть импортированным из Scene Builder.
Итак, теперь, когда мы нашли проблему, у вас есть два варианта ее решения:
- Измените код, чтобы разрешить эти значения по умолчанию
- Измените значения по умолчанию для namedArgs
Я объясню, как сделать последнее, которое будет моим предпочтительным.
Но учтите, что вам придется также изменять свой код, чтобы избежать проблем при запуске элемента управления всякий раз, когда пользователь выбирает недопустимые значения.
@ NamedArg defaultValue () метод
Если вы проверите аннотацию NamedArg
:
@Retention(RUNTIME)
@Target(PARAMETER)
public @interface NamedArg {
/**
* The name of the annotated argument.
* @return the name of the annotated argument
*/
public String value();
/**
* The default value of the annotated argument.
* @return the default value of the annotated argument
*/
public String defaultValue() default "";
}
, есть два метода, и обычно мы используем только один: value()
.
Но мы могли бы использоватьи измените значение ""
по умолчанию, например:
public NumberSlider(@NamedArg(value="logarithmic", defaultValue="false") boolean logarithmic,
@NamedArg(value="ticks", defaultValue="false") boolean ticks,
@NamedArg(value="intSlider", defaultValue="false") boolean intSlider,
@NamedArg(value="value", defaultValue="50") double value,
@NamedArg(value="min", defaultValue="0") double min,
@NamedArg(value="max", defaultValue="100") double max);
С этим изменением соберите элементы управления и банку и попробуйте импортировать их снова, теперь вы увидите три элемента управления с помощью Scene Builder.
Обратите внимание, что предварительный просмотр элемента управления будет отражать эти новые значения по умолчанию.