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

Ago*_*noX 18 tableview javafx-2

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

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

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

Ulu*_*Biy 30

代码示例.
运行"示例12-11:编辑替代解决方案单元格的"官方的tableview教程.
替换以下内容:

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;
            }
        };
Run Code Online (Sandbox Code Playgroud)

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


Vik*_*len 6

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 ... } 
  }
 }
});
Run Code Online (Sandbox Code Playgroud)

您可以从上面的代码中看到,我想基于鼠标单击来做某事的列上有代码:

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

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

thisCol.setEditable(false);

我要编辑的行具有.setEditable(true)但没有响应,但单击鼠标却没有响应。

单元格编辑默认为2次鼠标单击。您可以更改上面的代码以捕获单元格上的不同鼠标事件,因此仍然可以通过单击两次鼠标来编辑单元格,或者使用您确定的任何其他鼠标事件来打开URL,对话框等。通过TableView,您可以根据自己的想象力和编程技能来确定自己的功能。您不必担心“我可以编辑它,也可以用它触发鼠标事件”。你可以两者都做:)