[SOLUCIONADO] Duda sobre TableView y Listener Javafx

Iniciado por coke951, Julio 08, 2015, 05:54:21 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Julio 08, 2015, 05:54:21 PM Ultima modificación: Julio 09, 2015, 08:19:16 PM por Gabriela
Que tal!, estoy aprendiendo un poco sobre los Listener, mi objetivo es que cuando una celda es modificada entonces llame un método.
La celda representa la cantidad, por lo tanto si la celda de la cantidad de un producto es modificada quiero que vuelva a hacer los cálculos para saber cuanto sera el total, pero no logro hacer eso automáticamente, he tenido que utilizar un botón para que cada vez que haya una modificación en la cantidad de productos el usuario tenga que presionar el botón y calcular el total y de esta forma es un poco mas tediosa, me gustaría hacerlo automáticamente, si hay una modificación en la celda entonces vuelva a hacer los cálculos.

Según yo, esto se puede llevar a cabo utilizando un listener, soy nuevo en JavaFx, y me resulta un poco complicado, he mirado por Internet pero no logre encontrar lo que yo quería hacer.
Espero que me puedan ayudar.

Gracias de antemano.
Saludos!

Supongamos que tienes una columna, la cual su tipo es Sell (Un objeto Sell) y tipo de contenido será Integer, que representa la cantidad de productos, por ejemplo:

Código: java
TableColumn<Sell, Integer> columnCant = new TableColumn<>("Cantidad");


Ahora debemos de asignarle un EventListener que se disparará en el commit de una edición, es decir, cuando se termine de editar la celda:

Código: java
columnCant.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<Sell, Integer>>() {
    @Override
    public void handle(TableColumn.CellEditEvent<Sell, Integer> cell) {
        updateTotal(cell.getNewValue());
    }
});


El método getNewValue() obtiene el nuevo valor producto de la edición de la celda. No necesitas hacerle un cast ya que el tipo de dato de retorno será el especificado por generics en el TableColumn. Ahora este valor es pasado por parámetro al método updateTotal que actualizará el valor del total de la venta.

Que tal de nuevo Gus!

Lo he intentado con tu codigo, pero no me funciono. Esto fue lo que hice.

mi TableColumn lo tengo declarado de esta manera:
Código: java

@FXML
private TableColumn<Producto, Integer> cantidadColumna = new TableColumn<>("Cantidad");


y para lo segundo lo hice en el metodo initialize()
Código: java

cantidadColumna.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<Producto, Integer>>(){
@Override
public void handle(TableColumn.CellEditEvent<Producto, Integer> cell){
aplicarCosto(cell.getNewValue());
}
});


Me parece que he hecho todo bien, supongo que el problema esta en la forma en la que edito la celda de cantidad, para eso tengo un textfield en el cual al momento de seleccionar un item en el tableview, en el textfield aparece el actual cantidad de ese producto, al modificarlo se actualiza automáticamente en el tableview y no ocurre nada, pero entonces, mi mente tomo un alto grado de conciencia haha...

Tenia un método el cual escuchaba ese textfield para que lanzara un error si el usuario introdujera una letra o numero flotante, lo que hice fue que si cambia el numero entonces actualizara el precio total, y ahora mismo me funciona esta solución, no se como no se me ocurrió antes.

En fin, el código en esta respuesta es correcto? o algo hice mal? ¿es por la forma en la que estoy modificando la cantidad que no llama al evento?
Te adjunto una imagen de mi programa.


Muchas gracias por responderme Gus!
Saludos!

Hola Coke y disculpa la demora (estaba trabajando).

Primero, dado que mediante la anotación @FXML inyectas la dependencia de la columna, NO necesitas instanciar con new. Se supone que esa columna ya está definida en el FXML, con nombre y todo.

Código: java
@FXML private TableColumn<Producto, Integer> cantidadColumna;


Ahora, el código que yo te pasé es para hacer algo cuando se edita directamente en la celda. Tú has obtenido la fila actual seleccionada y has puesto los datos en el apartado derecho, para lo cual es correcto usar un listener para el TextField:

Código: java
txtCantidad.textProperty().addListener((observable, oldValue, newValue) -> {
    aplicatCosto(Integer.parseInt(newValue));
});


Lo anterior es lo mismo que:

Código: java
txtCantidad.textProperty().addListener(new ChangeListener<String>() {
    @Override
    public void changed(ObservableValue<? extends String> observable,
            String oldValue, String newValue) {
         aplicarCosto(Integer.parseInt(newValue));
    }
});


Con la diferencia que estoy usando Lambdas ( Java 8 ). Saludos.

Efectivamente es lo que sospechaba, yo lo modificaba desde el textfield, aun así para futuras situaciones donde sea necesario modificarlo desde la tabla utilizare tu codigo, todo esta solucionado ahora mismo.

Muchas gracias por explicarlo tan detalladamente Gus.

Saludos!