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