Если вы хотите использовать FXML, вам нужно будет иметь возможность добавлять свои собственные компоненты. Это довольно просто, вам просто нужно добавить оператор импорта. Элементы в вашем FXML-файле, начинающиеся с заглавной буквы, будут интерпретироваться как экземпляры, и, если они являются Java-компонентами, самое важное: если у них есть стандартный конструктор без параметров, все в порядке.
Если нет, это немного сложнее. Вам нужно будет предоставить Builder и BuilderFactory загрузчику. Например, в FXExperience Tools используется красивый элемент управления ColorPicker, которому требуется цвет, передаваемый его конструктору. Итак, в FXML мы хотим написать что-то вроде этого:
|
1
|
<?import com.fxexperience.javafx.scene.control.colorpicker.ColorPicker?><!-- ... --><ColorPicker fx:id="colorPicker" id="colorPicker" color="GREEN" /> |
Теперь нам нужно создать BuilderFactory и Builder:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
import com.fxexperience.javafx.scene.control.colorpicker.ColorPicker;import javafx.fxml.JavaFXBuilderFactory;import javafx.scene.paint.Color;import javafx.util.Builder;import javafx.util.BuilderFactory;/** * * @author eppleton */public class ColorPickerBuilderFactory implements BuilderFactory {public static class ColorPickerBuilder implements Builder<ColorPicker> { private Color color = Color.WHITE; private String id="colorPicker";public String getId() { return id; }public void setId(String id) { this.id = id; }public Color getColor() { return color; }public void setColor(Color color) { this.color = color; }@Override public ColorPicker build() { ColorPicker picker = new ColorPicker(color); picker.setId(id); return picker; } } private JavaFXBuilderFactory defaultBuilderFactory = new JavaFXBuilderFactory();@Override public Builder<?> getBuilder(Class<?> type) { return (type == ColorPicker.class) ? new ColorPickerBuilder() : defaultBuilderFactory.getBuilder(type); }} |
И, наконец, при загрузке FXML вам нужно передать фабрику загрузчику:
|
1
2
3
|
(Parent) FXMLLoader.load( TestTool.class.getResource("GradientEditorControl.fxml"), null, new ColorPickerBuilderFactory()) |
Вот и все, было бы здорово, если бы я мог заставить SceneBuilder это понять.
Ссылка: Добавьте пользовательские компоненты в FXML, используя BuilderFactory от нашего партнера по JCG Тони Эппла в блоге Eppleton .