2014-07-17 85 views
0

我是JavaFX和FXML的新手,如果這是一個非常簡單的問題,請原諒我。 我想從數據庫(例如MySQL)中檢索數據,並將其放入FXML文件中定義的TableView中。我也想讓這個TableView可編輯,並在用戶進行一些更改時更新數據庫。如何使用FXML控制器從數據庫檢索數據並填充TableView(在FXML中定義)?

我讀過Mastering FXML

我發現this post但因爲沒有代碼的例子不是很清楚。

我明白它可以使用DataFX。我不想這樣做。

我的理解是可以使用控制器檢索數據填充表。我不知道如何做最後一步。有沒有人有代碼示例?

比方說,我有一個數據庫表people包含first_name,last_name

我FXML代碼如下所示:

<GridPane fx:controller="sample.Controller" xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10"> 

    <padding> 
     <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" /> 
    </padding> 

    <Label style="-fx-font: NORMAL 20 Tahoma;" text="Address Book" GridPane.columnIndex="0" GridPane.rowIndex="0"> 
    </Label> 

    <TableView fx:id="tableView" GridPane.columnIndex="0" GridPane.rowIndex="1"> 
     <columns> 
      <TableColumn text="First Name"></TableColumn> 
      <TableColumn text="Last Name"></TableColumn> 
     </columns> 
    </TableView> 

</GridPane> 
+0

參見[如何填充正在在FXML文件中定義的TableView中(http://stackoverflow.com/問題/ 11180884 /如何填充一個tableview-that-is-defined-in-an-fxml-file-that-is-in-in)爲零件「填充你的問題的表」。 「檢索數據」部分是Java的核心。搜索關於它的教程。但要成爲用檢索到的數據更新JavaFX GUI的工具。即,DB抓取必須位於除JavaFX主線程以外的其他線程中。爲此,使用JavaFX服務和任務。再次搜索「JavaFX:background periodic sql quering」,「JavaFX:GUI凍結數據庫查詢」等.GL。 –

+0

謝謝。抱歉,我沒有看到該線程。下次研究會更好:) – rfmind

+0

沒問題。搜索時請參閱「高級搜索提示」。這是你可以相信我的救星。 –

回答

0

可以定義爲百姓餐桌這樣一個模式:

public class People { 

    public People(String firstName, String lastName){ 
     this.firstName = new SimpleStringProperty(firstName); 
     this.lastName = new SimpleStringProperty(lastName); 
    } 

    private StringProperty firstName; 
    public void setFirstName(String value) { firstNameProperty().set(value); } 
    public String getFirstName() { return firstNameProperty().get(); } 
    public StringProperty firstNameProperty() { 
    return firstName; 
    } 
    private StringProperty lastName; 
    public void setLastName(String value) { lastNameProperty().set(value); } 
    public String getLastName() { return lastNameProperty().get(); } 
    public StringProperty lastNameProperty() { 
    return lastName; 
    } 
} 

然後定義一個方法,你檢索數據:

private ObservableList<People> fetchPeople(Connection con) throws SQLException { 
    logger.info("Fetching people from database"); 
    ObservableList<People> people = FXCollections.observableArrayList(); 

    Statement st = con.createStatement();  
    ResultSet rs = st.executeQuery("select * from people"); 
    while (rs.next()) { 
     people.add(new People(rs.getString("first_name"), rs.getString("last_name"))); 
    } 

    return people; 
    } 

此方法返回一個ObservableList<People>,您可以使用它來填充tableView例如:

Connection conn = getConnection(); 
ObservableList<People> people = fetchPeople(conn); 
ObservableList<TableColumn> columns = tableView.getColumns(); 
columns.get(0).setCellValueFactory(new PropertyValueFactory("firstName")); // asumming this column is the corresponding to firstName, you can also set an id to the column an refer to it with @FXML property 
columns.get(1).setCellValueFactory(new PropertyValueFactory("lastName")); // asumming this column is the corresponding to lastName, you can also set an id to the column an refer to it with @FXML property 
tableView.setItems(people); 

使用這種方法:setCellValueFactory(new PropertyValueFactory("firstName"));我們在模型綁定屬性firstNamePropertyTableView中的相應列。

此外,您可以使用函數來創建單元格中所需的值。如果你想要第三個欄,顯示的全名,這是你可以得到它:

columns.get(2).setCellValueFactory(param -> { 
    People p = (People)((CellDataFeatures) param).getValue(); 
    return new SimpleStringProperty(p.getFirstName() + " " + p.getLastName()); 
}); 
相關問題