Статьи

FXML: пользовательские компоненты, использующие BuilderFactory

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