Есть ли способ инициализировать переменную в контроллере и использовать ее в FXML? - PullRequest
1 голос
/ 31 мая 2019

Итак, я делал меню в FXML и использовал группу, поэтому мне пришлось установить prefWidth, иначе это выглядело бы странно.Для этого я хотел инициализировать переменную с шириной экрана в контроллере, а затем использовать переменную ширины при настройке меню в FXML.Но я просто не мог найти способ сделать это.

Обобщая эту проблему, я хочу инициализировать переменную в контроллере, а затем использовать ее в FXML следующим образом:

[Controller]

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>

Я знаю, есть другие способы сделать это (например, идентифицировать его и установить текст в контроллере), но я просто хочу увидетьесли это возможно сделать так.

Ответы [ 3 ]

1 голос
/ 31 мая 2019

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 для создания привязки свойство должно иметь мутаторы и аксессоры, как в примере.

1 голос
/ 31 мая 2019

Вместо переменной используйте свойство. Поместите это на уровне класса.

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>
0 голосов
/ 02 июня 2019

Попробуйте с привязкой.

Сначала поместите идентификатор на метку:

<Label fx:id="label" />

Затем объявите его в контроллере вида:

@FXML
private Label label;

Теперь вы должны создать StringProperty для вашей переменной:

private final StringProperty text = new SimpleStringProperty();

И, наконец, добавить привязку:

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