嗨,我尝试过以下代码在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);
最佳答案
为什么你的代码不起作用
cellValueFactory
是一个函数,它将表示每行的项目映射到应在该行和该列的单元格中显示的值。该函数表示为 Callback
。 PropertyValueFactory
是一个方便的实现,相当于
cellData -> cellData.getValue().xxxProperty()
或
cellData -> new ReadOnlyObjectWrapper(cellData.getValue().getXxx())
哪里xxx
是 PropertyValueFactory
中指定的名称和cellData
是 CellDataFeatures
.
改进您的代码(为了清楚地了解正在发生的情况并帮助修复它)
如果您不使用原始类型,您的代码将会大大改进。 IE。你应该这样做
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);
});
关于mysql - 如何在Tableview(Javafx)中仅显示mysql表的单列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32778097/