当您想使用FXML时,您将需要能够添加自己的组件。
这很容易,您只需要添加一个import语句。
FXML文件中以大写字母开头的元素将被解释为实例,如果它们是Java Bean,则最重要:如果它们具有无参数的标准构造函数,则一切都很好。
如果没有,那就更复杂了。 您将需要为加载器提供一个Builder和一个BuilderFactory。 例如,在FXExperience Tools中,使用了一个不错的ColorPicker控件,该控件需要将Color传递给它的构造函数。 因此,在FXML中,我们想编写如下代码:
<?import com.fxexperience.javafx.scene.control.colorpicker.ColorPicker?><!-- ... --><ColorPicker fx:id="colorPicker" id="colorPicker" color="GREEN" />
现在我们需要创建一个BuilderFactory和一个Builder:
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时,您需要将工厂传递给加载器:
(Parent) FXMLLoader.load(
TestTool.class.getResource("GradientEditorControl.fxml"), null,
new ColorPickerBuilderFactory())
就是这样,如果我也可以使SceneBuilder理解这一点,那就太好了。
参考: Eppleton博客上的JCG合作伙伴 Toni Epple 使用BuilderFactory将自定义组件添加到FXML 。
翻译自: https://www.javacodegeeks.com/2012/04/fxml-custom-components-using.html