JTable

gollum.mj
23 de Julio del 2008
Hola, creo que por lo que he visto no es muy intuitiva la utilización de las JTable, porque todo el mundo tiene dudas, yo entre ellos.

Mi problema es el siguiente, necesito recibir en una clase la notificación del evento de que los datos de una celda fueron actualizados.

Lo que tengo implementado es lo siguiente

import javax.swing.table.AbstractTableModel;
import javax.swing.table.*;
import javax.swing.event.*;
import java.util.*;

public class MyTableModel extends AbstractTableModel {

final String[] columnNames;
final Object[][] data;


public MyTableModel(Object[][] datos,String[] colNames){
columnNames=colNames;
data=datos;
}

public int getColumnCount() {
return columnNames.length;
}

public int getRowCount() {
return data.length;
}

public String getColumnName(int col) {
return columnNames[col];
}

public Object getValueAt(int row, int col) {
return data[row][col];
}

/*

public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}


public boolean isCellEditable(int row, int col) {
int count=getColumnCount();
if (count==4) {

switch(col) {
case 0:
return true;
//setValueAt("Nominal "+ row,row,col);
case 1:
if ((Boolean) getValueAt(row,1)){
setValueAt(new Boolean(true),row,2);
}
else {
setValueAt(new Boolean(false),row,2);
}
case 2:
if ((Boolean) getValueAt(row,2)){
setValueAt(new Boolean(true),row,1);
}
else {
setValueAt(new Boolean(false),row,1);
}
case 3:
return true;
default:
return false;
}
}
else{
return true;
}
}

public void setValueAt(Object value, int row, int col) {
data[row][col] = value;
fireTableCellUpdated(row, col);
// this.fireTableChanged(new TableModelEvent(this));
//this.fireTableDataChanged();
}


}

Este es mi modelo de la tabla, el cual funciona a la perfección, excepto porque no dispara los eventos o por ahí estoy haciendo mal algo.

En la clase que utiliza la JTable tengo lo siguiente:

public class ventana_recibo implements javax.swing.event.TableModelListener {

private void initComponents()
{

tableModel= new MyTableModel(
new Object [][] {
{"Nominal1", new Boolean(false),
new Boolean(false), new Integer(0)},
{"Nominal2", new Boolean(false),
new Boolean(false), new Integer(0)},
{"Nominal3",new Boolean(false),
new Boolean(false), new Integer(0)},
{"Nominal4", new Boolean(false),
new Boolean(false), new Integer(0)},
{"Nominal5", new Boolean(false),
new Boolean(false), new Integer(0)},
{"Nominal6", new Boolean(false),
new Boolean(false), new Integer(0)},
{"Nominal7", new Boolean(false),
new Boolean(false), new Integer(0)},
{"Nominal8", new Boolean(false),
new Boolean(false), new Integer(0)}
},

new String [] {"Concepto", "Días", "Horas", "$"});

tblNominal.setModel(tableModel);

tblNominal.addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(java.awt.event.MouseEvent evt) {
tblNominalMousePressed(evt);
}
});

tblNominal.getTableHeader().setReorderingAllowed(false);

tblNominal.setBounds(0,0,788,179);

tblNominal.getModel().addTableModelListener(this);

}

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);

javax.swing.JOptionPane.showConfirmDialog(null, data,"Test",0);
//...// Do something with the data...
}

}

La verdad que he probado todo lo que he encontrado, la idea es que al modificarse alguno de los campos que posee valores INT estos al ser importes actualicen un total que está en una etiqueta que obviamente no pertenece a la tabla.

Les agradezco su colaboración.

favrycio
23 de Julio del 2008
//ANADES UN KEYLYSTENER A LA TABLA
this.jTablePaquetes.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyReleased(final java.awt.event.KeyEvent evt) {
keyRealeaseTabla(evt);
}
});



//IMPLEMENTAS EL KEYLISTENER
private void keyRealeaseTabla(final java.awt.event.KeyEvent evt) {
if(evt.getKeyCode()==KeyEvent.VK_TAB || evt.getKeyCode()==KeyEvent.VK_ENTER){
//aqui lo que quieres que haga
}
}

gollum.mj
23 de Julio del 2008
Quiero comunicarte que tu solución tampoco funciona. No debés de haber leído con precausión como funciona la tabla que trato de implementar.

gollum.mj
23 de Julio del 2008
Claro, yo entiendo lo que proponés, pero quiero evitar tener que chequear eso, ya que también tendría que chequear el click del mouse, por si salen de la edición de la tabla con un click y demás listeners, cuando en realidad el código que estoy usando se supone que debería de funcionar, o por lo menos muchos lo ponene así en publicaciones. Igualmente gracias.