基於 JavaFX 的桌面應用開發,記錄 2016-12 到 2017-01 期間遇到的典型問題與解決方案,涵蓋 UI 組件、數據綁定、事件處理、場景切換等核心場景。
tableView.getSelectionModel().getSelectedItem() 獲取選中行數據模型。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 中設置。
Stage editStage = new Stage();
editStage.initModality(Modality.APPLICATION_MODAL); // 應用級模態,阻塞父窗口
editStage.initOwner(mainStage); // 設置擁有者,保證居中顯示
editStage.showAndWait(); // 阻塞直到關閉
new Controller() 導致實例不一致(空指針)。loader.getController() 獲取控制器實例注入數據。// java.util.Date → LocalDate(Java 8+)
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
// 或
LocalDate localDate = new java.sql.Date(date.getTime()).toLocalDate();
comboBox.getSelectionModel().selectedItemProperty().addListener((obs, old, nw) -> {
if (nw != null) handleTypeChange(nw);
});
// 填充枚舉或實體列表
comboBox.setItems(FXCollections.observableArrayList(MyEnum.values()));
遍歷模型字段,非空字段加入 Predicate 鏈,最終組合 Specification(JPA)或動態 SQL,避免大量 if-else 硬編碼。
initialize() 生命周期方法。Task / Service 後台線程,完成後 Platform.runLater() 更新 UI。JavaFX 雖學習曲線陡峭,但掌握「FXML+Controller 分離」、「屬性綁定」、「後台任務」三大核心後,開發效率極高。建議多閱讀官方 JavaDoc,遇到 API 不熟時優先查文檔而非盲目試錯。