当前位置: 首页 > 面试题库 >

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

沃学
2023-03-14
问题内容

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

当我尝试添加行时发芽,我发现没有数据添加到我的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 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。这是我的两种方法

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

问题答案:

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

在下面的示例中,我没有从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 {
        @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);
        }
    }
}


 类似资料:
  • 问题内容: 我一直在尝试使用从数据库查询的数据加载TableView,但似乎无法使其正常工作。 这是我第一次尝试用数据库查询项填充数据库的情况,以防我的代码看起来杂乱无章,而且效果不佳。 FXML是通过JavaFx SceneBuilder完成的。 这是数据库查询类: 这是通过JavaFx场景生成器生成的FXML脚本: 问题答案: 这是将数据从数据库填充到tableView的最佳解决方案。 这是参

  • 我知道这个问题已经问了100次了,但我还是没办法让它奏效。我希望TableView中充满存储在数据库中的内容。 我用一个空的TableView得到了我的FXML(这里的第一个问题:我应该已经设置列了吗?) 这就是我从数据库中获取数据并进入TableView的方法。我把som系统打印出来,检查它是否给了我正确的东西。问题是我在“tableview.getColums().addAll.col”中得到

  • 我试过使用和不使用。表和已成功创建,并包含迁移(insert-books)。 迁移是通过的,因为如果我添加了一个无效的insert(到一些不存在的表中),我会得到异常: 如何使用LiquiBase用insert-books.sql脚本中的数据填充数据库?

  • 问题内容: 我正在尝试使用我的Derby数据库数据填充Netbeans GUI-builder jTable。 我在Account.java类中使用以下代码: 理想情况下,我希望能够返回其中包含参数数据和列的tableModel,因为我知道在GUI中执行此方法是一种不好的做法。在线上的所有教程都没有显示如何将数据发送到另一个类,它们只是在GUI类中执行数据库代码。 我有一个错误,它看不到数据和列,

  • 我在Account.java类中使用以下代码: 理想情况下,我希望能够返回包含参数数据和列的tableModel,因为我知道在我的GUI中使用这种方法是不好的做法。所有在线教程都没有显示如何将数据发送到另一个类,它们只是在GUI类中执行数据库代码。 我有一个错误,它无法看到数据和列,因为它们是在我的方法的一个不可访问的部分中声明和使用的。在我完成这些之后,我需要找到一种方法来将它传递给我的GUI类