我正在尝试将自定义属性实现到JavaFX应用程序的自定义组件中。我已经阅读了一些教程,所有的教程都指向我下面的方向。
由于某种原因,它不起作用。当我尝试在FXML文件中设置属性值并且场景构建器也不显示该属性时,IntelliJ不喜欢。
标签控制器:
public class LabelController {
@FXML
public Label label;
// Define a variable to store the property
private DoubleProperty amountDue = new SimpleDoubleProperty();
// Define a getter for the property's value
public final double getAmountDue(){return amountDue.get();}
// Define a setter for the property's value
public final void setAmountDue(double value){amountDue.set(value);}
// Define a getter for the property itself
public DoubleProperty amountDueProperty() {return amountDue;}
public void onMouseEntered(MouseEvent mouseEvent) {
FadeToHoverColour();
}
public void onMouseExited(MouseEvent mouseEvent) {
FadeToDefaultColour();
}
public void FadeToHoverColour() {
Timeline timeline = new Timeline();
timeline.getKeyFrames().add(new KeyFrame(Duration.seconds(0.2), new KeyValue(label.textFillProperty(), Paint.valueOf("E63700"))));
timeline.play();
}
public void FadeToDefaultColour() {
Timeline timeline = new Timeline();
timeline.getKeyFrames().add(new KeyFrame(Duration.seconds(0.2), new KeyValue(label.textFillProperty(), Paint.valueOf("FF774D"))));
timeline.play();
}
}
Label.fxml:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>
<VBox xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="madoc.controllers.components.LabelController">
<Label fx:id="label"
text="TEXT"
onMouseEntered="#onMouseEntered"
onMouseExited="#onMouseExited">
</Label>
</VBox>
WelcomeSceneBuilder.fxml:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="madoc.controllers.scenes.WelcomeSceneController">
<fx:include source="./Label.fxml" [NOT WORKING WHEN I TRY TO SET AMOUNT DUE HERE]/>
</AnchorPane>
答案 0 :(得分:1)
添加到<fx:include>
元素中的属性/子元素适用于加载另一个fxml的结果,即在这种情况下,创建的对象类型为VBox
,而不是LabelController
。 VBox
不包含您要分配的属性。
您不能仅使用fxml来执行此操作。您需要使用控制器的initialize
方法来设置属性值:
WelcomeSceneController
@FXML
private LabelController labelController;
@FXML
private void initialize() {
labelController.setAmountDue(...);
}
WelcomeSceneBuilder.fxml
...
<fx:include source="./Label.fxml" fx:id="label"/>
...
您可以使用the Custom Component approach,尽管这会使控制器和节点成为同一对象,从而使您可以进行此类分配。缺乏节点的职责,我保留LabelController
,但是您当然应该选择一个更好的名称。
package madoc.controllers.components;
...
public class LabelController extends VBox {
public LabelController() {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/madoc/controllers/components/Label.fxml")); // TODO: replace with correct resoure path?
loader.setRoot(this);
loader.setController(this);
try {
loader.load();
} catch(IOException ex) {
throw new IllegalStateException("Could not load fxml file", ex);
}
}
@FXML
public Label label;
// Define a variable to store the property
private final DoubleProperty amountDue = new SimpleDoubleProperty();
// Define a getter for the property's value
public final double getAmountDue(){return amountDue.get();}
// Define a setter for the property's value
public final void setAmountDue(double value){amountDue.set(value);}
// Define a getter for the property itself
public DoubleProperty amountDueProperty() {return amountDue;}
...
}
Label.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>
<fx:root xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
type="javafx.scene.layout.VBox">
<Label fx:id="label"
text="TEXT"
onMouseEntered="#onMouseEntered"
onMouseExited="#onMouseExited">
</Label>
</fx:root>
WelcomeSceneBuilder.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.AnchorPane?>
<?import madoc.controllers.components.LabelController?>
<AnchorPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="madoc.controllers.scenes.WelcomeSceneController">
<LabelController amountDue="30.05"/>
</AnchorPane>