【发布时间】: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