在intelliJ

时间:2018-06-27 13:44:32

标签: javafx fxml

我想向intelliJ中的javafx场景构建器添加一个自定义组件。我目前正在使用Java 8.1。我听说使用Java 10可以将组件添加到场景构建器中,因为它具有Java 2.0。我已经安装了Java 10,但是我不知道如何切换到该版本的Java。因此,如果您知道如何解决此问题,我将很乐意听到。

预先感谢

Lenardjee

编辑: 我知道为什么这个问题与其他帖子类似,因为直接的问题是直接将自定义组件添加到场景构建器中。但是,该问题存在的根本原因是,我在intelliJ中使用了编辑器,而该编辑器是用于javafx 1.0左右的,而javafx 2.0的编辑器支持添加自定义组件的功能,该功能位于java 10.现在真正的问题是:如何更新intelliJ中的场景构建器?我已经安装了Java 10,但是我的项目仍在使用Java 8.1,但我不知道如何更改它。我希望这可以解释为什么我的问题是相关的,而不是重复。感谢您阅读比最初的问题还要长的解释; p

1 个答案:

答案 0 :(得分:2)

  

我希望能够制作一个Java类,扩展Pane左右,然后为其分配子代和操作,例如旁边带有文本字段的滑动条,显示值。我知道在场景构建器应用程序中,可以通过将具有类和依赖项的jar文件直接导入场景构建器中来实现,但是我不知道如何在intelliJ的场景构建器中做到这一点。

Scene Builder的使用方式没有什么不同。您只需在用户控件中添加属性(如果属性不是只读的,则可以使用getter和setters)。在这种情况下,属性将显示在Scene Builder检查器中,您可以通过属性或直接编辑FXML文件来对其进行操作。

这是一个示例(java 8,但这无关紧要)

mycontrol.fxml

<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);
    }
}

这是使用此用户控件的场景

sample.fxml

<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>

And this is the working view in IntelliJ