Javafx, TableView: обнаружение двойного щелчка на ячейке
Учитывая TableView, мне нужно обнаружить doubleclick в ячейке.
tableView.setOnMouseClicked(new EventHandler<MouseEvent>(){
@Override
public void handle(MouseEvent event) {
if (event.getClickCount()>1) {
System.out.println("double clicked!");
}
}
});
Как определить ячейку, на которую была нажата мышь?
Ответы
Ответ 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());
}
}
}
});