使用来自database.Dailed设置行的数据填充TableView [英] Populating TableView with data from database.Failed to set rows

查看:106
本文介绍了使用来自database.Dailed设置行的数据填充TableView的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我从数据库中检索数据时,我碰到了一堵墙。我设法将列名添加到我的表中,这是好的,并且可以正常工作。

I hit a wall when i retrieve data from database.I managed to get column names into my table which is ok and works as it shoud.

当我的时候发芽尝试添加行,我发现没有数据添加到我的tableview中,我试图从表示单行的字符串数组中添加行。我不知道用户会询问多少列等查询以及表的大小是多少所以我不能创建行对象和代表每列的所有属性。

Bud when i try to add rows i find that no data has been added into my tableview,im trying to add rows from array of string which represent single row.I have no idea how many columns etc will user ask for with his query and how big table is so i cant create row object and all the properties which represent each column.

问题是如何使用我拥有的行填充我的tableview每行以String []的格式从数据库中成功检索。

Question is how do i populate my tableview with rows that i have retrieved successfully from database in format of String[] each row.


 private ObservableList<String[]> dataRows=FXCollections.observableArrayList();


检索行..(Works debug打印所有数据正确)

Retrieve rows..(Works debug prints all data correct)

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是我的两种方法

Working code for people who will encounter same problem as i did.Only needed factory was really ValueFactory.Here are my two methods

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


推荐答案

你需要设置一些工厂,如果你想让它工作。

You will need to set some Factories, if you want to get this working.

在下面的例子中,我没有从SQL服务器获取元素,但我相信会足以让你看到如何实现这一目标。

In the example below, I do not get elements from a SQL server, but I believe will be enough for you to see how to accomplish this.

请注意,它只是填充了顺序值,但它仍然会包含与标题一样多的列方法 createTable()

Note that it just fill with sequential values, but still it will have as many columns as the header in the method 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);
        }
    }
}

这篇关于使用来自database.Dailed设置行的数据填充TableView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆