You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

双击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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 21:24:51