20

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

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

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

4

5 回答 5

32

代码示例。
运行官方tableview教程的“示例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因为您的单元格不可编辑。细胞工厂用于细胞渲染。Labeled因此,可以使用单元格的 setGraphics() 方法放置除默认值以外的任何节点/控件。IMO 您不能直接访问默认单元格,因此您应该定义自己的单元格工厂以便能够将事件过滤器放在单元格上。

于 2012-09-25T21:36:35.243 回答
9

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 允许您根据自己的想象力和编程技能来确定自己的功能。你不会被“我可以编辑它,或者用它触发鼠标事件”所困。你可以两者都做:)

于 2015-09-07T15:59:53.657 回答
4

在您的侦听器正文中添加以下内容,并使用T您的表记录类型:

  @SuppressWarnings("rawtypes")
  ObservableList<TablePosition> cells = tableView.getSelectionModel().getSelectedCells();
  for( TablePosition< T, ? > cell : cells )
  {
     System.out.println( cell.getColumn());
  }// for
于 2012-09-26T03:52:12.407 回答
2

就我而言,我使用下一个代码

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());
                    }
                }
            }
        });
于 2013-09-03T10:17:58.447 回答
2

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

于 2012-09-19T17:10:36.413 回答