You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaFX实现点击表格行在新窗口加载全量数据库表格数据

解决方案

1. 定义全量数据实体类

创建对应数据库全量参数的实体类,包含所有字段的属性与getter方法:

public class FullBiscuit {
    private String name;
    private float sum;
    private int id;
    private LocalDate productionDate;
    private int stock;
    // 按需添加其他全量字段

    // 全参构造方法
    public FullBiscuit(String name, float sum, int id, LocalDate productionDate, int stock) {
        this.name = name;
        this.sum = sum;
        this.id = id;
        this.productionDate = productionDate;
        this.stock = stock;
    }

    // 所有字段的getter方法
    public String getName() { return name; }
    public float getSum() { return sum; }
    public int getId() { return id; }
    public LocalDate getProductionDate() { return productionDate; }
    public int getStock() { return stock; }
}

2. 编写全量数据查询方法

新增根据饼干名称查询全量数据的方法(使用PreparedStatement避免SQL注入):

public ObservableList<FullBiscuit> getFullBiscuitData(String biscuitName) {
    ObservableList<FullBiscuit> fullData = FXCollections.observableArrayList();
    String query = "SELECT * FROM biscuit WHERE название = ?"; // 替换为你的全量表名
    try (PreparedStatement stmt = connect_to_db().prepareStatement(query)) {
        stmt.setString(1, biscuitName);
        ResultSet resultSet = stmt.executeQuery();
        while (resultSet.next()) {
            fullData.add(new FullBiscuit(
                    resultSet.getString("название"),
                    resultSet.getFloat("sum"),
                    resultSet.getInt("id"),
                    resultSet.getDate("production_date").toLocalDate(),
                    resultSet.getInt("stock")
                    // 依次添加其他字段的读取逻辑
            ));
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return fullData;
}

3. 配置新窗口的FXML与Controller

新窗口FXML(示例命名为full-biscuit.fxml)

添加TableView并配置对应列:

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.layout.VBox?>

<VBox xmlns="http://javafx.com/javafx"
      xmlns:fx="http://javafx.com/fxml"
      fx:controller="com.example.demo.screens.FullBiscuitController"
      spacing="10" padding="10">
    <TableView fx:id="fullBiscuitTable">
        <columns>
            <TableColumn text="ID" fx:id="idCol"/>
            <TableColumn text="Название" fx:id="nameCol"/>
            <TableColumn text="Сумма" fx:id="sumCol"/>
            <TableColumn text="Дата производства" fx:id="dateCol"/>
            <TableColumn text="Запас" fx:id="stockCol"/>
            <!-- 添加其他全量字段对应的列 -->
        </columns>
    </TableView>
</VBox>

新窗口Controller(FullBiscuitController.java)

初始化表格列并实现全量数据加载逻辑:

public class FullBiscuitController implements Initializable {
    @FXML
    private TableView<FullBiscuit> fullBiscuitTable;
    @FXML
    private TableColumn<FullBiscuit, Integer> idCol;
    @FXML
    private TableColumn<FullBiscuit, String> nameCol;
    @FXML
    private TableColumn<FullBiscuit, Float> sumCol;
    @FXML
    private TableColumn<FullBiscuit, LocalDate> dateCol;
    @FXML
    private TableColumn<FullBiscuit, Integer> stockCol;

    // 替换为你的数据库工具类实例
    private final YourDBUtil dbUtil = new YourDBUtil();

    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {
        // 绑定表格列到实体类属性
        idCol.setCellValueFactory(new PropertyValueFactory<>("id"));
        nameCol.setCellValueFactory(new PropertyValueFactory<>("name"));
        sumCol.setCellValueFactory(new PropertyValueFactory<>("sum"));
        dateCol.setCellValueFactory(new PropertyValueFactory<>("productionDate"));
        stockCol.setCellValueFactory(new PropertyValueFactory<>("stock"));
        // 绑定其他列...
    }

    // 接收主窗口传递的名称并加载全量数据
    public void loadFullData(String biscuitName) {
        ObservableList<FullBiscuit> data = dbUtil.getFullBiscuitData(biscuitName);
        fullBiscuitTable.setItems(data);
    }
}

4. 修改主窗口点击事件逻辑

调整点击事件,传递选中行的名称给新窗口并触发全量数据加载:

viewBiscuit.setOnMouseClicked(e -> {
    if (e.getClickCount() == 1) { // 可改为2保持双击逻辑
        ViewBiscuit selectedItem = viewBiscuit.getSelectionModel().getSelectedItem();
        if (selectedItem == null) return;

        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("/com/example/demo/screens/full-biscuit.fxml"));
            Parent parent = loader.load();
            FullBiscuitController controller = loader.getController();
            controller.loadFullData(selectedItem.getName());

            Stage stage = new Stage();
            stage.initModality(Modality.APPLICATION_MODAL);
            stage.setTitle("Полные данные о печенье");
            stage.setScene(new Scene(parent));
            stage.showAndWait();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
});

内容的提问来源于stack exchange,提问作者Joy Kane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 16:23:27