2017-03-07 72 views
1

我知道這已經被問了100次,但我仍然無法設法使它工作。 我希望TableView充滿存儲在我的數據庫中的東西。用數據庫中的內容填充TableView

我得到了我一個空的TableView FXML(這裏的第一個問題:我應該設置列了嗎?)

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.control.Button?> 
<?import javafx.scene.control.Label?> 
<?import javafx.scene.control.MenuBar?> 
<?import javafx.scene.control.TableColumn?> 
<?import javafx.scene.control.TableView?> 
<?import javafx.scene.control.TextField?> 
<?import javafx.scene.layout.AnchorPane?> 

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.112" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sopraFx.extended.view.UserEditView"> 
    <children> 
     <MenuBar layoutY="2.0" prefHeight="32.0" prefWidth="507.0"> 

     </MenuBar> 
     <Button fx:id="logoutButton" layoutX="506.0" layoutY="2.0" mnemonicParsing="false" onAction="#handleCloseButtonAction" prefHeight="31.0" prefWidth="92.0" text="Zurück" /> 
     <TextField fx:id="tableEditName" layoutX="369.0" layoutY="59.0" prefHeight="31.0" prefWidth="124.0" promptText="Username" /> 
     <TextField fx:id="tableEditPassword" layoutX="369.0" layoutY="115.0" prefHeight="31.0" prefWidth="124.0" promptText="Password" /> 
     <TextField fx:id="tableEditEmail" layoutX="369.0" layoutY="165.0" prefHeight="31.0" prefWidth="124.0" promptText="E-Mail" /> 
     <Button fx:id="editButton" defaultButton="true" layoutX="527.0" layoutY="363.0" mnemonicParsing="false" text="Save" /> 
     <Label layoutX="14.0" layoutY="64.0" text="you want to edit" /> 
     <TableView fx:id="userEditTable" layoutX="6.0" layoutY="34.0" prefHeight="311.0" prefWidth="286.0"> 

     </TableView> 
    </children> 
</AnchorPane> 

這裏這個權利是我的方法得到的東西從數據庫中,進入的TableView 。我得到了索姆系統輸出打印,以檢查它是否給我正確的東西,它確實如此。問題是,我得到NullPointerExpections在 「tableview.getColums()addAll.col。」

這是代碼:

public void initialize() { 


     TableView tableview = getUserTable(); 
     ObservableList<ObservableList> data; 
     Connection c; 
     data = FXCollections.observableArrayList(); 
     try{ 
      c = Database.getConnection(); 
      String SQL = "SELECT * FROM User"; 
      ResultSet rs = c.createStatement().executeQuery(SQL); 

      for(int i=0 ; i<rs.getMetaData().getColumnCount(); i++){ 
       //We are using non property style for making dynamic table 
       final int j = i; 
       TableColumn col = new TableColumn(rs.getMetaData().getColumnName(i+1)); 
       col.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ObservableList,String>,ObservableValue<String>>(){ 
        public ObservableValue<String> call(TableColumn.CellDataFeatures<ObservableList, String> param) { 
         return new SimpleStringProperty(param.getValue().get(j).toString()); 
        } 
       }); 

       tableview.getColumns().addAll(col); 
       System.out.println("Column ["+i+"] "); 
      } 
      while(rs.next()){ 
       //Iterate Row 
       ObservableList<String> row = FXCollections.observableArrayList(); 
       for(int i=1 ; i<=rs.getMetaData().getColumnCount(); i++){ 
        //Iterate Column 
        row.add(rs.getString(i)); 
       } 
       System.out.println("Row [1] added "+row); 
       data.add(row); 

      } 
      //FINALLY ADDED TO TableView 
      tableview.setItems(data); 
     }catch(Exception e){ 
      e.printStackTrace(); 
      System.out.println("Error on Building Data"); 
     } 

    } 

我通過教程一起,將方法:http://blog.ngopal.com.np/2011/10/19/dyanmic-tableview-data-from-database/comment-page-1/

編輯:

在控制器中,我有以下方法來顯示場景。

private Parent sceneUserEdit; 
private UserEditView viewUserEdit; 
public Parent userEditScene() throws SQLException { 
    Stage userEditStage = new Stage(); 
    FXMLLoader loader = new FXMLLoader(); 
    loader.setLocation(getClass().getResource("../view/UserEdit.fxml")); 
    try { 
     sceneUserEdit = loader.load(); 
     userEditStage.setTitle("SoPra JavaFX"); 
     userEditStage.setScene(new Scene(sceneUserEdit, 600, 400)); 
     userEditStage.show(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    viewUserEdit = loader.getController(); 
    viewUserEdit.setSimpleController(this); 
    initialize(); 


    return sceneUserEdit; 

} 

初始化方法在Controller中。 在UserEditView類我FXMLs整個的TableView和每個TableColumn中的getter結合這些

@FXML 
    private TableView<User> userTable; 
public TableView<User> getUserTable(){return userTable;} 
+0

所以'tableView'爲空?沒有人能真正診斷出你發佈的代碼。 –

+0

我認爲他不能找到TableView。在我的UserEditView類中,有一個用於TableView的getter – Panikx

+0

是的,我可以看到。顯然它返回null。沒有人可以告訴你爲什麼發生在您發佈的代碼中。 –

回答

1

在你FXML文件你有

<TableView fx:id="userEditTable" ... /> 

但在控制器,你有

@FXML 
private TableView<User> userTable; 

該字段的名稱需要匹配fx:id

+0

多麼愚蠢的錯誤,謝謝! – Panikx