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

时间:2012-09-19 16:48:59

标签: tableview javafx-2

鉴于TableView,我需要检测单元格上的双击。

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

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

5 个答案:

答案 0 :(得分: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您无法直接访问默认单元格,因此您应该定义自己的单元工厂,以便能够在单元格上放置事件过滤器。

答案 1 :(得分:5)

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

<ion-content class="has-subheader">
        <ion-list>
            <ion-item class="item-thumbnail-left item-text-wrap" 
                      ng-repeat="item in MYRESULT " 
                      href="#/tab/dash/{{item.U_ID}}">
                <img ng-src="http://mydomain/Uimg/{{item.U_ID}}.jpg" />
            </ion-item>
        </ion-list>
</ion-content>

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

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);但没有点击鼠标的响应。

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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

答案 4 :(得分: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());
                    }
                }
            }
        });