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

JavaFX 開發實戰筆記:TableView、ContextMenu、頁面跳轉與數據封裝避坑指南

     編輯:Java 綜合教學

專案時間軸與核心功能落地

記錄 2016/12/04 ~ 2017/01/07 的 JavaFX 桌面應用開發過程,涵蓋 TableView 數據展示、右鍵菜單、模態窗口、頁面跳轉與數據傳遞等高頻場景。

TableView 選中行數據獲取與修改持久化

核心難點:獲取選中行對象 → 彈出修改窗口 → 保存到數據庫 → 刷新表格。關鍵代碼:

// 表格單擊事件獲取選中對象
tableView.setOnMouseClicked(event -> {
    if (event.getClickCount() == 2) { // 雙擊編輯
        Fly selected = tableView.getSelectionModel().getSelectedItem();
        if (selected != null) openEditDialog(selected);
    }
});

ContextMenu 右鍵菜單正確姿勢

初期誤以為需手動綁定 MOUSE_CLICKED 事件判斷右鍵,實際 ContextMenu 內部已處理,僅需:

ContextMenu cm = new ContextMenu();
MenuItem editItem = new MenuItem("修改");
MenuItem deleteItem = new MenuItem("刪除");
cm.getItems().addAll(editItem, deleteItem);

// 直接綁定到 TableView,右鍵自動彈出
tableView.setContextMenu(cm);

模態窗口阻斷父窗口交互

修改彈窗必須設置模態,否則用戶可繼續操作主界面導致數據不一致:

Stage dialog = new Stage();
dialog.initModality(Modality.APPLICATION_MODAL); // 應用級模態
dialog.initOwner(primaryStage); // 綁定父窗口
dialog.showAndWait(); // 阻斷直到關閉

頁面跳轉與數據傳遞:靜態持有者模式

早期 new Controller() 導致空指針,改用單例/靜態字段持有控制器引用:

public class ViewManager {
    private static MainController mainCtrl;
    private static EditController editCtrl;

    public static void setMainController(MainController c) { mainCtrl = c; }
    public static MainController getMainController() { return mainCtrl; }
    // 同理管理其他 Controller
}

FXML 加載後在 initialize() 中註冊:ViewManager.setMainController(this);,實現跨頁面數據共享。

日期轉換陷阱:java.util.Date → LocalDate

直接調用 date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(),或 Java 8+ 新增 Date.toLocalDate()(需確認版本)。避免手動拆解 year/month/day。

刪除操作安全性:二次確認對話框

Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
alert.setContentText("確定刪除該記錄?");
alert.showAndWait().ifPresent(response -> {
    if (response == ButtonType.OK) executeDelete();
});

Combobox 動態數據綁定與監聽

comboBox.getItems().addAll("選項1", "選項2");
comboBox.valueProperty().addListener((obs, old, val) -> {
    // 根據選中值動態載入關聯數據
    loadRelatedData(val);
});

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

原本糾結於 Map 比較,後改為「模型值變化即查詢」:定義 modelValue 保存當前表單狀態,表單任意字段變動觸發 requery(),極大簡化邏輯。

開發心得

  • 善用 SceneBuilder 但嚴防控件 ID 重複導致注入失敗。
  • 異常堆棧是最好的文檔,仔細閱讀 NullPointerException 行號定位問題。
  • 靜態持有者雖便利,但需注意內存洩漏,專案結束時手動清理引用。
  • API 文檔是效率倍增器,遇到轉換、格式化問題優先查 JDK 文檔。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved