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

JavaFX SceneBuilder绑定ObjectProperty

能可人
2023-03-14
// 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);
    }

下面是我的代码:

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个答案

景书
2023-03-14

如果在场景生成器中更改颜色属性时没有发生效果,则说明绑定不正确。可以使用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" />

场景生成器预览:

 类似资料:
  • if绑定 if绑定应用在页面元素中,并通过表达式判断是否为元素添加子元素的绑定。if绑定在功能上非常像visible绑定,但在实现上却有很大的不同。visible绑定是为元素添加css样式来控制元素是否显示,if绑定是控制元素的字元素,如果表达式为true,则为元素添加子元素,否则清空子元素。 示例代码: //.W片段 <label> <input type="checkbox" bind-c

  • 诸如本地变量、实例变量、self一类的实体……或者说所有于对象绑定的名称。我们把他们称为绑定(bindings)。 下面内容摘自紫苏的博客,该文对我们的讨论很有意义。 在计算机科学中,“绑定”(Binding)一词是指一个更复杂、更大型的物件的引用的创建。例如当我们编写了一个函数,这个函数名就绑定了该函数本体,我们可以通过函数名来引用并调用该函数,这被称为名称绑定;又如当Ruby通过API去调用了

  • 问题内容: 在Python中,有没有办法绑定未绑定的方法而不调用它? 我正在编写一个程序,对于某个类,我决定将所有按钮的数据分组为类级别的元组列表是一件好事,如下所示: 问题是,因为所有的值r都是未绑定方法,所以我的程序爆炸得很厉害,我哭了。 我正在网上寻找解决方案,该方案应该是一个相对直接,可解决的问题。不幸的是我找不到任何东西。现在,我正在解决此问题,但是没有人知道是否存在一种干净,健康,Py

  • attr绑定是用来为html元素绑定属性值的,这种绑定非常有用,例如我们需要想一个元素添加title属性,或者为img标签添加src属性。 示例代码: //.W片段 <a bind-attr="{ href: url, title: details }"> Report </a> //js片段 this.url=justep.Bind.observable("year-end.html"),

  • submit绑定只能用在form元素中,当form提交的时候被触发,并且默认阻止form的提交。因此我们通常在submit的处理函数中以ajax的方式提交form表单。 示例代码: //.W片段 <form bind-submit="doSomething"> ... form contents go here ... <button type="submit">Submit</butt

  • with绑定用来创建一个绑定上下文,在子元素内的所有绑定都在这个上下文中进行。 示例代码: //.W片段 <h1 bind-text="city"> </h1> <p bind-with="coords"> Latitude: <span bind-text="latitude"> </span>, Longitude: <span bind-text="longitude"> </span

  • foreach绑定用来处理数组,通常用来将一个数组绑定到一个列表或者table中。在foreach绑定中,我们可以使用if、with等嵌套绑定。 示例代码: //.W片段 <table> <thead> <tr><th>First name</th><th>Last name</th></tr> </thead> <tbody bind-foreach="people"> <tr>

  • selectedOptions绑定用在select元素中,用来绑定已选中的对象,通常被用在多选列表中。如果列表为单选列表(下拉列表),选中值可以用value绑定。 示例代码 //.W片段 <p> Choose some countries you'd like to visit: <select bind-options="availableCountries" bind-selectedO