如何在Tableview(Javafx)中只显示mysql表的单列?

时间:2015-09-25 08:36:42

标签: mysql javafx tableview

嗨,我已经尝试过以下代码,在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);

1 个答案:

答案 0 :(得分:1)

为什么您的代码无法运作

cellValueFactory是一个函数,它将表示每一行的项映射到应该在该行和该列的单元格中显示的值。此函数表示为CallbackPropertyValueFactory是一种便利实现,等同于

cellData -> cellData.getValue().xxxProperty()

cellData -> new ReadOnlyObjectWrapper(cellData.getValue().getXxx())

其中xxxPropertyValueFactory中指定的名称,cellDataCellDataFeatures

改进您的代码(为了清楚了解正在发生的事情并帮助解决问题)

如果您没有使用原始类型,您的代码会得到很大改善。即你应该做的

TableView<ObservableList<String>> table = new TableView<>();
private static ObservableList<ObservableList<String>> data = FXCollections.observableArrayList();

TableColumn<ObservableList<String>, String> firstNameCol = new TableColumn<>("Username");

在这里,您实际指定了TableViewTableColumn所代表的类型。每行由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);
});