java - 动态 TableView 填充。错误 -"duplicate children added"。从数据库添加行时。适用于单行,失败多行

标签 java database javafx tableview rows

我有一个 Controller ,可以在 tableView 中显示数据库的结果。我的问题是仅适用于单行数据。如果我执行的查询的结果集包含多行,无法填充表

我得到的错误:

Exception in thread "JavaFX Application Thread" java.lang.IllegalArgumentException: Children: duplicate children added: parent = TableRow@7575a6e7[styleClass=cell indexed-cell table-row-cell]'null'
    at javafx.scene.Parent$2.onProposedChange(Parent.java:458)
    at com.sun.javafx.collections.VetoableListDecorator.setAll(VetoableListDecorator.java:115)
    at com.sun.javafx.scene.control.skin.TableRowSkinBase.updateCells(TableRowSkinBase.java:507)
    at com.sun.javafx.scene.control.skin.TableRowSkinBase.init(TableRowSkinBase.java:146)
    at com.sun.javafx.scene.control.skin.TableRowSkin.<init>(TableRowSkin.java:57)
    at javafx.scene.control.TableRow.createDefaultSkin(TableRow.java:217)
    at javafx.scene.control.Control.impl_processCSS(Control.java:876)
    at javafx.scene.Node.processCSS(Node.java:8732)
    at javafx.scene.Node.processCSS(Node.java:8725)
    at javafx.scene.Node.processCSS(Node.java:8725)
    at javafx.scene.Node.processCSS(Node.java:8725)
    at javafx.scene.Node.processCSS(Node.java:8725)
    at javafx.scene.Node.processCSS(Node.java:8725)
    at javafx.scene.Node.processCSS(Node.java:8725)
    at javafx.scene.Node.processCSS(Node.java:8725)
    at javafx.scene.Node.processCSS(Node.java:8725)
    at javafx.scene.Node.processCSS(Node.java:8725)
    at javafx.scene.Node.processCSS(Node.java:8725)
    at javafx.scene.Node.processCSS(Node.java:8725)
    at javafx.scene.Node.processCSS(Node.java:8725)
    at javafx.scene.Node.processCSS(Node.java:8725)
    at javafx.scene.Node.applyCss(Node.java:8825)
    at javafx.scene.Node.impl_processCSS(Node.java:8746)
    at com.sun.javafx.scene.control.skin.VirtualFlow.setCellIndex(VirtualFlow.java:1799)
    at com.sun.javafx.scene.control.skin.VirtualFlow.getCell(VirtualFlow.java:1689)
    at com.sun.javafx.scene.control.skin.VirtualFlow.getCellLength(VirtualFlow.java:1714)
    at com.sun.javafx.scene.control.skin.VirtualFlow.computeViewportOffset(VirtualFlow.java:2305)
    at com.sun.javafx.scene.control.skin.VirtualFlow.layoutChildren(VirtualFlow.java:1094)
    at javafx.scene.Parent.layout(Parent.java:1076)
    at javafx.scene.Parent.layout(Parent.java:1082)
    at javafx.scene.Parent.layout(Parent.java:1082)
    at javafx.scene.Parent.layout(Parent.java:1082)
    at javafx.scene.Parent.layout(Parent.java:1082)
    at javafx.scene.Parent.layout(Parent.java:1082)
    at javafx.scene.Parent.layout(Parent.java:1082)
    at javafx.scene.Parent.layout(Parent.java:1082)
    at javafx.scene.Parent.layout(Parent.java:1082)
    at javafx.scene.Parent.layout(Parent.java:1082)
    at javafx.scene.Parent.layout(Parent.java:1082)
    at javafx.scene.Parent.layout(Parent.java:1082)
    at javafx.scene.Scene.doLayoutPass(Scene.java:576)
    at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2386)
    at com.sun.javafx.tk.Toolkit$3.run(Toolkit.java:322)
    at com.sun.javafx.tk.Toolkit$3.run(Toolkit.java:320)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:320)
    at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:349)
    at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:479)
    at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:460)
    at com.sun.javafx.tk.quantum.QuantumToolkit$13.run(QuantumToolkit.java:327)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.access$300(WinApplication.java:39)
    at com.sun.glass.ui.win.WinApplication$4$1.run(WinApplication.java:112)
    at java.lang.Thread.run(Thread.java:744)

填充表的代码:

  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);
                }
            }
         //data included in dataRows are correct.//after printout debug


         dpcontroller.tableView.setItems(dataRows);//ERROR THROWN  IF MULTIPLE ROWS

        }

数据行是 private ObservableList<String[]> dataRows = FXCollections.observableArrayList();

String[0] 代表第一行..String[1] 第二行.. 等等

我不确定是什么原因造成的。我猜是我尝试将第二行应用到表的第一行中?我不知道如何解决这个问题。这个问题与我之前的问题Populating TableView with data from database.Failed to set rows有关我认为我解决了问题,但只解决了部分问题。

有什么解决办法吗?

最佳答案

我无法发布完整的答案,因为您没有发布 ValueFactory 类的实现(而且我真的看不出它需要引用行索引的任何原因)。但是,您添加列的次数过多:为表的每一行添加每列一次。您只需添加一次列。

您可能可以消除 populateTable 方法第一部分中的外部 for 循环:

private void populateTable() {
    for (TableColumn tc : columns) {
        // need to figure out how to remove rowNumber from this....
        tc.setCellValueFactory(new ValueFactory(columns.indexOf(tc), rowNumber));
        dpcontroller.tableView.getColumns().add(tc);
    }
    //data included in dataRows are correct.//after printout debug


    dpcontroller.tableView.setItems(dataRows);//ERROR THROWN  IF MULTIPLE ROWS

}

关于java - 动态 TableView 填充。错误 -"duplicate children added"。从数据库添加行时。适用于单行,失败多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24973334/

相关文章:

java - 如何用正则表达式截取URL

java - 使用 Stream-Java 8 替换文件中的文本

sql-server - 我在哪里可以找到有关如何编写数据透视 SQL 查询的指南或示例?

java - 使用流和 java8 创建对象列表的字段值的连接字符串

java - 如何检查Spring Boot使用的是什么数据库池?

SQL Server 数字到 varchar 的转换错误 : One server return an error and other server does not return an error

database - 使用 prisma ORM 在我的迁移中手动添加触发器

java - 如何使用AnimationTimer移动节点?

Javafx CSS 某些属性不起作用

java - 如何获得对 JavaFX 图表的低级别访问以便绘制图像?