記錄 2016/12/04 ~ 2017/01/07 的 JavaFX 桌面應用開發過程,涵蓋 TableView 數據展示、右鍵菜單、模態窗口、頁面跳轉與數據傳遞等高頻場景。
核心難點:獲取選中行對象 → 彈出修改窗口 → 保存到數據庫 → 刷新表格。關鍵代碼:
// 表格單擊事件獲取選中對象
tableView.setOnMouseClicked(event -> {
if (event.getClickCount() == 2) { // 雙擊編輯
Fly selected = tableView.getSelectionModel().getSelectedItem();
if (selected != null) openEditDialog(selected);
}
});
初期誤以為需手動綁定 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);,實現跨頁面數據共享。
直接調用 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.getItems().addAll("選項1", "選項2");
comboBox.valueProperty().addListener((obs, old, val) -> {
// 根據選中值動態載入關聯數據
loadRelatedData(val);
});
原本糾結於 Map 比較,後改為「模型值變化即查詢」:定義 modelValue 保存當前表單狀態,表單任意字段變動觸發 requery(),極大簡化邏輯。
NullPointerException 行號定位問題。