Javafx中的动态TableView
我试图用sqlite数据库中的数据填充tableview,但它实际上不起作用。该bug必须位于“col.setCellValueFactory(…)”中的某个位置 我不是很喜欢javafx,所以如果你能帮助我,那就太好了:) 谢谢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,
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);