当您想使用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;}@Overridepublic ColorPicker build() {ColorPicker picker = new ColorPicker(color);picker.setId(id);return picker;}}private JavaFXBuilderFactory defaultBuilderFactory = new JavaFXBuilderFactory();@Overridepublic 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