嗨,我已经尝试过以下代码,在javafx的tableview中只显示一列mysql表,但它不起作用。
TableView table = new TableView();
private static ObservableList<ObservableList> data = FXCollections.observableArrayList();
TableColumn firstNameCol = new TableColumn("Username");
table.getColumns().addAll(firstNameCol);
firstNameCol.prefWidthProperty().bind(table.widthProperty().divide(1));
firstNameCol.setCellValueFactory(new PropertyValueFactory("Username"));
Connection conn_mysql;
conn_mysql = DBConnector.connect();
String SQL = "SELECT Username_name from Accounts";
ResultSet rs = conn_mysql.createStatement().executeQuery(SQL);
while (rs.next()) {
ObservableList<String> row = FXCollections.observableArrayList();
row.add(rs.getString("Username_name"));
data.add(row);
}
table.setItems(data);
答案 0 :(得分:1)
为什么您的代码无法运作
cellValueFactory
是一个函数,它将表示每一行的项映射到应该在该行和该列的单元格中显示的值。此函数表示为Callback
。 PropertyValueFactory
是一种便利实现,等同于
cellData -> cellData.getValue().xxxProperty()
或
cellData -> new ReadOnlyObjectWrapper(cellData.getValue().getXxx())
其中xxx
是PropertyValueFactory
中指定的名称,cellData
是CellDataFeatures
。
改进您的代码(为了清楚了解正在发生的事情并帮助解决问题)
如果您没有使用原始类型,您的代码会得到很大改善。即你应该做的
TableView<ObservableList<String>> table = new TableView<>();
private static ObservableList<ObservableList<String>> data = FXCollections.observableArrayList();
TableColumn<ObservableList<String>, String> firstNameCol = new TableColumn<>("Username");
在这里,您实际指定了TableView
和TableColumn
所代表的类型。每行由ObservableList<String>
表示,列中每个单元格的值由String
表示。
现在应该清楚为什么你的代码不起作用。 PropertyValueFactory
获取行的值,实际上是
ObservableList<String> row = ... ;
并尝试调用
row.UsernameProperty()
或
row.getUsername()
获取列的值。这两种方法都不存在。
解决问题
所以你应该将cellValueFactory
设置为查找代表该行的列表的第一个元素:
firstNameCol.setCellValueFactory(cellData -> {
ObservableList<String> rowValue = cellData.getValue();
String cellValue = rowValue.get(0);
return new ReadOnlyStringWrapper(cellValue);
});