首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JavaFX 開發實戰日誌:從 TableView 到模態窗口的 30 天踩坑記

     編輯:Java 相關知識

專案背景

基於 JavaFX 的桌面應用開發,記錄 2016-12 到 2017-01 期間遇到的典型問題與解決方案,涵蓋 UI 組件、數據綁定、事件處理、場景切換等核心場景。

關鍵技術點總結

1. TableView 選中行獲取與數據編輯

  • 使用 tableView.getSelectionModel().getSelectedItem() 獲取選中行數據模型。
  • 編輯提交後需手動同步回數據庫,再刷新 TableView。
  • SceneBuilder 生成的 fx:id 不可重複,否則注入失敗拋異常。

2. 右鍵上下文菜單

private void initContextMenu() {
    tbFly.addEventHandler(MouseEvent.MOUSE_CLICKED, e -> {
        if (e.getButton() == MouseButton.PRIMARY) { // 左鍵也可觸發,視業務而定
            contextMenu.show(tbFly, e.getScreenX(), e.getScreenY());
        }
    });
}

註:JavaFX 8+ 直接綁定 ContextMenu 到 TableRow 更優雅:rowFactory 中設置。

3. 模態窗口(彈出編輯框)

Stage editStage = new Stage();
editStage.initModality(Modality.APPLICATION_MODAL); // 應用級模態,阻塞父窗口
editStage.initOwner(mainStage); // 設置擁有者,保證居中顯示
editStage.showAndWait(); // 阻塞直到關閉

4. 頁面跳轉與數據傳遞

  • 使用 static 字段 或 單例 Controller 持有跨場景共享數據,避免 new Controller() 導致實例不一致(空指針)。
  • FXML 加載後通過 loader.getController() 獲取控制器實例注入數據。

5. 日期時間處理

// java.util.Date → LocalDate(Java 8+)
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
// 或
LocalDate localDate = new java.sql.Date(date.getTime()).toLocalDate();

6. ComboBox 監聽與數據填充

comboBox.getSelectionModel().selectedItemProperty().addListener((obs, old, nw) -> {
    if (nw != null) handleTypeChange(nw);
});
// 填充枚舉或實體列表
comboBox.setItems(FXCollections.observableArrayList(MyEnum.values()));

7. 一鍵查詢靈感:動態構建查詢條件

遍歷模型字段,非空字段加入 Predicate 鏈,最終組合 Specification(JPA)或動態 SQL,避免大量 if-else 硬編碼。

避坑指南

  1. FXML 注入失敗:檢查 fx:id 與 Controller 字段名完全一致,包含大小寫。
  2. 空指針異常:@FXML 字段未初始化 → 確認 FXML 加載完成後才調用邏輯,或使用 initialize() 生命周期方法。
  3. UI 凍結:耗時操作(DB/網絡)必須放入 Task / Service 後台線程,完成後 Platform.runLater() 更新 UI。
  4. 內存洩漏:監聽器、綁定關係在 Controller 銷毀時解除,防止舊實例被 GC 持有。

總結

JavaFX 雖學習曲線陡峭,但掌握「FXML+Controller 分離」、「屬性綁定」、「後台任務」三大核心後,開發效率極高。建議多閱讀官方 JavaDoc,遇到 API 不熟時優先查文檔而非盲目試錯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved