Java - Actualizar JTable en tiempo de ejecucion con AbstractTableModel

 
Vista:
sin imagen de perfil
Val: 10
Ha aumentado su posición en 3 puestos en Java (en relación al último mes)
Gráfica de Java

Actualizar JTable en tiempo de ejecucion con AbstractTableModel

Publicado por Paulino (2 intervenciones) el 13/09/2019 16:30:51
Hola, estoy haciendo una aplicación de uso personal, para practicar un poco, pero me he quedado un poco atascado. A ver si me podéis ayudar

Tengo un JFrame con 2 JTextField (txt_AliasCuenta y txt_IdCuenta), un JTable que se construye con un TableModel, este TableModel se crea con la clase (creada por mi) TablePersonalizada que extiende de AbstractTableModel y 3 JButon (crear, editar y eliminar)

En el JTable se muestra los registros de una tabla de MySQL. Los 3 botones hacen su cometido, crean, editan y eliminan registros de la bbdd, mi problema es al actualizar los datos que muestra el JTable una vez a editado o eliminado registros.

Después de haber ejecutado las consultas SQL, pongo la siguiente línea de código:
1
tabla.setModel((TableModel)new TablaPersonalizada());

Al añadir un nuevo registro me funciona correctamente, pero al editar o eliminar me da el siguiente error:

java.lang.IndexOutOfBoundsException: Index -1 out of bounds for length 2
at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
at java.base/java.util.Objects.checkIndex(Objects.java:372)
at java.base/java.util.ArrayList.get(ArrayList.java:458)
at CashFlow/vista.TablaPersonalizada.getValueAt(TablaPersonalizada.java:42)
at java.desktop/javax.swing.JTable.getValueAt(JTable.java:2706)
at CashFlow/controlador.ControladorCuentas.valueChanged(ControladorCuentas.java:91)
at java.desktop/javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:219)
at java.desktop/javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:199)
at java.desktop/javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:246)
at java.desktop/javax.swing.DefaultListSelectionModel.changeSelection(DefaultListSelectionModel.java:443)
at java.desktop/javax.swing.DefaultListSelectionModel.changeSelection(DefaultListSelectionModel.java:453)
at java.desktop/javax.swing.DefaultListSelectionModel.removeSelectionIntervalImpl(DefaultListSelectionModel.java:614)
at java.desktop/javax.swing.DefaultListSelectionModel.clearSelection(DefaultListSelectionModel.java:458)
at java.desktop/javax.swing.JTable.clearSelection(JTable.java:2124)
at java.desktop/javax.swing.JTable.clearSelectionAndLeadAnchor(JTable.java:2132)
at java.desktop/javax.swing.JTable.tableChanged(JTable.java:4375)
at java.desktop/javax.swing.JTable.setModel(JTable.java:3693)
at CashFlow/controlador.ControladorCuentas.actionPerformed(ControladorCuentas.java:78)
at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308)
at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279)
at java.desktop/java.awt.Component.processMouseEvent(Component.java:6632)
at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342)
at java.desktop/java.awt.Component.processEvent(Component.java:6397)
at java.desktop/java.awt.Container.processEvent(Container.java:2263)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5008)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4840)
at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4918)
at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4547)
at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4488)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2772)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4840)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

¿Alguien sabe porque me da este error y como solucionarlo?, gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Billy Joel
Val: 1.829
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Actualizar JTable en tiempo de ejecucion con AbstractTableModel

Publicado por Billy Joel (468 intervenciones) el 16/09/2019 18:02:33
Según la trama de errores deberías revisar que está pasando desde la clase TablaPersonalizada en la línea 42.

Una pregunta, como te conectas a la base de datos? podrías poner el código o un fragmento de como le haces... Estoy seguro que tengo una alternativa super genial.

Saludos,
Billy Joel
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 10
Ha aumentado su posición en 3 puestos en Java (en relación al último mes)
Gráfica de Java

Actualizar JTable en tiempo de ejecucion con AbstractTableModel

Publicado por Paulino (2 intervenciones) el 27/09/2019 17:14:21
Hola.

Perdona la tardanza en responder, estoy muy liado con el trabajo y como este proyecto es un tema personal no he podido dedicarle tiempo antes.

Te pego el código de la clase que se encarga de hacer la conexión a la base de datos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package modelo;
import java.sql.*;
 
public class Conexion {
 
	Connection miConexion = null;
 
	public Conexion() {
 
	}
 
	public Connection abreConexion() {
 
		try {
 
			miConexion = DriverManager.getConnection("jdbc:mysql://localhost:----/basedatos?useSSL=false&serverTimezone=UTC", "usuario", "pasword");
 
		} catch (Exception e){
			e.printStackTrace();
		}
 
		return miConexion;
	}
 
	public void cerrarConexion() {
		try {
			miConexion.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
 
}

He hecho unas modificaciones (he importado paquetes completos en lugar de varias clases del mismo paquete) y la línea 42 ahora es la 39, que se corresponde con la linea de "switch(columnIndex) {". Te pego la clase TablaPersonalizada

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package vista;
 
import java.util.List;
import javax.swing.event.TableModelEvent;
import javax.swing.table.*;
import modelo.*;
 
public class TablaPersonalizada extends AbstractTableModel{
 
	public TablaPersonalizada() {
		try {
			listaCtas= new ModeloCuentas(new Conexion());
			listCtas= listaCtas.getCuenta();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
 
	@Override
	public int getRowCount() {
 
		return listCtas.size();
	}
 
	@Override
	public int getColumnCount() {
 
		return 2;
	}
 
	@Override
	public Object getValueAt(int rowIndex, int columnIndex) {
		tempCuenta = (Cuenta)(listCtas.get(rowIndex));
 
		switch(columnIndex) {
		case 0:
			return tempCuenta.getIdCuenta();
		case 1:
			return tempCuenta.getNombreCuenta();
		default:
			return null;
		}
	}
 
	public String getColumnName(int columnIndex) {
		switch (columnIndex) {
		case 0:
			return "Id";
		case 1:
			return "Alias Cta";
		default:
			return null;
		}
	}
 
	 public void tableChanged(TableModelEvent e) {
	        int row = e.getFirstRow();
	        int column = e.getColumn();
	        TableModel model = (TableModel)e.getSource();
	        String columnName = model.getColumnName(column);
	        Object data = model.getValueAt(row, column);
 
	 }
 
 
	private ModeloCuentas listaCtas;
	private List<Cuenta> listCtas;
	private Cuenta tempCuenta;
}

En la clase Controlador tengo el CartaTabla() que se llama justo despues de haber ejecutado las secuencias SQL, para refrescar la información de la tabla, y es en el try catch del metodo CargaTabla, donde salta la excepción y me lanza la trama de errores. He comentado la el e.printStackTrace() y la aplicación funciona correctamente y evidentemente no me muestra la trama de errores, pero me molesta dejar esto así sin poder localizar y solucionar lo que pasa.Te pego también el código de esta clase.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package controlador;
 
import java.awt.*;
import java.awt.event.*;
import java.sql.ResultSet;
 
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
 
import modelo.*;
import vista.*;
 
public class ControladorCuentas implements ListSelectionListener, ActionListener{
 
	private String origen="";
	private VCuentas elmarco;
	private ModeloCuentas modeloCuentas =new ModeloCuentas(new Conexion() );
	private String textoNombre="";
 
 
	public ControladorCuentas(VCuentas vCuentas, String origen2) {
		this.elmarco=vCuentas;
		this.origen=origen2;
	}
 
 
 
	@Override
	public void actionPerformed(ActionEvent e) {
 
		switch (origen) {
		case "crear":
			textoNombre= elmarco.txt_AliasCuenta.getText();
 
			modeloCuentas.crearCuenta(textoNombre);
 
			elmarco.txt_AliasCuenta.setText("");
			elmarco.txt_IdCuenta.setText("");
			this.CargaTabla();
			elmarco.tabla.setVisible(true);
			break;
		case "editar":
			try {
			Integer id=Integer.parseInt(elmarco.txt_IdCuenta.getText());
			textoNombre= elmarco.txt_AliasCuenta.getText();
 
			modeloCuentas.editarCuenta(textoNombre, id);
			} catch (Exception e1)  {
				JPanel mensaje =new JPanel();
				JOptionPane.showMessageDialog(mensaje, "Error as de seleccionar un registro a editar");
			}
			elmarco.txt_AliasCuenta.setText("");
			elmarco.txt_IdCuenta.setText("");
			this.CargaTabla();
			elmarco.tabla.setVisible(true);
			break;
		case "borrar":
			try {
			Integer id=Integer.parseInt(elmarco.txt_IdCuenta.getText());
 
			modeloCuentas.borrarrCuenta(id);
			} catch (Exception e1)  {
				JPanel mensaje =new JPanel();
				JOptionPane.showMessageDialog(mensaje, "Error as de seleccionar un registro a editar");
			}
			elmarco.txt_AliasCuenta.setText("");
			elmarco.txt_IdCuenta.setText("");
			this.CargaTabla();
			elmarco.tabla.setVisible(true);
			break;
		}
 
	}
 
	@Override
	public void valueChanged(ListSelectionEvent e) {
		int filaSeleccionada= elmarco.tabla.getSelectedRow();
		String textoNombre= elmarco.tabla.getValueAt(filaSeleccionada, 1).toString();
		String textoID= elmarco.tabla.getValueAt(filaSeleccionada, 0).toString();
		elmarco.txt_AliasCuenta.setText(textoNombre);
		elmarco.txt_IdCuenta.setText(textoID);
	}
 
	void CargaTabla() {
 
		try {
 
			elmarco.tabla.setVisible(false);
			elmarco.mimodelo=new TablaPersonalizada();
			elmarco.tabla.setModel(elmarco.mimodelo);
			//elmarco.tabla.repaint();
 
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
 
 
}

Muchas gracias por tu ayuda.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar