双击MFXTableView行启动Controller问题:代码选中表格而非行
解决MFXTableView双击行启动Controller的问题
你的问题出在将鼠标点击事件绑定到了表格容器本身,而非表格的行组件上,导致无法精准响应行的双击操作。以下是两种可行的解决方法:
方法一:通过表格的RowFactory给每行绑定双击事件
这是最高效的方式,只需给表格设置一次行工厂,就能为所有行添加双击监听:
private void setTabellaVisite() { // 原有的列定义、过滤器等代码保持不变... // 添加行工厂,给每行绑定双击事件 tableVisite.setRowFactory(tv -> { MFXTableRow<VerbaleModel> row = new MFXTableRow<>(); row.setOnMouseClicked(event -> { // 判断双击且当前行不为空 if (event.getClickCount() == 2 && !row.isEmpty()) { VerbaleModel selectedVerbale = row.getItem(); openFittizioDemoController(selectedVerbale); } }); return row; }); tableVisite.autosizeColumnsOnInitialization(); tableVisite.setItems(FXCollections.observableArrayList(listVisite)); }
方法二:在单元格工厂中绑定双击事件
如果你需要针对特定列的单元格添加双击响应,可以修改列的setRowCellFactory逻辑:
idColumn.setRowCellFactory(column -> { MFXTableRowCell<VerbaleModel, Long> cell = new MFXTableRowCell<>(VerbaleModel::getID); cell.setOnMouseClicked(event -> { if (event.getClickCount() == 2) { VerbaleModel selectedItem = cell.getTableRow().getItem(); if (selectedItem != null) { openFittizioDemoController(selectedItem); } } }); return cell; });
注意:这种方式需要给每个列的单元格都添加监听,不如方法一高效,仅在特定场景下使用。
原代码失效原因
你之前的监听绑定在表格上,当点击表格空白区域时,tableVisite.getSelectionModel().getSelectedValues()可能还保留着之前选中的行,导致误触发;而通过行或单元格绑定监听,能确保只有点击行内容时才会触发逻辑,且能直接获取当前行的数据。
内容的提问来源于stack exchange,提问作者Federico Raimondi
相关产品推荐
相关产品推荐

