JavaFX将控制器变量绑定到组件属性

时间:2017-07-28 02:15:26

标签: java javafx data-binding javafx-2 fxml

说我有一个带

的控制器
@FXML private ObservableList<String> myStrings = FXCollections.observableArrayList();

是否可以编写任何FXML,将ListView与myStrings作为项目连接?

我的第一次尝试是:

<ListView>
    <items fx:id="myStrings"/>
</ListView>

但是这抱怨fx:id在那个位置无效。我也试过

<ListView items="${controller.myStrings}"/>

......但它无法解决这个问题。

请不要发布此解决方案:

<ListView fx:id="myStringsListView"/>

// In controller
@FXML private ListView<String> myStringsListView;
@FXML public void initialize() {
    myStringsListView.setItems(myStrings);
}

这就是我现在正在做的事情,但这里的间接量和样板量让我受伤。

1 个答案:

答案 0 :(得分:5)

以下作品

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.control.ListView?>

<BorderPane xmlns:fx="http://javafx.com/fxml/1" fx:controller="ListViewController">
    <center>
        <ListView items="${controller.myStrings}" />
    </center>
</BorderPane>

使用以下控制器(主要区别,我认为,您要么没有为列表定义访问器方法,要么将其命名为错误):

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;

public class ListViewController {

    private final ObservableList<String> myStrings = FXCollections.observableArrayList();

    public ListViewController() {
        myStrings.addAll("One", "Two", "Three");
    }

    public ObservableList<String> getMyStrings() {
        return myStrings ;
    }
}

这个快速测试:

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class ListViewItemsFromControllerTest extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        primaryStage.setScene(new Scene(FXMLLoader.load(getClass().getResource("ListViewItemsFromController.fxml"))));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

产生

enter image description here