Javafx中的动态TableView

Javafx中的动态TableView,java,sqlite,dynamic,javafx,tableview,Java,Sqlite,Dynamic,Javafx,Tableview,我试图用sqlite数据库中的数据填充tableview,但它实际上不起作用。该bug必须位于“col.setCellValueFactory(…)”中的某个位置 我不是很喜欢javafx,所以如果你能帮助我,那就太好了:) 谢谢 public class DynamicTable{ ObservableList<ObservableList> data; @FXML TableView tableview; public void buildData(String table,

我试图用sqlite数据库中的数据填充tableview,但它实际上不起作用。该bug必须位于“col.setCellValueFactory(…)”中的某个位置

我不是很喜欢javafx,所以如果你能帮助我,那就太好了:)

谢谢

public class DynamicTable{

ObservableList<ObservableList> data;
@FXML TableView tableview;

public void buildData(String table, String filter){
    tableview=new TableView();
    String SQL=null;
    Connection c= DBController.getConnection();
    data = FXCollections.observableArrayList();
    try{
        switch(table){
            case "Kuenstler":{
                SQL="SELECT * FROM Kuenstler";
                break;
            }
            case "Kunstwerke":{
                SQL="SELECT * FROM Kunstwerk WHERE Kunststil_Name='"+filter+"'";
                break;
            }
            case "Museen":{
                SQL="SELECT Museum.Name, Adresse.Stadt FROM Museum JOIN Gebaeude JOIN Adresse ON Museum.GebaeudeID=Gebaeude.GebaeudeID AND Adresse.AdressID=Gebaeude.AdressID WHERE Stadt='"+filter+"'";
                break;
            }
            case "Sammlungen":{
                SQL="SELECT * FROM Sammlung";
                break;
            }
        }


        ResultSet rs = c.createStatement().executeQuery(SQL);
        //Bug must be in this for-loop
        for(int i=0 ; i<rs.getMetaData().getColumnCount(); i++){
            final int j = i;
            TableColumn col = new TableColumn(rs.getMetaData().getColumnName(i+1));
            col.setCellValueFactory(new Callback<CellDataFeatures<ObservableList,String>,ObservableValue<String>>(){
                public ObservableValue<String> call(CellDataFeatures<ObservableList, String> param) {
                    return new SimpleStringProperty(param.getValue().get(j).toString());
                }
            });

            tableview.getColumns().addAll(col);
            System.out.println("Column ["+i+"] ");
        }

        while(rs.next()){

            ObservableList<String> row = FXCollections.observableArrayList();
            for(int i=1 ; i<=rs.getMetaData().getColumnCount(); i++){
                row.add(rs.getString(i));
            }
            System.out.println("Row [1] added "+row );
            data.add(row);

        }           
        tableview.setItems(data);

    }catch(Exception e){
        e.printStackTrace();
        System.out.println("Error on Building Data");
    }

}
TableView:

<TableView fx:id="tableview" editable="false" layoutX="21.0" layoutY="72.0" prefHeight="309.0" prefWidth="558.0"/>

如果您放置注释
@FXML
,则无需再执行
新建TableView()
,因为所有属性都在您的FXML文件中。

什么是“它没有真正工作”?它编译吗?你有例外吗?会发生什么?它不会抛出任何异常,但tableview不会更改。(sql部分很好)intellij说“未经检查调用‘setCellValueFactory(…)”,这只是因为您到处使用原始类型,这是(非常)糟糕的做法,但并没有导致问题。您发布的代码在逻辑上没有任何错误,因此您的错误在别处。您在哪里调用
buildData
?在何处将新表添加到场景图?我不认为这与数据库有任何关系,所以你的问题应该包括一个可以在没有数据库资源的情况下执行的。做了一些编辑,谢谢你的帮助
<TableView fx:id="tableview" editable="false" layoutX="21.0" layoutY="72.0" prefHeight="309.0" prefWidth="558.0"/>
filterScene=new Scene(FXMLLoader.load(getClass().getResource("filter.fxml")),600,550);
mainStage.setScene(filterScene);