recorrer - javafx, TableView: detecta un doble clic en una celda
javafx tableview getitems (5)
Dado un TableView, necesito detectar el doble clic en una celda.
tableView.setOnMouseClicked(new EventHandler<MouseEvent>()
{
@Override
public void handle(MouseEvent event)
{
if(event.getClickCount()>1)
{
System.out.println("double clicked!");
}
}
});
¿Cómo determinar la celda en la que se ha hecho clic con el mouse?
Agregue lo siguiente en el cuerpo de su oyente, con T
el tipo de registro de su tabla:
@SuppressWarnings("rawtypes")
ObservableList<TablePosition> cells = tableView.getSelectionModel().getSelectedCells();
for( TablePosition< T, ? > cell : cells )
{
System.out.println( cell.getColumn());
}// for
Cree su celda usando una fábrica de celdas y en la fábrica de celdas que crea el nodo de la celda, coloque un controlador de eventos del mouse o filtre en el nodo en lugar de la vista de tabla.
Ejemplo de código.
Ejecute el "Ejemplo 12-11: Solución alternativa de edición de celdas" del tutorial oficial de tableview .
Reemplace los siguientes:
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;
}
};
No es necesario que EditingCell
ya que tus celdas no se pueden editar. Fábrica de células se utiliza para el procesamiento de células. Por lo tanto, se puede colocar cualquier nodo / control que no sea el Labeled
predeterminada utilizando el método setGraphics () En IMO, no puede acceder a la celda predeterminada directamente, por lo que debe definir su propia fábrica de celdas para poder poner el filtro de eventos en la celda.
En mi caso utilizo el siguiente código.
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());
}
}
}
});
JavaFX te permite configurar múltiples escuchas por celda (no estoy diciendo que esto sea bueno o malo, solo que puedes). Cada oyente ejecutará su código si tiene un código configurado para ejecutar una respuesta al oyente específico para la columna / fila específica. Para capturar clics del mouse de la celda, uso lo siguiente:
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 ... }
}
}
});
Puede ver en el código anterior, en las columnas que quiero hacer algo basado en un clic del ratón, tengo un código:
if ( col == <int> ) { ... do something ... }
También tengo esas columnas configuradas para no permitir la edición:
thisCol.setEditable(false);
Las filas que deseo editar tengo .setEditable(true)
pero no tengo una respuesta incluida con un clic del mouse.
La edición de celdas tiene como valor predeterminado 2 clics del mouse. Puede cambiar el código anterior para capturar diferentes eventos del mouse en una celda, por lo que aún puede editar la celda con 2 clics del mouse, o abrir una URL, un cuadro de diálogo, etc., con cualquier otro evento del mouse determinado por usted. TableView le permite determinar su propia funcionalidad basada en su imaginación y habilidades de programación. No te quedas con "Puedo editarlo o disparar un evento de mouse con él". Puedes hacer ambas cosas :)