javafx,TableView:检测单元格上的双击

问题描述 投票:17回答:5

给定一个TableView,我需要检测单元格上的双击。

tableView.setOnMouseClicked(new EventHandler<MouseEvent>()
{
    @Override
    public void handle(MouseEvent event)
    {
        if(event.getClickCount()>1)
        {
            System.out.println("double clicked!");
        }
    }
});

如何确定单击鼠标的单元格?

tableview javafx-2
5个回答
29
投票

代码示例。 运行official tableview tutorial的“示例12-11:细胞编辑的替代解决方案”。 替换以下内容:

table.setEditable(false);
Callback<TableColumn, TableCell> cellFactory =
        new Callback<TableColumn, TableCell>() {
            public TableCell call(TableColumn p) {
                TableCell cell = new TableCell<Person, String>() {
                    @Override
                    public void updateItem(String item, boolean empty) {
                        super.updateItem(item, empty);
                        setText(empty ? null : getString());
                        setGraphic(null);
                    }

                    private String getString() {
                        return getItem() == null ? "" : getItem().toString();
                    }
                };

                cell.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());
                        }
                    }
                });
                return cell;
            }
        };

因为你的细胞是不可编辑的,所以不需要EditingCell。单元工厂用于单元渲染。因此,可以使用单元格的setGraphics()方法放置除默认Labeled之外的任何节点/控件。 IMO您无法直接访问默认单元格,因此您应该定义自己的单元工厂,以便能够在单元格上放置事件过滤器。


5
投票

JavaFX允许你为每个单元设置多个监听器(我不是说这是好还是坏,只是你可以)。如果您将代码设置为对特定列/行的特定侦听器执行响应,则每个侦听器都将执行您的代码。要捕获单元格鼠标单击,我使用以下内容:

table.setEditable(true);
table.getSelectionModel().setCellSelectionEnabled(true);  // selects cell only, not the whole row
table.setOnMouseClicked(new EventHandler<MouseEvent>() {
 @Override
 public void handle(MouseEvent click) {
  if (click.getClickCount() == 2) {
   @SuppressWarnings("rawtypes")
   TablePosition pos = table.getSelectionModel().getSelectedCells().get(0);
   int row = pos.getRow();
   int col = pos.getColumn();
   @SuppressWarnings("rawtypes")
   TableColumn column = pos.getTableColumn();
   String val = column.getCellData(row).toString(); System.out.println("Selected Value, " + val + ", Column: " + col + ", Row: " + row);
   if ( col == 2 ) { ... do something ... } 
   if ( col == 5 ) { ... do something ... } 
   if ( col == 6 ) { ... do something ... } 
   if ( col == 8 ) { ... do something ... } 
  }
 }
});

你可以从上面的代码中看到,在我希望基于鼠标点击做的事情的列上,我有代码:

if ( col == <int> ) { ... do something ... }

我还将这些列设置为不允许编辑:

thisCol.setEditable(false);

我要编辑的行我有.setEditable(true)但没有鼠标点击包含的响应。

单元格编辑默认为2次鼠标单击。您可以更改上面的代码以捕获单元格上的不同鼠标事件,这样您仍然可以通过2次鼠标单击编辑单元格,或打开URL,对话框等,以及由您确定的任何其他鼠标事件。 TableView允许您根据自己的想象力和编程技巧确定自己的功能。你不会坚持“我可以编辑它,或用它来发射鼠标事件。”你可以做到两个:)


2
投票

在侦听器的主体中添加以下内容,T是表记录的类型:

  @SuppressWarnings("rawtypes")
  ObservableList<TablePosition> cells = tableView.getSelectionModel().getSelectedCells();
  for( TablePosition< T, ? > cell : cells )
  {
     System.out.println( cell.getColumn());
  }// for

1
投票

使用单元工厂和创建单元节点的单元工厂创建单元格,在节点而不是tableView上放置鼠标事件处理程序或过滤器。


1
投票

在我的情况下,我使用下一个代码

tableViewObject.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent t) {
                if (t.getClickCount() == 2 && getSelectedItem() != null) {
                    SMPBLogger.logInfo("Double cliked", Boolean.TRUE);
                    if (listener != null) {
                        listener.doubleClicked(tableViewObject.this,getSelectedItem());
                    }
                }
            }
        });
© www.soinside.com 2019 - 2024. All rights reserved.