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
相关产品推荐
相关产品推荐

