JavaFX SceneBuilder绑定对象属性

JavaFX SceneBuilder绑定对象属性,javafx,scenebuilder,Javafx,Scenebuilder,我不熟悉在JavaFX SceneBuilder中使用ObjectProperties,所以我正在寻求一些帮助 我想将一种颜色绑定到窗格,以便窗格将填充这种颜色。 这是我试过的 //窗格背景色 ObjectProperty paneColor=新的SimpleObject属性(Color.TRANSPARENT); ObjectProperty paneBackground=新的SimpleObject属性(新背景 背景填充(paneColor.get(),CornerRadii.EMPTY,I

我不熟悉在JavaFX SceneBuilder中使用ObjectProperties,所以我正在寻求一些帮助

我想将一种颜色绑定到窗格,以便窗格将填充这种颜色。 这是我试过的

//窗格背景色
ObjectProperty paneColor=新的SimpleObject属性(Color.TRANSPARENT);
ObjectProperty paneBackground=新的SimpleObject属性(新背景
背景填充(paneColor.get(),CornerRadii.EMPTY,Insets.EMPTY));
ObjectProperty paneBorderColor=新的SimpleObject属性(Paint.valueOf(“#c9d4cc”);
controller.getBackgroundPane().backgroundProperty().bind(paneBackground);
controller.getBackgroundPane().setStyle(“-fx边框颜色:”+paneBorderColor.get());
公共油漆getPaneColor(){
返回paneColor.get();
}
公共空间setPaneColor(油漆颜色){
this.paneColor.set(颜色);
}
公共油漆getPaneBorderColor(){
返回这个.paneBorderColor.get();
}
公共空白设置窗格颜色(油漆颜色){
此.paneBorderColor.set(颜色);
}
公共背景getPaneBackgroundColor(){
返回这个.paneBackground.get();
}
公共无效setPaneBackgroundColor(背景){
此.paneBackground.set(背景);
}
颜色不会显示在窗格中,但其属性字段会显示在SceneBuilder编辑器中。但是,当我通过SceneBuilder编辑它们时,它们不会改变

有人能澄清一下我做错了什么吗?谢谢:)

编辑:

package custom.control;

import java.net.URL;
import java.util.ResourceBundle;

import javafx.beans.binding.Bindings;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.geometry.Insets;
import javafx.scene.layout.*;
import javafx.scene.paint.Paint;

public class Controller implements Initializable {

    @FXML
    private Pane pane;

    private final ObjectProperty<Paint>
            backgroundColor = new SimpleObjectProperty<>(),
            borderColor = new SimpleObjectProperty<>();

    private final DoubleProperty
            borderWidth = new SimpleDoubleProperty();


    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {

        // Binding for background color:
        pane.backgroundProperty().bind(Bindings.createObjectBinding(() ->
                        new Background(new BackgroundFill(backgroundColor.get(),
                                CornerRadii.EMPTY, Insets.EMPTY)),
                backgroundColor));

        // Binding for border color and width:
        pane.borderProperty().bind(Bindings.createObjectBinding(() ->
                        new Border(new BorderStroke(borderColor.get(),
                                BorderStrokeStyle.SOLID,
                                CornerRadii.EMPTY,
                                new BorderWidths(borderWidth.get()))),
                borderColor, borderWidth));
    }

    public ObjectProperty<Paint> backgroundColorProperty() {
        return backgroundColor;
    }

    public ObjectProperty<Paint> borderColorProperty() {
        return borderColor;
    }

    public DoubleProperty borderWidthProperty() {
        return borderWidth;
    }
}
package custom.control;

import javafx.beans.property.DoubleProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.fxml.FXMLLoader;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.paint.Paint;

import java.io.IOException;

public class CustomPane extends AnchorPane {

    private final ObjectProperty<Paint>
            backgroundColor = new SimpleObjectProperty<>(Color.BLACK),
            borderColor = new SimpleObjectProperty<>(Color.RED);

    private final DoubleProperty
            borderWidth = new SimpleDoubleProperty(3);

    public CustomPane() {
        super();

        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("custom-pane.fxml"));

            Controller controller = new Controller();
            loader.setController(controller);

            Pane root = loader.load();
            this.getChildren().add(root);

            AnchorPane.setTopAnchor(root, 0d);
            AnchorPane.setRightAnchor(root, 0d);
            AnchorPane.setBottomAnchor(root, 0d);
            AnchorPane.setLeftAnchor(root, 0d);

            controller.backgroundColorProperty().bind(backgroundColor);

            controller.borderWidthProperty().bind(borderWidth);
            controller.borderColorProperty().bind(borderColor);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public Paint getBackgroundColor() {
        return backgroundColor.get();
    }

    public ObjectProperty<Paint> backgroundColorProperty() {
        return backgroundColor;
    }

    public void setBackgroundColor(Paint backgroundColor) {
        this.backgroundColor.set(backgroundColor);
    }

    public Paint getBorderColor() {
        return borderColor.get();
    }

    public ObjectProperty<Paint> borderColorProperty() {
        return borderColor;
    }

    public void setBorderColor(Paint borderColor) {
        this.borderColor.set(borderColor);
    }

    public double getBorderWidth() {
        return borderWidth.get();
    }

    public DoubleProperty borderWidthProperty() {
        return borderWidth;
    }

    public void setBorderWidth(double borderWidth) {
        this.borderWidth.set(borderWidth);
    }
}
现在一切都很好,但我想将一种颜色绑定到窗格的边框颜色。我使用绑定到窗格的styleproperty的StringProperty尝试了这种方法。它可以工作,但我很好奇是否有更有效的方法(在SceneBuilder中使用颜色选择器,而不必使用CSS编码边框宽度)

这是我的密码:

StringProperty paneBorderColor=新的SimpleStringProperty(“#c9d4cc”);
controller.getBackgroundPane().styleProperty().bind(Bindings.createStringBinding(()->
“-fx边框颜色:“+paneBorderColor.get()+”;-fx边框宽度:2px 0px 2px 0px”,
paneBorderColor);
公共字符串getPaneBorderColor(){
返回这个.paneBorderColor.get();
}
public void setPaneBorderColor(字符串颜色){
此.paneBorderColor.set(颜色);
}

如果在场景生成器中更改“颜色”属性时没有效果,则绑定不正确。您可以使用
绑定。createObjectBinding(…)
。以下是其工作原理的示例:

编辑: 添加了边框颜色和宽度的示例

控制器:

package custom.control;

import java.net.URL;
import java.util.ResourceBundle;

import javafx.beans.binding.Bindings;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.geometry.Insets;
import javafx.scene.layout.*;
import javafx.scene.paint.Paint;

public class Controller implements Initializable {

    @FXML
    private Pane pane;

    private final ObjectProperty<Paint>
            backgroundColor = new SimpleObjectProperty<>(),
            borderColor = new SimpleObjectProperty<>();

    private final DoubleProperty
            borderWidth = new SimpleDoubleProperty();


    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {

        // Binding for background color:
        pane.backgroundProperty().bind(Bindings.createObjectBinding(() ->
                        new Background(new BackgroundFill(backgroundColor.get(),
                                CornerRadii.EMPTY, Insets.EMPTY)),
                backgroundColor));

        // Binding for border color and width:
        pane.borderProperty().bind(Bindings.createObjectBinding(() ->
                        new Border(new BorderStroke(borderColor.get(),
                                BorderStrokeStyle.SOLID,
                                CornerRadii.EMPTY,
                                new BorderWidths(borderWidth.get()))),
                borderColor, borderWidth));
    }

    public ObjectProperty<Paint> backgroundColorProperty() {
        return backgroundColor;
    }

    public ObjectProperty<Paint> borderColorProperty() {
        return borderColor;
    }

    public DoubleProperty borderWidthProperty() {
        return borderWidth;
    }
}
package custom.control;

import javafx.beans.property.DoubleProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.fxml.FXMLLoader;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.paint.Paint;

import java.io.IOException;

public class CustomPane extends AnchorPane {

    private final ObjectProperty<Paint>
            backgroundColor = new SimpleObjectProperty<>(Color.BLACK),
            borderColor = new SimpleObjectProperty<>(Color.RED);

    private final DoubleProperty
            borderWidth = new SimpleDoubleProperty(3);

    public CustomPane() {
        super();

        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("custom-pane.fxml"));

            Controller controller = new Controller();
            loader.setController(controller);

            Pane root = loader.load();
            this.getChildren().add(root);

            AnchorPane.setTopAnchor(root, 0d);
            AnchorPane.setRightAnchor(root, 0d);
            AnchorPane.setBottomAnchor(root, 0d);
            AnchorPane.setLeftAnchor(root, 0d);

            controller.backgroundColorProperty().bind(backgroundColor);

            controller.borderWidthProperty().bind(borderWidth);
            controller.borderColorProperty().bind(borderColor);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public Paint getBackgroundColor() {
        return backgroundColor.get();
    }

    public ObjectProperty<Paint> backgroundColorProperty() {
        return backgroundColor;
    }

    public void setBackgroundColor(Paint backgroundColor) {
        this.backgroundColor.set(backgroundColor);
    }

    public Paint getBorderColor() {
        return borderColor.get();
    }

    public ObjectProperty<Paint> borderColorProperty() {
        return borderColor;
    }

    public void setBorderColor(Paint borderColor) {
        this.borderColor.set(borderColor);
    }

    public double getBorderWidth() {
        return borderWidth.get();
    }

    public DoubleProperty borderWidthProperty() {
        return borderWidth;
    }

    public void setBorderWidth(double borderWidth) {
        this.borderWidth.set(borderWidth);
    }
}
package custom.control;
导入java.net.URL;
导入java.util.ResourceBundle;
导入javafx.beans.binding.Bindings;
导入javafx.beans.property.DoubleProperty;
导入javafx.beans.property.ObjectProperty;
导入javafx.beans.property.SimpleDoubleProperty;
导入javafx.beans.property.SimpleObject属性;
导入javafx.fxml.fxml;
导入javafx.fxml.Initializable;
导入javafx.geometry.Insets;
导入javafx.scene.layout.*;
导入javafx.scene.paint.paint;
公共类控制器实现可初始化{
@FXML
专用窗格;
私人最终财产
backgroundColor=新的SimpleObject属性(),
borderColor=新的SimpleObject属性();
私有财产
borderWidth=新的SimpleDoubleProperty();
@凌驾
公共void初始化(URL、ResourceBundle、ResourceBundle){
//背景色绑定:
pane.backgroundProperty().bind(Bindings.createObjectBinding(()->
新背景(新背景填充(backgroundColor.get(),
角半径为空,插图为空,
背景色);
//边框颜色和宽度的装订:
pane.borderProperty().bind(Bindings.createObjectBinding(()->
新边框(新边框笔划)(borderColor.get(),
BorderStrokeStyle.SOLID,
我是空的,
新的边框宽度(borderWidth.get()),
边框颜色、边框宽度);
}
public ObjectProperty backgroundColorProperty(){
返回背景色;
}
公共对象属性borderColorProperty(){
返回边框颜色;
}
public DoubleProperty borderWidthProperty(){
返回边界宽度;
}
}
自定义窗格:

package custom.control;

import java.net.URL;
import java.util.ResourceBundle;

import javafx.beans.binding.Bindings;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.geometry.Insets;
import javafx.scene.layout.*;
import javafx.scene.paint.Paint;

public class Controller implements Initializable {

    @FXML
    private Pane pane;

    private final ObjectProperty<Paint>
            backgroundColor = new SimpleObjectProperty<>(),
            borderColor = new SimpleObjectProperty<>();

    private final DoubleProperty
            borderWidth = new SimpleDoubleProperty();


    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {

        // Binding for background color:
        pane.backgroundProperty().bind(Bindings.createObjectBinding(() ->
                        new Background(new BackgroundFill(backgroundColor.get(),
                                CornerRadii.EMPTY, Insets.EMPTY)),
                backgroundColor));

        // Binding for border color and width:
        pane.borderProperty().bind(Bindings.createObjectBinding(() ->
                        new Border(new BorderStroke(borderColor.get(),
                                BorderStrokeStyle.SOLID,
                                CornerRadii.EMPTY,
                                new BorderWidths(borderWidth.get()))),
                borderColor, borderWidth));
    }

    public ObjectProperty<Paint> backgroundColorProperty() {
        return backgroundColor;
    }

    public ObjectProperty<Paint> borderColorProperty() {
        return borderColor;
    }

    public DoubleProperty borderWidthProperty() {
        return borderWidth;
    }
}
package custom.control;

import javafx.beans.property.DoubleProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.fxml.FXMLLoader;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.paint.Paint;

import java.io.IOException;

public class CustomPane extends AnchorPane {

    private final ObjectProperty<Paint>
            backgroundColor = new SimpleObjectProperty<>(Color.BLACK),
            borderColor = new SimpleObjectProperty<>(Color.RED);

    private final DoubleProperty
            borderWidth = new SimpleDoubleProperty(3);

    public CustomPane() {
        super();

        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("custom-pane.fxml"));

            Controller controller = new Controller();
            loader.setController(controller);

            Pane root = loader.load();
            this.getChildren().add(root);

            AnchorPane.setTopAnchor(root, 0d);
            AnchorPane.setRightAnchor(root, 0d);
            AnchorPane.setBottomAnchor(root, 0d);
            AnchorPane.setLeftAnchor(root, 0d);

            controller.backgroundColorProperty().bind(backgroundColor);

            controller.borderWidthProperty().bind(borderWidth);
            controller.borderColorProperty().bind(borderColor);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public Paint getBackgroundColor() {
        return backgroundColor.get();
    }

    public ObjectProperty<Paint> backgroundColorProperty() {
        return backgroundColor;
    }

    public void setBackgroundColor(Paint backgroundColor) {
        this.backgroundColor.set(backgroundColor);
    }

    public Paint getBorderColor() {
        return borderColor.get();
    }

    public ObjectProperty<Paint> borderColorProperty() {
        return borderColor;
    }

    public void setBorderColor(Paint borderColor) {
        this.borderColor.set(borderColor);
    }

    public double getBorderWidth() {
        return borderWidth.get();
    }

    public DoubleProperty borderWidthProperty() {
        return borderWidth;
    }

    public void setBorderWidth(double borderWidth) {
        this.borderWidth.set(borderWidth);
    }
}
package custom.control;
导入javafx.beans.property.DoubleProperty;
导入javafx.beans.property.ObjectProperty;
导入javafx.beans.property.SimpleDoubleProperty;
导入javafx.beans.property.SimpleObject属性;
导入javafx.fxml.fxmloader;
导入javafx.scene.layout.ancorpane;
导入javafx.scene.layout.Pane;
导入javafx.scene.paint.Color;
导入javafx.scene.paint.paint;
导入java.io.IOException;
公共类CustomPane扩展了AnchorPane{
私人最终财产
backgroundColor=新的SimpleObject属性(Color.BLACK),
borderColor=新的SimpleObject属性(Color.RED);
私有财产
borderWidth=新的SimpleDoubleProperty(3);
公共自定义窗格(){
超级();
试一试{
FXMLLoader=newFXMLLoader(getClass().getResource(“custom pane.fxml”);
控制器=新控制器();
装载机。设置控制器(控制器);
Pane root=loader.load();
this.getChildren().add(根目录);
AnchorPane.setTopAnchor(根,0d);
AnchorPane.setRightAnchor(根,0d);
锚烷立根主茎(根,0d);
AnchorPane.setLeftAnchor(根,0d);
controller.backgroundColorProperty().bind(backgroundColor);
controller.borderWidthProperty()绑定(b