【问题标题】:Dynamic TableView in JavafxJavafx 中的动态表视图
【发布时间】:2016-03-08 20:29:15
【问题描述】:

我正在尝试使用来自 sqlite-db 的数据填充 tableview,但它并没有真正起作用。该错误必须在“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");
    }

}

}

这就是我调用 buildData 的地方:

    DynamicTable dTable;
    @FXML ChoiceBox filter_choice;
    @FXML TextField filter_filter;
    @FXML
    public void handleSearch(ActionEvent event){
        dTable=new DynamicTable();
        System.out.println(filter_choice.getValue());
        dTable.buildData((String)filter_choice.getValue(),filter_filter.getText());
    }

表格视图:

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

【问题讨论】:

  • “它没有真正工作”是什么意思?它编译吗?你有例外吗?会发生什么?
  • 它没有抛出任何异常,但 tableview 没有改变。 (sql部分很好)
  • intellij 说“对 'setCellValueFactory(...)' 的未经检查的调用”
  • 嗯,这只是因为您到处都在使用原始类型,这是(非常)不好的做法,但不会导致问题。您发布的代码在逻辑上没有任何问题,因此您的错误在其他地方。你在哪里打电话给buildData?您在哪里将新表添加到场景图中?我不认为这与数据库有任何关系,所以edit 你的问题包括minimal reproducible example 可以在没有数据库资源的情况下执行。
  • 做了一些编辑,感谢您的帮助

标签: java sqlite dynamic javafx tableview


【解决方案1】:

如果你把注解@FXML你不需要更多的做new TableView()因为所有的属性都在你的fxml文件中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 2015-06-05
    • 2015-05-05
    • 1970-01-01
    • 2015-12-18
    • 2015-12-09
    • 1970-01-01
    相关资源
    最近更新 更多