Если вы хотите использовать 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 .