FXML:将 TableViews 项 属性 绑定到控制器
FXML: Bind TableViews items property to controller
我在 FXML
中有一个 TableView
,我想将它的项目 属性 绑定到控制器中的列表(就像在 WPF
中一样),我的FXML
代码是这样的:
<TableView fx:controller="controllers.MyController" items="$controller.loggings">
<columns>
<TableColumn text="Nom">
<cellValueFactory>
<PropertyValueFactory property="name" />
</cellValueFactory>
</TableColumn>
<TableColumn text="Type">
<cellValueFactory>
<PropertyValueFactory property="type" />
</cellValueFactory>
</TableColumn>
</columns>
</TableView>
我的控制器如下:
public class MyController {
public ObservableList<Logging> loggings = FXCollections.observableArrayList();
@FXML
protected void initialize(){
loggings.add(new Logging(){{
setName("hilton");
setType("hotel");
}});
}
}
出于某种原因 Exception
启动。我做错了什么?
您的 FXML 文件有误。您必须将项目分配给控制器 class 内的 TableView
。
FXML 文件:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.cell.PropertyValueFactory?>
<TableView xmlns:fx="http://javafx.com/fxml" fx:controller="controllers.MyController" fx:id="tableView">
<columns>
<TableColumn text="Nom">
<cellValueFactory>
<PropertyValueFactory property="name" />
</cellValueFactory>
</TableColumn>
<TableColumn text="Type">
<cellValueFactory>
<PropertyValueFactory property="type" />
</cellValueFactory>
</TableColumn>
</columns>
</TableView>
控制器:
package controllers;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.control.TableView;
public class MyController {
@FXML
private TableView<Logging> tableView;
public ObservableList<Logging> loggings = FXCollections.observableArrayList();
@FXML
protected void initialize(){
loggings.add(new Logging(){{
setName("hilton");
setType("hotel");
}});
tableView.setItems(loggings);
}
}
您还没有声明 fx
命名空间:
<TableView xmlns:fx="http://javafx.com/fxml/1" fx:controller="controllers.MyController" items="$controller.loggings">
...
</TableView>
此外,控制器 class 需要为 loggings
字段包含一个 getter:
private final ObservableList<Logging> loggings = FXCollections.observableArrayList();
public ObservableList<Logging> getLoggings() {
return loggings;
}
注意: JavaFX 不考虑表达式绑定的字段,因此需要 getter。
我在 FXML
中有一个 TableView
,我想将它的项目 属性 绑定到控制器中的列表(就像在 WPF
中一样),我的FXML
代码是这样的:
<TableView fx:controller="controllers.MyController" items="$controller.loggings">
<columns>
<TableColumn text="Nom">
<cellValueFactory>
<PropertyValueFactory property="name" />
</cellValueFactory>
</TableColumn>
<TableColumn text="Type">
<cellValueFactory>
<PropertyValueFactory property="type" />
</cellValueFactory>
</TableColumn>
</columns>
</TableView>
我的控制器如下:
public class MyController {
public ObservableList<Logging> loggings = FXCollections.observableArrayList();
@FXML
protected void initialize(){
loggings.add(new Logging(){{
setName("hilton");
setType("hotel");
}});
}
}
出于某种原因 Exception
启动。我做错了什么?
您的 FXML 文件有误。您必须将项目分配给控制器 class 内的 TableView
。
FXML 文件:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.cell.PropertyValueFactory?>
<TableView xmlns:fx="http://javafx.com/fxml" fx:controller="controllers.MyController" fx:id="tableView">
<columns>
<TableColumn text="Nom">
<cellValueFactory>
<PropertyValueFactory property="name" />
</cellValueFactory>
</TableColumn>
<TableColumn text="Type">
<cellValueFactory>
<PropertyValueFactory property="type" />
</cellValueFactory>
</TableColumn>
</columns>
</TableView>
控制器:
package controllers;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.control.TableView;
public class MyController {
@FXML
private TableView<Logging> tableView;
public ObservableList<Logging> loggings = FXCollections.observableArrayList();
@FXML
protected void initialize(){
loggings.add(new Logging(){{
setName("hilton");
setType("hotel");
}});
tableView.setItems(loggings);
}
}
您还没有声明 fx
命名空间:
<TableView xmlns:fx="http://javafx.com/fxml/1" fx:controller="controllers.MyController" items="$controller.loggings">
...
</TableView>
此外,控制器 class 需要为 loggings
字段包含一个 getter:
private final ObservableList<Logging> loggings = FXCollections.observableArrayList();
public ObservableList<Logging> getLoggings() {
return loggings;
}
注意: JavaFX 不考虑表达式绑定的字段,因此需要 getter。