在JavaFX的TableView中检测单元格的双击事件

3

我正在尝试检测tableview中随机单元格的双击。检测双击不是问题,而是要确定哪个单元格已被双击。

table.addEventFilter(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {
            if (event.getClickCount() > 1) {
                System.out.println("double clicked!");
                TableCell c =  (TableCell) event.getSource();
                System.out.println("Cell text: " + c.getText());
            }
        }
    });

这是我构建表格的方法:

private void BuildTable() throws Exception
{
    /*Some initialisations etc*/

        for(int i=0; i<result.getMetaData().getColumnCount();i++)
        {
            final int j = i;
            TableColumn col = new TableColumn(result.getMetaData().getColumnName(i+1));
            col.setCellValueFactory(new Callback<CellDataFeatures<ObservableList,String>,ObservableValue<String>>(){
                public ObservableValue<String> call(CellDataFeatures<ObservableList, String> param)
                {
                    return new SimpleStringProperty(param.getValue().get(j).toString());
                }
            });
            table.getColumns().addAll(col);


        }
        while(result.next()){
            ObservableList<String> row = FXCollections.observableArrayList();
            for(int i = 1; i<=result.getMetaData().getColumnCount();i++){
                row.add(result.getString(i));
            }
            data.add(row);
        }
        table.setItems(data);
    }catch(Exception e){
        e.printStackTrace();
    }

}

这里的真正问题是我不能直接将其转换为 TableCell 类型。 有人能帮忙吗?非常感谢。

2个回答

4

不需要在表格上注册处理程序,而是需要在表格单元格本身上注册处理程序。为此,请在适当的TableColumn上使用单元格工厂。

例如,在标准表格示例(清单13.6)中添加以下代码。

firstNameCol.setCellFactory(new Callback<TableColumn<Person, String>, TableCell<Person, String>>() {
    @Override
    public TableCell<Person, String> call(TableColumn<Person, String> col) {
        final TableCell<Person, String> cell = new TableCell<Person, String>() {
            @Override
            public void updateItem(String firstName, boolean empty) {
                super.updateItem(firstName, empty);
                if (empty) {
                    setText(null);
                } else {
                    setText(firstName);
                }
            }
         };
         cell.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
             @Override
             public void handle(MouseEvent event) {
                 if (event.getClickCount() > 1) {
                     System.out.println("double click on "+cell.getItem());
                 }
             }
         });
         return cell ;
    }
});

嗯,我不确定我是否以正确的方式实现了它。 编辑:我添加了我构建表格的代码。 - user3488736
看起来没问题。只需在创建列时将 cellFactorycellValueFactory 添加到列中即可。 - James_D
JavaFX 8也是一样的吗? - miniHessel
谢谢,现在已经修复了。这段代码可以在Java 8中运行,但是你可以用lambda表达式替换Callback实现,从而降低代码的复杂度。 - James_D
谢谢。有没有办法让代码同时适用于Double、String和Integer?这段代码只能用于String,因为它定义了字符串并使用了setText方法。 - miniHessel
或者如果有更简单的方法。我只需要单元格元素,因为当用户单击它时,我会显示一个弹出窗口。 - miniHessel

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接