Подтвердить что ты не робот

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

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

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

});

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

4b9b3361

Ответ 1

Пример кода.
Запустите Пример 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, так как ваши ячейки не могут быть изменены. Ячейка factory используется для рендеринга ячейки. Таким образом, любой элемент node/control, отличный от default Labeled, может использовать метод cell SetGraphics(). IMO, вы не можете напрямую обращаться к ячейке по умолчанию, поэтому вы должны определить свою собственную ячейку factory, чтобы иметь возможность помещать фильтр событий в ячейку.

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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