style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

¿Cómo clonar un JTable: Ayuda?

Hola, saludos a todos.

Mi duda es la siguiente:

Estoy implementado un JTable que hace uso de un Modelo_tabla personalizado este modelo hereda de DefaultTableModel. (Lo utilizo sólo para redefinir el metodo setEditable y para quitar la edición a unas columnas).

Las operaciones a realizar sobre la tabla son las de alta, baja y modificación de registros.

El caso es que si se quiere modificar uno o varios registros de la tabla pueden existir dos posible acciones:
- una en donde el usuario decida guardar los cambios modificados.
- y otra donde el usuario quiere cancelar las modificaciones hechas antes de guardarlas.

Es en este segundo punto donde surge el problema.

Tengo una idea la cual trata de hacer los siguiente:

JTable tabla_original = new JTable(new Modelo_tabla);

En donde tabla_original es la tabla que muestro en la interfaz, y antes de realizar las modificaciones (Esto es al presionar el botón modificar) declaro otra variable:

JTable tabla_respaldo = tabla_original;

En donde por lógica común ( No la del compilador java) se entiende que tabla_respaldo es una copia de mi tabla original y que los cambios que realice en mi tabla original no afecctara a mi tabla_respaldo y si quiero devolver mi tabla_original a un estado anterior simplemente sustituyo mi tabla_original por mi tabla_respaldo.

Esto no funciona igual al programarlo debido a que instancia A de un objeto X en java es una referencia a ese objeto creado en memorai y que cualquier otra instancia B que se realice del objeto X tiene un valor diferente pero si se realiza la asignación del contenido de A hacia B es una referencia al mismo objeto A y que los cambios que se relice en cualquiera de los dos objetos se vera reflejado en el otro.

También se que esto no aplica para los datos primitivos.

Con estas reglas no puedo realizar la operación que deseo, por que aunque realice una copia de tabla_original los cambios que se produzcan en uno de los objetos por ejemplo en mi tabla_original se vera reflejado en mi tabla_respaldo.

En internet investigue sobre como solucionarlo, y encontre algo sobre la interface Cloneable la cual sirve para crear copias de un objeto. Así que intente clonar el panel en donde se encuenta la tabla ( Por que pense si clono el panel, automaticamente obtengo la clonación de todos los componentes que lo conforman), realice lo dicho pero no obtuve resultados positivos, entonces trate de implementar lo mismo pero ahora solo sobre la clase Modelo_tabla (El modelo de mi tabla) y tampoco arrojo resultados favorables, ya que seguia afectando los cambios a las dos tablas.

A mi forma de entender lo que lei sobre clonar realice lo siguiente:

public Modelo_tabla extens DefaultTableModel implements Cloneable{

public object clone(){
try{
Object objeto = super.clone()
((Modelo_tabla)objeto).setValor_deEdicion(this.valor_deEdicion);
return objeto;
}catch(e){
System.out.println()e;
}
return null;
}//Fin método_ clone
}//Fin clase: Modelo_tabla

Al presionar el botón modificar

public void jButton_modificar(){
//Realizo la clonación, efectua la copia de mi tabla original
tabla_respaldo = (Modelo_tabla) ( (Modelo_tabla)this.vista.getJTable_original().getModel()).clone();
}

Pero al momento de realizar cambios afecta a las dos tablas y no logro separarlas.
Tal vez (Tengo la idea) de que a lo mejor el JTable y el DefaultTableModel no permite clonarse.

Estoy pensando en una solución, y es en la de crear una nueva tabla_respaldo con las mismas caracteristicas y funciones que la tabla_original, en este caso lo que tendría que hacer es agregarle uno a uno los datos de las celdas de la tabla_original a la tabla_respaldo, pero como pueden ver se mermaria el rendimiento por que que tal y llegan a ser una cantidad grande de datos.

Espero su respuesta, se que esta muy extensa la redacción pero no encontre forma mas reducida de redactarlo.

De antemano gracias.

Seguire investigando.

Saludos

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Nopalin

Un solo modelo

Pues lo que yo haría es crear otro table model, que extienda AbstractTableModel en lugar de DefaultTableModel, utilize una lista de objetos como fuente en lugar del array bidimensional del modelo default, y por medio de reflexión acceses a los campos del objeto. Este objeto tendrias dos banderas, la de baja y modificacion, cuando el usuario elimine un registro o lo modifique, accesas al objeto que representa esa fila y actualizas las banderas.

Ahora si no te quieres meter en tantas complicaciones, lo que tienes que hacer es hacer son dos objetos model con la misma informacion y listo.

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">