2015-09-25 9 views
0

Привет, Я попытался использовать следующий код для отображения только одного столбца таблицы mysql в tableview для javafx, но он не работает.Как отобразить только один столбец таблицы mysql в Tableview (Javafx)?

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

Можете ли вы быть более описательный добавления что именно не работает? Если вы смотрите на исключения, добавьте stacktrace к вопросу. – ItachiUchiha

+0

@ItachiUchiha: Заголовок столбца Имя пользователя работает, но значения строк i.e getString («Username_name») не отображаются в виде таблицы. –

+0

Ряды [User1] Ряды [user2] Ряды [User3] Ряды [Пользователь4] данных [[User1], [Пользователь2], [User3], [Пользователь4]] –

ответ

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); 
}); 
+0

firstNameCol.setCellValueFactory (cellData -> cellData.getValue(). Username_nameProperty()); –

+0

Для приведенного выше кода отображается сообщение об ошибке: не удается найти метод символа getValue() –

+0

В моем коде вы получите это сообщение об ошибке? Код, который вы отправили в первом комментарии, не будет работать по причинам, указанным в ответе. –

Смежные вопросы