JavaFX SceneBuilder绑定对象属性

时间:2020-07-24 22:30:01

标签: javafx scenebuilder

我是在JavaFX SceneBuilder中使用ObjectProperties的新手,所以我正在寻求帮助。

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

// Pane background colors
ObjectProperty<Paint> paneColor = new SimpleObjectProperty<>(Color.TRANSPARENT);
ObjectProperty<Background> paneBackground = new SimpleObjectProperty<>(new Background(new 

BackgroundFill(paneColor.get(), CornerRadii.EMPTY, Insets.EMPTY)));
ObjectProperty<Paint> paneBorderColor = new SimpleObjectProperty<>(Paint.valueOf("#c9d4cc"));

controller.getBackgroundPane().backgroundProperty().bind(paneBackground);
controller.getBackgroundPane().setStyle("-fx-border-color: " + paneBorderColor.get());

public Paint getPaneColor() {
        return paneColor.get();
    }
    
    public void setPaneColor(Paint color) {
        this.paneColor.set(color);
    }
    
    public Paint getPaneBorderColor() {
        return this.paneBorderColor.get();
    }
    
    public void setPaneBorderColor(Paint color) {
        this.paneBorderColor.set(color);
    }
    
    public Background getPaneBackgroundColor() {
        return this.paneBackground.get();
    }
    
    public void setPaneBackgroundColor(Background background) {
        this.paneBackground.set(background);
    }

颜色不会显示在窗格上,但是它们的属性字段会在SceneBuilder编辑器中显示。但是,当我通过SceneBuilder编辑它们时,它们不会改变。

有人可以告诉我我做错了什么吗?谢谢:)

编辑:

现在一切正常,但是我想将颜色绑定到窗格的边框颜色。我使用绑定到窗格的styleproperty的StringProperty尝试了这种方法。它可以工作,但是我很好奇是否有一种更有效的方法(我可以在SceneBuilder中使用颜色选择器,而不必使用CSS对边框的宽度进行编码)。

这是我的代码:

StringProperty paneBorderColor = new SimpleStringProperty("#c9d4cc");

controller.getBackgroundPane().styleProperty().bind(Bindings.createStringBinding(() -> 
"-fx-border-color: " + paneBorderColor.get() + "; -fx-border-width: 2px 0px 2px 0px", 
paneBorderColor));

public String getPaneBorderColor() {
    return this.paneBorderColor.get();
}
    
public void setPaneBorderColor(String color) {
    this.paneBorderColor.set(color);
}

1 个答案:

答案 0 :(得分:1)

如果在Scene Builder中更改color属性时没有任何效果,则绑定不正确。您可以使用Bindings.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;
    }
}

CustomPane:

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

FXML:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.Pane?>


<Pane fx:id="pane" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" />

Scene Builder预览:

Scene Builder Preview