Author Topic: Como comparar valores en celda del jtable?  (Read 22008 times)

Dek

  • Newbie
  • *
  • Posts: 16
  • Karma: 0
    • View Profile
Como comparar valores en celda del jtable?
« on: Marzo 19, 2013, 11:01:58 am »
Saludos a la comunidad.

Aqui va mi duda:
Tengo un jtable llena con varios datos, dichos datos los tengo en una base de datos con mysql, hasta aqui todo bien.
Ahora logre implementar un jtable editable, es decir la celda que yo seleccione puedo modificarla y el cambio se actualiza tambien en la base de datos, hasta aqui todo bien.

Pero tengo un problema, como pudo comparar dos valores en dos celdas?
Para que se entienda, el jtable llena los datos de una tabla llamada torneos.
La tabla tiene 6 campos: equipo 1, No. Goles, Tipo, equipo 2, No.Goless, Tipoo

Muy poca imaginacion para dar nombre a los campos  :-[

Ahora al momento de realizar un registro, es decir Equipo1 VS Equipo2, los campos de los goles y el tipo pasan a tener un valor cualquiera, por ejemplo "nada".

Y aqui viene mi duda, como lo dije antes mi jtable es editable, entonces cuando edite los campos de No.Goles que automaticamente se asigne un valor a Tipo y Tipoo.

Seria realizar una comparacion de ambas celdas, para que dependiendo de cual tenga mas numero de goles automaticamente se asignen valores a Tipo y Tipoo, es decir Gana, Pierde o Pierde, Gana o Empate, Empate.
Como podria hacerlo?

Agradezco cualquier ayuda.

Saludos

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5466
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Como comparar valores en celda del jtable?
« Reply #1 on: Marzo 19, 2013, 11:43:47 am »
Hola:

Si el JTable tiene un DefaultTableModel, bien porque se lo has añadido tú, bien porque es el que lleva por defecto, puedes obtener ese modelo de esta forma

Code: [Select]
DefaultTableModel modelo = (DefaultTableModel)elJTable.getModel();
A ese modelo puedes añadirle un addTableModelListener() de forma que te avisarán en cuanto haya un cambio en el modelo, por ejemplo, porque una celda sea editada y cabmie el valor. En ese TableModelListener que le pasas, tendrás que revisar el contenido de las celdas que quieras y podrás cambiar en consecuencia otras celdas.

Se bueno.

Dek

  • Newbie
  • *
  • Posts: 16
  • Karma: 0
    • View Profile
Re: Como comparar valores en celda del jtable?
« Reply #2 on: Marzo 20, 2013, 02:49:34 am »
Algo mas o menos asi?
Code: [Select]
public void tableChanged( TableModelEvent e ) {
DefaultTableModel modelo = (DefaultTableModel)e.getSource();
int row = e.getFirstRow();
int column = e.getColumn();

String cellValue = String.valueOf( jTable1.getValueAt(row, column) );

JOptionPane.showMessageDialog(this,
"Value at (" + row + "," + column + ") changed to " + "\'" + cellValue + "\'");
}

Code: [Select]
public void actionPerformed( ActionEvent evt ) {
int row = jTable1.getSelectedRow();
int column = jTable1.getSelectedColumn();

if ( evt.getSource() == boton ) {
String value = String.valueOf( jTable1.getValueAt(row,column) );
JOptionPane.showMessageDialog( this,
"Value at (" + row + "," + column + ") is " + "\'" + value + "\'");
}
}
 

Selecciono la celda, y al dar clic en el boton me dice en que celda me encuentro y el valor que tiene.
La verdad no entiendo bien, soy bastante novato y la logica no la tengo muy clara.

Saludos

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5466
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Como comparar valores en celda del jtable?
« Reply #3 on: Marzo 20, 2013, 04:34:14 am »
Sí, a partir de ahí. En el DefaultTableModel tienes todos los datos del modelo. El event.getFirstRow() y e.getColumn() te ayudan a determinar qué celda es la que ha cambiado.

Se bueno.

Dek

  • Newbie
  • *
  • Posts: 16
  • Karma: 0
    • View Profile
Re: Como comparar valores en celda del jtable?
« Reply #4 on: Marzo 20, 2013, 06:35:39 am »
Ahora el problema, como implementar el metodo tablechanged dentro de otra clase?
Tengo una clase que implementa TableCellEditor para lo de la celda editable:

Code: [Select]
import java.awt.Component;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.AbstractCellEditor;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.event.TableModelEvent;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableColumn;
/**

 */
public class CellEdito extends AbstractCellEditor implements TableCellEditor{

    private data db;
    private String OldValue="";
    private String NewValue="";
    private String NameColum="";
    private String ID="";
    private JComponent component = new JTextField();
    private JComponent comp = new JComboBox();
   
    public CellEdito(data db, String NameColumn)
    {
            this.db = db;
            this.NameColum = NameColumn;
    }

  //  @Override
    public Object getCellEditorValue() {
        return ((JTextField)component).getText();
       
    }
   
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        OldValue = value.toString();
        ID = table.getValueAt(row,0).toString();
        ((JTextField)component).setText(value.toString());
        return component;
    }
    //@Override
    @Override
    public boolean stopCellEditing() {
       
         
             NewValue = (String)getCellEditorValue();
        if( !NewValue.equals(OldValue))
        { 
            int confirmar = JOptionPane.showConfirmDialog(null, "Realmente desea modifcar los datos", "Alerta", JOptionPane.YES_NO_OPTION);
            if(confirmar==JOptionPane.YES_OPTION) {
                try {
                    if( !db.modd( NameColum+"='"+NewValue+"' ", ID ) )
                {   
                    JOptionPane.showMessageDialog(null,"Error: No se puede actualizar");
                    ((JTextField)component).setText(OldValue);
                }
                } catch (SQLException ex) {
                    Logger.getLogger(CellEdito.class.getName()).log(Level.SEVERE, null, ex);
                }
               
            }
            else {
                System.out.println("Nada se modifico");
                ((JTextField)component).setText(OldValue);
            }
        }
       
        return super.stopCellEditing();
    }
       
       
   
}

Ahi es donde puedo editar X celda dependiendo de su ID, luego lanzo un cuadro de confirmacion, si la opcion es si entonces procede a modificar la informacion, si no pues entonces no pasa nada.

Segun yo, despues de lanzar el cuadro de dialogo deberia invocar a ese metodo, entonces si da en la opcion SI se modificara el dato y luego sabre cual celda fue, su valor y luego podre realizar una comparacion o no se, usar fireTableCellUpdated  :'(

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5466
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Como comparar valores en celda del jtable?
« Reply #5 on: Marzo 20, 2013, 11:11:13 am »
Hola:

El tablecelleditor y el DefaultTableModel son clases separadas, no necesitas hacer nada. Una vez edites, el JTable se encarga de cambiar el DefaultTableModel y este se encarga de llamar al fire

Se bueno.

Dek

  • Newbie
  • *
  • Posts: 16
  • Karma: 0
    • View Profile
Re: Como comparar valores en celda del jtable?
« Reply #6 on: Marzo 20, 2013, 12:11:06 pm »
Estoy confundido, entonces como recogeré el cambio en la celda?
Tal vez un ejemplo u algo de código ayudaría, como lo dije antes soy novato y me cuesta mucho entender la lógica.

Saludos

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5466
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Como comparar valores en celda del jtable?
« Reply #7 on: Marzo 20, 2013, 01:09:05 pm »
Hola:

Tú mismo has puesto el ejemplo

Code: [Select]
public void tableChanged( TableModelEvent e ) {
DefaultTableModel modelo = (DefaultTableModel)e.getSource();
int row = e.getFirstRow();
int column = e.getColumn();

String cellValue = String.valueOf( jTable1.getValueAt(row, column) );

JOptionPane.showMessageDialog(this,
"Value at (" + row + "," + column + ") changed to " + "\'" + cellValue + "\'");
}

No tienes que hacer nada especial, cuando el valor de la celda cambie, el JTable y el DefaultTableModel se encargarán ellos solitos de avisarte en ese método.

Se bueno.

Dek

  • Newbie
  • *
  • Posts: 16
  • Karma: 0
    • View Profile
Re: Como comparar valores en celda del jtable?
« Reply #8 on: Marzo 20, 2013, 01:45:49 pm »
Ese es precisamente el problema, en ningún momento me muestra el JOptionPane informándome que en la celda x hs cambiado el valor a x cosa.

Cuando yo editó alguna celda, al salir de ella me muestra un confirmdialog, este me pregunta si realmente quiero modificar. 
Si la opción es si entonces se realiza la modificación, si no entonces regresael vvalor que tenia la celda.

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5466
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Como comparar valores en celda del jtable?
« Reply #9 on: Marzo 20, 2013, 04:51:23 pm »
Hola:

Si en el JTable ves el dato cambiado después de haberlo modificado, debe avisar el solito a tu modelListener. Si no lo hace, lo más probable es que tengas por ahí varios modelos bailando y te hayas suscrito al que no es. Revisa en tu código que no haces ningún new de DefaultTableModel. El JTable ya tiene uno dentro y es el que debes utilizar.

Si usas tu propio modelo de datos (que no sea el DefaultTableModel), sólo tienes que llamar una vez a setModel() o pasarlo en el constructor del JTable y debes suscribirte al model después de haber hecho eso, aparte, ese modelo tuyo que implemente TableModel o AbstractTableModel, sí debe encargarse de recoger y avisar a los ModelListener.

Se bueno.

Dek

  • Newbie
  • *
  • Posts: 16
  • Karma: 0
    • View Profile
Re: Como comparar valores en celda del jtable?
« Reply #10 on: Marzo 21, 2013, 08:02:09 am »
Si hago un new de DefaultTableModel:
Code: [Select]
DefaultTableModel datos = new DefaultTableModel(dttorneos,columNames);
        jTable1.setModel(datos);

Entonces en el tableChanged:
Code: [Select]
public void tableChanged( TableModelEvent e ) {
DefaultTableModel datos = (DefaultTableModel)e.getSource(); //esto no es correcto?
               
                jTable1.setModel(datos);//agregue esto, pero al quitar lo del comentario de arriba me da error en el "datos"
               
int row = e.getFirstRow();
int column = e.getColumn();

String cellValue = String.valueOf( jTable1.getValueAt(row, column) );

JOptionPane.showMessageDialog(this,
"Value at (" + row + "," + column + ") changed to " + "\'" + cellValue + "\'");
}

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5466
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Como comparar valores en celda del jtable?
« Reply #11 on: Marzo 21, 2013, 12:05:35 pm »
Hola:

En algún momento harás el datos.addTableModelListener(....). Imagino que lo haces sobre datos o obteniéndolo de la tabla DESPUES de haber hecho el setModel()....

Se bueno.

Dek

  • Newbie
  • *
  • Posts: 16
  • Karma: 0
    • View Profile
Re: Como comparar valores en celda del jtable?
« Reply #12 on: Marzo 22, 2013, 07:24:19 am »
Excelente gracias por ayudar, ya logre hacerlo, con tu ayuda claro  ;D:
Code: [Select]
DefaultTableModel datos = new DefaultTableModel(dttorneos,columNames);
        datos.addTableModelListener(jTable1);
        jTable1.setModel(datos);
         datos.addTableModelListener(new TableModelListener() {

            @Override
            public void tableChanged(TableModelEvent e) {
                int row = e.getFirstRow();
int column = e.getColumn();
                DefaultTableModel datos = (DefaultTableModel)e.getSource();

String cellValue = String.valueOf( jTable1.getValueAt(row, column) );
                //JOptionPane.showMessageDialog(this,
//"Value at (" + row + "," + column + ") changed to " + "\'" + cellValue + "\'");
                System.out.println("Valor en"+ row+","+ column + "changed to" + "\'" + cellValue + "\'");
            }
        });
         
    }
    public void  fireTableCellUpdated (int column, int row){

               //aqui deberia realizar un if, o alguna forma de comparar los valores para luego hacer un update en la BD?
       
    }

En el fire deberia realizar un if, o algo para realizar una comparacion entre los valores de las 2 celdas, para luego hacer un update en la tabla de la BD?

Orientame un poco..  ;)
Saludos
« Last Edit: Marzo 22, 2013, 07:30:28 am by Dek »

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5466
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Como comparar valores en celda del jtable?
« Reply #13 on: Marzo 22, 2013, 12:10:50 pm »
El jtable tiene dentro un DefaultTableModel, no es necesario crear uno nuevo, bastaría con esto

Code: [Select]
DefaultTableModel datos = (DefaultTableModel)jTable1.getModel();
En principio y para lo que vas a hacer en el trozo de código que se ve, ni siquiera necesitas que sea DefaultTableModel, te valdría simplemente con esto

Code: [Select]
TableModel datos = jTable1.getModel();
Otro tema es que más adelante necesites usar métodos específicos de DefaultTableModel, entonces sí necesitas la primera línea que te he puesto en vez de la segunda.

Y ahora que tienes el TableModel, haces la parte del addTableModelListener() que has puesto

Code: [Select]
         datos.addTableModelListener(new TableModelListener() {

            @Override
            public void tableChanged(TableModelEvent e) {
                int row = e.getFirstRow();
int column = e.getColumn();
                DefaultTableModel datos = (DefaultTableModel)e.getSource();

String cellValue = String.valueOf( jTable1.getValueAt(row, column) );
                //JOptionPane.showMessageDialog(this,
//"Value at (" + row + "," + column + ") changed to " + "\'" + cellValue + "\'");
                System.out.println("Valor en"+ row+","+ column + "changed to" + "\'" + cellValue + "\'");
            }
        });

y ya está, no hay que hacer nada más. Si cambian los datos YA tiene que avisarte. No necesitas el fire para nada. El if que dices que tienes que colocar, debe ir dentro de el método tableChanged() que ya has hecho.

Más detalles, cuando a un jTable se le pasa un TableModel con setModel(), él mismo se encarga de llamar al addTableModelListener(), por lo que en tu trozo de código, sobra esa línea

Code: [Select]
DefaultTableModel datos = new DefaultTableModel(dttorneos,columNames);
        datos.addTableModelListener(jTable1);   // Sobra esta línea
        jTable1.setModel(datos);

Se bueno.

Dek

  • Newbie
  • *
  • Posts: 16
  • Karma: 0
    • View Profile
Re: Como comparar valores en celda del jtable?
« Reply #14 on: Marzo 23, 2013, 07:13:58 am »
Bien, muchas gracias por responder.
Si de hecho aunque mi codigo no esta del todo bien como tu dices, al modificar una celda si me avisa del cambio.
Aunque ahora ya no tengo la mas remota idea sobre como hacer la comparacion, ando buscando en san google sobre ello, pero aun no encuentro nada claro.

Saludos

 

ey