当我从数据库中检索数据时,我碰到了一堵墙。我设法将列名添加到我的表中,这是好的,并且可以正常工作。
当我尝试添加行时发现我发现没有数据添加到我的tableview中,我试图从表示单行的字符串数组中添加行。我不知道用户要求用多少列等查询以及大表的大小因此我无法创建行对象和代表每列的所有属性。问题是如何使用我在每行的String []格式中从数据库成功检索到的行填充我的tableview。
private ObservableList<String[]> dataRows=FXCollections.observableArrayList();
检索行..(Works调试打印所有数据正确)
while (this.resultSet.next()) {
for (int i = 1; i < this.resultSetMd.getColumnCount() + 1; i++) {
rows.add(resultSet.getString(i));
}
dataRows.add(rows.toArray(new String[rows.size()]));
rows.removeAll(rows);
//TODO DELETE row debugger debug
dataRows.forEach((r)->{
System.out.println("Row---------");
for(String s:r){
System.out.println("Debug row value- "+s);
}
});
添加到表格
private void populateTable() {
dpcontroller.tableView.getColumns().addAll(columns); //columns work
dpcontroller.tableView.setItems(dataRows); //no data entered
}
在回答后编辑工作代码
为遇到同样问题的人的工作代码。只需要工厂就是ValueFactory.Here是我的两种方法
private void populateTable() {
for (int rowNumber = 0; rowNumber < dataRows.size(); rowNumber++) {
for (TableColumn tc : columns) {
tc.setCellValueFactory(new ValueFactory(columns.indexOf(tc),rowNumber));
dpcontroller.tableView.getColumns().add(tc);
}
}
dpcontroller.tableView.setItems(dataRows);
}
private class ValueFactory implements Callback {
private int rowNumber;
private int columnNumber;
public ValueFactory(int columnNumber, int rowNumber) {
this.columnNumber = columnNumber;
this.rowNumber = rowNumber;
}
@Override
public Object call(Object o) {
SimpleStringProperty stringProperty = new SimpleStringProperty(dataRows.get(rowNumber)[columnNumber]);
return stringProperty;
}
}
答案 0 :(得分:2)
如果你想让它工作,你需要设置一些工厂。
在下面的示例中,我没有从SQL服务器获取元素,但我相信您已经足够了解如何实现此目的。
请注意,它只会填充顺序值,但它仍然会与方法header
中的createTable()
一样多。
package table;
import com.sun.javafx.collections.ObservableListWrapper;
import javafx.application.Application;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableRow;
import javafx.scene.control.TableView;
import javafx.scene.layout.FlowPane;
import javafx.stage.Stage;
import javafx.util.Callback;
import java.util.Collections;
import java.util.List;
public class TableDemo extends Application {
private int rowIndex = 0;
private int elementIndex = 0;
final TableView tableView = new TableView();
ObservableList<String[]> dataRows = FXCollections.observableArrayList();
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
FlowPane pane = new FlowPane();
tableView.setRowFactory(new CountingRowFactory());
createTable();
pane.getChildren().add(tableView);
List items = Collections.singletonList(new Object());
tableView.setItems(dataRows);
stage.setScene(new Scene(pane));
stage.show();
}
private TableColumn createColumn(String header) {
TableColumn column = new TableColumn(header);
column.setCellFactory(new CellFactory());
column.setCellValueFactory(new CountingValueFactory());
return column;
}
private static class CellFactory implements Callback {
@Override
public Object call(Object column) {
return new TableCell() {
@Override
protected void updateItem(Object o, boolean b) {
super.updateItem(o, b);
setText(String.valueOf(o));
}
};
}
}
private class CountingRowFactory implements Callback {
@Override
public Object call(Object o) {
TableRow row = new TableRow();
row.setUserData(rowIndex);
rowIndex++;
return row;
}
}
private class CountingValueFactory implements Callback {
@Override
public Object call(Object o) {
SimpleIntegerProperty property = new SimpleIntegerProperty(elementIndex);
elementIndex++;
return property;
}
}
public void createTable(){
String[] header = {"a","b","c","d","e","f","g","h"};
for(String s: header)
tableView.getColumns().add(createColumn(s));
for(int i=0;i<30;i++){
String[] temp = header;
for(int j=0;j<temp.length;j++)
temp[j] += + i ;
dataRows.add(temp);
}
}
}