有没有办法在控制器中初始化变量,并在 FXML 中使用它?

所以,我在 FXML 中制作了一个菜单并且我正在使用一个组所以我必须设置一个 prefWidth 否则它看起来很奇怪。为此,我想在控制器中用屏幕宽度初始化一个变量,然后在 FXML 中设置菜单时使用宽度变量。但我就是找不到办法做到这一点。


概括这个问题,我想在控制器中初始化一个变量,然后像这样在 FXML 中使用它:


[控制器]


package sample;


import javafx.fxml.Initializable;

import java.net.URL;

import java.util.ResourceBundle;


public class Controller implements Initializable {

    @Override

    public void initialize (URL url, ResourceBundle resourceBundle) {

        String text = "test";

    }

}

[FXML]


<?import javafx.scene.control.Label?>

<?import javafx.scene.BorderPane?>


<BorderPane>

    <center>

        <label text="<!--use var 'text' here-->"/>

    </center>

</BorderPane>

我知道,还有其他方法可以做到这一点(比如识别它并在控制器中设置文本)但我只是想看看是否可以这样做。


凤凰求蛊
浏览 82回答 3
3回答

收到一只叮咚

FXMLLoader可以将 FXML 中的属性绑定到控制器中的另一个属性。因此,您可以在控制器中定义一个属性并使用其名称访问它的 FXML。控制器:public class Controller implements Initializable {&nbsp; &nbsp; private StringProperty title = new SimpleStringProperty(this, "title", "");&nbsp; &nbsp; public final StringProperty titleProperty() {&nbsp; &nbsp; &nbsp; &nbsp; return title;&nbsp; &nbsp; }&nbsp; &nbsp; public final void setTitle(String value) {&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; titleProperty().setValue(value);&nbsp;&nbsp; &nbsp; }&nbsp; &nbsp; public final String getTitle() {&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return title.getValue();&nbsp;&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public void initialize(URL location, ResourceBundle resources) {&nbsp; &nbsp; &nbsp; &nbsp; setTitle("test");&nbsp; &nbsp; }}动态XML:<BorderPane>&nbsp; &nbsp; <center>&nbsp; &nbsp; &nbsp; &nbsp; <label text="${controller.title}"/>&nbsp; &nbsp; </center></BorderPane>请注意,为了FXMLLoader创建绑定,属性应该像示例中那样具有修改器和访问器。

忽然笑

使用属性代替变量。将它放在类级别。public class Controller implements Initializable {&nbsp; &nbsp; private String text; // or use binding property&nbsp; &nbsp; public String getText() {&nbsp; &nbsp; &nbsp; &nbsp; return text;&nbsp; &nbsp; }&nbsp; &nbsp; public void setText(String text) {&nbsp; &nbsp; &nbsp; &nbsp; this.text = text;&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public void initialize(URL location, ResourceBundle resources) {&nbsp; &nbsp; &nbsp; &nbsp; text = "hello";&nbsp; &nbsp; }}FXML<BorderPane fx:controller="sample.Controller"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xmlns:fx="http://javafx.com/fxml">&nbsp; &nbsp; <center>&nbsp; &nbsp; &nbsp; &nbsp; <Label text="${controller.text}"/>&nbsp; &nbsp; </center></BorderPane>

吃鸡游戏

尝试绑定。首先,给标签添加一个 id:<Label fx:id="label" />然后,在视图的Controller中声明它:@FXMLprivate Label label;现在您必须为您的变量创建一个 StringProperty:private final StringProperty text = new SimpleStringProperty();最后,添加绑定:label.textProperty().bind(text);text.set("test");
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java