有没有一种方法可以在控制器中初始化变量,然后在FXML中使用它?

时间:2019-05-31 13:17:20

标签: java javafx fxml

因此,我正在FXML中创建菜单,并且正在使用Group,因此我必须设置prefWidth,否则看起来很奇怪。为此,我想用控制器中的屏幕宽度初始化一个变量,然后在FXML中设置菜单时使用width变量。但是我只是找不到办法。

概括这个问题,我想在控制器中初始化一个变量,然后像这样在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>

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

3 个答案:

答案 0 :(得分:1)

使用属性代替变量。将其放在班级上。

public class Controller implements Initializable {

    private String text; // or use binding property

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        text = "hello";
    }
}

FXML

<BorderPane fx:controller="sample.Controller"
            xmlns:fx="http://javafx.com/fxml">

    <center>
        <Label text="${controller.text}"/>

    </center>
</BorderPane>

答案 1 :(得分:0)

FXMLLoader可以将FXML中的属性绑定到控制器中的另一个属性。因此,您可以在控制器中定义属性,并使用其名称访问FXML。

控制器:

public class Controller implements Initializable {
    private StringProperty title = new SimpleStringProperty(this, "title", "");
    public final StringProperty titleProperty() {
        return title;
    }

    public final void setTitle(String value) { 
        titleProperty().setValue(value); 
    }

    public final String getTitle() { 
        return title.getValue(); 
    }

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        setTitle("test");
    }
}

FXML:

<BorderPane>
    <center>
        <label text="${controller.title}"/>
    </center>
</BorderPane>

请注意,为了使FXMLLoader创建绑定,属性应具有如示例中所示的变体和访问器。

答案 2 :(得分:0)

尝试绑定。

首先,在标签上放置一个id:

<Label fx:id="label" />

然后,在视图的Controller中声明它:

@FXML
private Label label;

现在,您必须为变量创建一个StringProperty:

private final StringProperty text = new SimpleStringProperty();

最后,添加绑定:

label.textProperty().bind(text);
text.set("test");