我有一个FXML文件,如下所示:
<GridPane alignment="CENTER" hgap="10.0" vgap="10.0"
xmlns:fx="http://javafx.com/fxml"
fx:controller="GUI.Controller">
<padding>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</padding>
<HBox spacing="10" alignment="bottom_right"
GridPane.columnIndex="1" GridPane.rowIndex="4">
<Button text="Sign In"
onAction="#handleSubmitButtonAction"/>
</HBox>
<TableView fx:id="tableView" GridPane.columnIndex="0" GridPane.rowIndex="0">
<columns>
<TableColumn fx:id="nameColumn" text="Event Name">
</TableColumn>
</columns>
</TableView>
和这样的控制器类:
public class Controller implements Initializable {
@FXML
private TableView<String> tableView;
@FXML
private TableColumn<String, String> nameColumn;
@FXML
private ObservableList <String> dataArray;
@Override
public void initialize(URL location, ResourceBundle resources) {
dataArray = FXCollections.observableArrayList();
nameColumn.setCellValueFactory(
new PropertyValueFactory<String, String>("nameColumn")
);
dataArray.add("hello");
dataArray.add("goodbye");
tableView.setItems(dataArray);
}
当我运行它时,我得到两列(不确定为什么 - 一个称为“事件名称”,另一个是空白)和两行,但行是空白的。您可以单击行,但其中没有数据。当我从代码中删除“hello”条目或“goodbye”条目时,该表只显示一行空行而不是两行。
我是Java的新手,并不确定为什么会这样。为什么他们的行显示,但数据没有显示?
答案 0 :(得分:2)
使用表的最佳方法是使用类来表示表中的数据。在您的示例中,我将String更改为TableModel,其中您有一个PropertyString名称问候语。现在,您可以轻松地使用此类在tabe中显示数据。
控制器:
public class Controller implements Initializable {
@FXML private TableView<TableModel> tableView;
@FXML private TableColumn<TableModel, String> nameColumn;
@FXML private ObservableList<TableModel> dataArray;
@Override public void initialize(URL location, ResourceBundle resources) {
//add data to Observable List
dataArray = FXCollections.observableArrayList(new TableModel("hello"), new TableModel("goodbye"));
//crete one column, name "greetings" is the same name property which is in TableModel
nameColumn.setCellValueFactory(new PropertyValueFactory<TableModel, String>("greetings"));
tableView.setItems(dataArray);
}
public static class TableModel {
StringProperty greetings = new SimpleStringProperty();
public TableModel(String greetings) {
this.greetings = new SimpleStringProperty(greetings);
}
public String getGreetings() {
return greetings.get();
}
public StringProperty greetingsProperty() {
return greetings;
}
public void setGreetings(String greetings) {
this.greetings.set(greetings);
}
}
}
您必须添加此代码才能解决两列问题。
<columnResizePolicy>
<TableView fx:constant="CONSTRAINED_RESIZE_POLICY"/>
</columnResizePolicy>
这是你的FXML,只有很小的变化。
<GridPane alignment="CENTER" hgap="10.0" vgap="10.0" xmlns:fx="http://javafx.com/fxml" fx:controller="GUI.Controller">
<padding>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0"/>
</padding>
<TableView fx:id="tableView" GridPane.columnIndex="0" GridPane.rowIndex="0">
<columnResizePolicy>
<TableView fx:constant="CONSTRAINED_RESIZE_POLICY"/>
</columnResizePolicy>
<columns>
<TableColumn fx:id="nameColumn" text="Event Name"/>
</columns>
</TableView>
<HBox spacing="10" alignment="bottom_right" GridPane.columnIndex="1" GridPane.rowIndex="1">
<Button text="Sign In" onAction="#handleSubmitButtonAction"/>
</HBox>
</GridPane>