Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用FXML控制器从数据库检索数据并填充TableView(在FXML中定义)?_Java_Database_Javafx 8_Fxml - Fatal编程技术网

Java 如何使用FXML控制器从数据库检索数据并填充TableView(在FXML中定义)?

Java 如何使用FXML控制器从数据库检索数据并填充TableView(在FXML中定义)?,java,database,javafx-8,fxml,Java,Database,Javafx 8,Fxml,我不熟悉JavaFX和FXML,所以如果这是一个非常简单的问题,请原谅我。 例如,我想从数据库MySQL中检索数据,并将其放在FXML文件中定义的TableView中。我还想使这个TableView可编辑,并在用户进行一些更改时更新数据库 我读过 我已经找到了,但它不是很清楚,因为没有代码示例 我理解使用DataFX是可能的。我不想那样做 我理解可以使用控制器检索数据并填充表。我不知道最后一步该怎么做。有人有代码示例吗 假设我有一个数据库表people,其中包含名字和姓氏 我的FXML代码如下所

我不熟悉JavaFX和FXML,所以如果这是一个非常简单的问题,请原谅我。 例如,我想从数据库MySQL中检索数据,并将其放在FXML文件中定义的TableView中。我还想使这个TableView可编辑,并在用户进行一些更改时更新数据库

我读过

我已经找到了,但它不是很清楚,因为没有代码示例

我理解使用DataFX是可能的。我不想那样做

我理解可以使用控制器检索数据并填充表。我不知道最后一步该怎么做。有人有代码示例吗

假设我有一个数据库表people,其中包含名字和姓氏

我的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>
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;
  }
}

您可以像下面这样定义人员表的模型:

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

请参见填写问题表的部分。检索数据部分是Java的核心部分。搜索有关它的教程。但是要注意用检索到的数据更新JavaFXGUI。也就是说,DB抓取必须位于JavaFX主线程以外的其他线程中。为此,请使用JavaFX服务和任务。再次搜索JavaFX:background定期sql查询、JavaFX:GUI冻结DB查询等。谢谢。对不起,我没有看到那条线。下一次研究会更好:没问题。搜索时请参考高级搜索提示。你可以相信我,这是救命稻草。你为什么不想用DataFX呢?