我有一个 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/