使用数据库中的数据填充TableView。无法设置行

【字号: 日期:2024-03-01浏览:33作者:雯心
如何解决使用数据库中的数据填充TableView。无法设置行?

如果要使此工作正常,则需要设置一些工厂。

在下面的示例中,我没有从sql Server获取元素,但是我相信足以让您了解如何完成此任务。

请注意,它仅填充了顺序值,但仍然具有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 {@Overridepublic Object call(Object column) { return new TableCell() {@Overrideprotected void updateItem(Object o, boolean b) { super.updateItem(o, b); setText(String.valueOf(o));} };} } private class CountingRowFactory implements Callback {@Overridepublic Object call(Object o) { TableRow row = new TableRow(); row.setUserData(rowIndex); rowIndex++; return row;} } private class CountingValueFactory implements Callback {@Overridepublic 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);} }}解决方法

当我从数据库中检索数据时,我碰壁了。我设法将列名放入我的表中,这可以正常工作并且应该工作。

当我尝试添加行时发芽,我发现没有数据添加到我的tableview中,我试图从代表单个行的字符串数组中添加行。我不知道用户会用他的查询请求多少列以及如何大表是这样,所以我不能创建行对象和代表每一列的所有属性。

问题 是如何用从数据库中成功检索到的行填充String表中的行,并以String []的形式填充每行。

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 debugdataRows.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。这是我的两种方法

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; }}

相关文章: