Problema con Jtable

Necesito hacer editable una celda y cuando precio enter, que ya no sea editable y pasar el cursor a otra para seguir llenando mi grid.

1 Respuesta

Respuesta
1
Disculpa la demora... tuve una semana muy ocupada... creo que lo que quieres es esto:
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.DefaultCellEditor;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.ListSelectionModel;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
public class PruebaJTable extends JTable{
public PruebaJTable(){
// Creamos el modelo de datos de la tabla
ModeloTabla modelo = new ModeloTabla();
// Agregamos las columnas de la tabla
modelo.addColumn("Columna 1");
modelo.addColumn("Columna 2");
modelo.addColumn("Columna 3");
// Agregamos algunas filas vacias
for( int i=0; i<10; i++)
modelo.addRow(new Object [] {new MiObjeto(),new MiObjeto(),new MiObjeto()});
// Le decimos a la tabla que use nuestro modelo
this.setModel(modelo);
// Esto es para decirle a nuestra tabla que solo puede
// Permitir seleccion de una sola celda
this.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
// Agregamos un oyente de modelo al modelo de la tabla
// El modelo es su mismo oyente porque la clase ModeloTabla
// implementa la interface TableModelListener
modelo.addTableModelListener(modelo);
// Un campo de texto que representara al editor de las celdas
JTextField campoEditorCelda = new JTextField();
// Los campos de texto que sirven como editores de celda no
// necesitan borde porque la cuadricula de la tabla hace las veces
// de borde
campoEditorCelda.setBorder(null);
// Establecemos el editor por defecto para la aquellas columnas cuyo tipo de dato
// sea la clase MiObjeto
this. SetDefaultEditor(MiObjeto.class, new DefaultCellEditor(campoEditorCelda){
// Reescribimos este método para poder crear nuestro objeto, basándonos
// en lo que hayan digitado en el campo de texto de la celda y devolverlo
// al modelo justo después que se termina la edición de la celda, es decir cuando
// el foco de la celda se pierde ya sea porque presionaron la tecla Enter, o Tab
// o hicieron click en otra celda o componente dentro de la ventana
public Object getCellEditorValue(){
// Creamos un nuevo objeto
MiObjeto nuevo = new MiObjeto();
// Despues que el objeto ha sido editado, lo marcamos como
// no editable, asi el modelo sabra que la celda donde se encuentra
// este objeto no puede ser editada
nuevo.esEditable = false;
// Obtenemos el texto digitado en el JTextField y lo guardamos
// en nuestro objeto
nuevo.valor = ((JTextField)this.editorComponent).getText();
// Finalmente retornamos nuestro nuevo objeto no-editable y
// el valor digitado que mas tarde sera usado por el modelo
return nuevo;
}
});
// Esta es una forma de hacer que se seleccione la celda de la proxima columna cuando
// se presiona la tecla Enter
this.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0,
false), "selectNextColumn");
}
// El modelo de nuestra tabla
class ModeloTabla extends DefaultTableModel implements TableModelListener{
// Reescribimos este metodo para controlar cuando una celda
// sera editable o no basados en los valores de row y col
public boolean isCellEditable(int row, int col){
// Obtenemos el objeto guardado en la fila y columna indicada
MiObjeto objeto = (MiObjeto) this.getValueAt(row, col);
// Finalmente retornamos el valor del atributo esEditable del objeto,
// si el valor es false la celda no puede ser editada
return objeto.esEditable;
}
// Reescribimos este método para que decirle a nuestro modelo
// que todas las columnas de nuestra tabla son de tipo MiObjeto
public Class getColumnClass(int col){
return MiObjeto.class;
}
// Este método es el invocado por oyente de cambios en el modelo,
// cada vez que ocurre un cambio en el modelo de datos de la tabla
public void tableChanged(TableModelEvent e) {
// Obtenemos el modelo que ha sido cambiado
DefaultTableModel modelo = (DefaultTableModel)e.getSource();
// La fila involucrada en el cambio
int row = e.getLastRow();
// la columna involucrada en el cambio
int col = e.getColumn();
// Si ninguna fila o columna ha sido modificada
if ( row == -1 || col == -1 ){
// no hacemos nada
return;
}
// Si el tipo de cambio fue de actualizacion
if (e.getType() == TableModelEvent.UPDATE ){
// Obtenemos el valor que se encuentra en la fila y columna involucradas en el cambio
Object value = modelo.getValueAt(row,col);
MiObjeto valor = (MiObjeto) value;
// Una bandera para ver cierta informacion... puedes removerla
System.out.println("row = "+row+", col = "+col+", value = "+value+", value class = "+value.getClass());
// Esto solo es posible debido a que esta clase es una clase interna de PruebaJTable
PruebaJTable tabla = PruebaJTable.this;
// Si la columna seleccionada es la ultima
if ( col >= this.getColumnCount() - 1){
// nos movemos a la primera columna
tabla.setColumnSelectionInterval(0,0);
// Si no es la ultima fila
if ( row < this.getRowCount() - 1){
// nos movemos a la siguiente fila
tabla.setRowSelectionInterval(row+1,row+1);
}
}
}
}
}
// Objeto arbitrario que servirá para representar cada celda
class MiObjeto {
// atributo para saber si este objeto puede ser editado en la tabla
boolean esEditable;
// el valor del objeto
String valor;
public MiObjeto(){
// incicialmente el objeto es editable
esEditable = true;
valor = "";
}
// reescribimos este medoto para que el renderer de la tabla
// muestre el valor del objeto en lugar de PruebaJTable$MiObjeto@+HashCode
public String toString(){
return valor;
}
}
// El famoso metodo main para probar nuestra tabla
public static void main(String[] args) {
PruebaJTable tabla = new PruebaJTable();
JOptionPane.showMessageDialog(null, new JScrollPane(tabla));
System.exit(0);
}
}
Bueno eso es todo, espero que no sea demasiado tarde... y por favor no olvides finalizar la pregunta.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas