我是在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);
}
答案 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预览: