当前位置: 首页 > 知识库问答 >
问题:

在intelliJ中为FXML场景构建器添加自定义组件

越姚石
2023-03-14

共有1个答案

鲁建茗
2023-03-14

我希望能够制作一个java类,扩展窗格左右,然后给它分配子项和动作,比如旁边有一个textfield的滑块,显示值。我知道在scene builder应用程序中,可以通过直接将带有类和依赖项的jar文件导入到scene builder中,但我不知道如何在IntelliJ中的scene builder中做到这一点。

使用场景生成器的方式没有区别。您只需在用户控件中添加属性(如果属性不是只读的,则使用getter和setter)。在这种情况下,属性将出现在Scene Builder检查器中,您可以通过这些属性或直接编辑fxml文件来操作这些属性。

下面是一个示例(Java8,但这不相关)

<fx:root type="javafx.scene.layout.HBox" xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml">
    <Label fx:id="label"/>
    <Slider fx:id="slider" HBox.hgrow="ALWAYS"/>
</fx:root>
public class MyControl extends HBox {

    @FXML
    private Label label;

    @FXML
    private Slider slider;

    private StringProperty labelName = new SimpleStringProperty();
    private DoubleProperty sliderPos = new SimpleDoubleProperty();

    public MyControl() {
        try {
            FXMLLoader l = new FXMLLoader(getClass().getResource("mycontrol.fxml"));
            l.setController(this);
            l.setRoot(this);
            l.load();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }

    @FXML
    private void initialize() {
        slider.setMin(0.0);
        slider.setMax(100.0);

        label.textProperty().bindBidirectional(labelName);
        slider.valueProperty().bindBidirectional(sliderPos);
    }

    public String getLabelName() {
        return labelName.get();
    }

    public StringProperty labelNameProperty() {
        return labelName;
    }

    public void setLabelName(String labelName) {
        this.labelName.set(labelName);
    }

    public double getSliderPos() {
        return sliderPos.get();
    }

    public DoubleProperty sliderPosProperty() {
        return sliderPos;
    }

    public void setSliderPos(double sliderPos) {
        this.sliderPos.set(sliderPos);
    }
}
<AnchorPane xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.121" fx:controller="sample.Controller">
    <MyControl labelName="Test name" sliderPos="25.0" />
</AnchorPane>
 类似资料: