javafx, TableView: обнаружение двойного щелчка на ячейке

учитывая TableView, мне нужно обнаружить двойной щелчок на ячейке.

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

Как определить ячейку, на которую была нажата мышь?

5 ответов


пример кода.
Запустите "Пример 12-11: Альтернативное Решение Редактирования Ячеек" of официальный 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;
            }
        };

не нужно EditingCell поскольку ваши ячейки не редактируются. Cell factory используется для рендеринга ячеек. Таким образом, можно поместить любой узел/элемент управления, отличный от default Labeled используя метод setGraphics () ячейки. IMO вы не можете получить доступ к ячейке по умолчанию напрямую, поэтому вы должны определить свою собственную фабрику ячеек чтобы иметь возможность поставить фильтр событий на мобильный.


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 позволяет определить свой собственный функциональность, основанная на вашем воображении и навыках программирования. Вы не застряли с "я могу либо отредактировать его, либо запустить событие мыши с ним."Вы можете сделать оба :)


добавьте следующее в тело вашего слушателя с помощью T тип записи таблицы :

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

создайте свою ячейку с помощью фабрики ячеек и в Фабрике ячеек, которая создает узел ячейки, поместите обработчик событий мыши или фильтр на узел, а не tableView.


в моем случае я использую следующий код

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