Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正在使用数据库中的数据填充TableView。无法设置行_Java_Database_Javafx_Tableview - Fatal编程技术网

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

Java 正在使用数据库中的数据填充TableView。无法设置行,java,database,javafx,tableview,Java,Database,Javafx,Tableview,当我从数据库中检索数据时,我遇到了麻烦。我设法将列名放入我的表中,这是正常的,并且可以正常工作 Bud当我尝试添加行时,我发现没有数据被添加到我的tableview中,我尝试从表示单行的字符串数组中添加行。我不知道用户在查询中需要多少列等,以及表有多大,因此我无法创建行对象和表示每列的所有属性 问题是如何用从数据库中成功检索到的行填充tableview,每行的格式为字符串[] 编辑-回答后的工作代码 为遇到和我一样问题的人编写代码。唯一需要的工厂是真正的ValueFactory。以下是我的两种方

当我从数据库中检索数据时,我遇到了麻烦。我设法将列名放入我的表中,这是正常的,并且可以正常工作

Bud当我尝试添加行时,我发现没有数据被添加到我的tableview中,我尝试从表示单行的字符串数组中添加行。我不知道用户在查询中需要多少列等,以及表有多大,因此我无法创建行对象和表示每列的所有属性

问题是如何用从数据库中成功检索到的行填充tableview,每行的格式为字符串[]

编辑-回答后的工作代码

为遇到和我一样问题的人编写代码。唯一需要的工厂是真正的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;
            }
        }
private void populateTable(){
对于(int rowNumber=0;rowNumber
如果要使其正常工作,您需要设置一些工厂

在下面的示例中,我没有从SQL server获取元素,但我相信这足以让您了解如何实现这一点

请注意,它只是用顺序值填充,但它的列数仍然与方法
createTable()
中的
标题的列数相同

包表;
导入com.sun.javafx.collections.ObservableListWrapper;
导入javafx.application.application;
导入javafx.beans.property.SimpleIntegerProperty;
导入javafx.collections.FXCollections;
导入javafx.collections.ObservableList;
导入javafx.scene.scene;
导入javafx.scene.control.TableCell;
导入javafx.scene.control.TableColumn;
导入javafx.scene.control.TableRow;
导入javafx.scene.control.TableView;
导入javafx.scene.layout.FlowPane;
导入javafx.stage.stage;
导入javafx.util.Callback;
导入java.util.Collections;
导入java.util.List;
公共类TableDemo扩展了应用程序{
私有int行索引=0;
私有int元素索引=0;
final TableView TableView=新TableView();
ObservableList dataRows=FXCollections.observableArrayList();
公共静态void main(字符串[]args){
发射(args);
}
@凌驾
公众假期开始(阶段){
FlowPane=新的FlowPane();
tableView.setRowFactory(新CountingRowFactory());
createTable();
pane.getChildren().add(tableView);
List items=Collections.singletonList(新对象());
tableView.setItems(数据行);
舞台场景(新场景(窗格));
stage.show();
}
private TableColumn createColumn(字符串标题){
TableColumn column=新的TableColumn(标题);
column.setCellFactory(新的CellFactory());
column.setCellValueFactory(新CountingValueFactory());
返回列;
}
私有静态类CellFactory实现回调{
@凌驾
公共对象调用(对象列){
返回新的TableCell(){
@凌驾
受保护的void updateItem(对象o,布尔b){
super.updateItem(o,b);
setText(String.valueOf(o));
}
};
}
}
私有类CountingRowFactory实现回调{
@凌驾
公共对象调用(对象o){
TableRow行=新TableRow();
row.setUserData(rowIndex);
rowIndex++;
返回行;
}
}
私有类CountingValueFactory实现回调{
@凌驾
公共对象调用(对象o){
SimpleIntegerProperty属性=新的SimpleIntegerProperty(elementIndex);
elementIndex++;
归还财产;
}
}
公共void createTable(){
字符串[]头={“a”、“b”、“c”、“d”、“e”、“f”、“g”、“h”};
for(字符串s:标题)
tableView.getColumns().add(createColumn);

对于(int i=0;我在这里创建
setCellFactory
?注意:我认为最好的方法是首先将sql行解析为一个对象,然后填充tableview。@Kylopardiun的问题是,当我不知道表有多大/用户将选择哪些列时,我不能使用该对象。我肯定不能为所有这些行创建对象e案例。我想我知道创建对象/属性并将它们放入可观察列表很容易。然后它应该可以工作,但我不能这样做。我到底需要cellFactory做什么?下面是一个在不知道有多少列的情况下添加列的示例。你可能可以从结果集元数据中获取标题。另一个例子有很多列无关的代码。可能重复感谢这个示例,它为我指明了正确的方向。我的代码现在与您的不同,真正需要的唯一工厂是值工厂。我猜这是因为回调中返回的SimpleIntegerProperty(在我的例子中是字符串)。
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

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