2017-10-08 4 views
0

J'ai une application de base de données qui utilise un jTable (en utilisant netbeans), j'ai ajouté un écouteur de modèle de table à jTable ainsi quand j'édite jTable il édite également la base de données (MySQL). Cela fonctionne cependant quand l'utilisateur clique sur le jTable et clique sur un bouton il cesse de fonctionner.TableModelListener fonctionne seulement parfois

Edit: Ive a réalisé qu'il arrête seulement travailler quand je lance "jTable1.setModel (DbUtils.resultSetToTableModel (mySql.UpdateTable()));" mettre à jour la table. Lorsque j'appuie sur un bouton qui exécute cette ligne, il cesse de fonctionner, n'importe quel autre bouton ou à tout autre moment et cela fonctionne.

pour mettre à jour la table:

public ResultSet UpdateTable(){ 

     Connection con = connect(); 
    try{ 
     Statement s = con.createStatement(); 
     ResultSet resultset; 
     resultset = s.executeQuery("select * from customera"); 
     return resultset; 
     } 
    catch(SQLException e){ 
     System.out.println(e.getMessage()); 
    } 
    return null; 
} 

}

tablemodellistener Classe:

import javax.swing.event.TableModelEvent; 
import javax.swing.event.TableModelListener; 

public class TableActionListener implements TableModelListener{ 

Rob1 r; 

public TableActionListener(){ 
    r = new Rob1(); 
    } 

public void tableChanged(TableModelEvent e){ 
    System.out.println("action"); 
    int id = r.getID(); 
    int column = e.getColumn(); 
    int row = e.getFirstRow(); 



    } 

} 

ajouté écouteur modèle de table comme si dans le constructeur:

jTable1.getModel().addTableModelListener(new TableActionListener()); 

pour obtenir la ligne cliqué j'ai ajouté ce code:

int id; 

private void jTable1MouseClicked(java.awt.event.MouseEvent evt) {          
    // TODO add your handling code here: 
    System.out.println(evt.getClickCount()); 

     int row = jTable1.getSelectedRow(); 
     int col = jTable1.getSelectedColumn(); 
     id = (int)jTable1.getModel().getValueAt(row, 0); 

} 

pour revenir id courant:

public int getID(){ 
    return id; 
} 
+0

Pouvez-vous être plus précis sur ce que vous voulez réaliser et comment est-ce que cela échoue? –

+1

Après setModel, l'écouteur écoute sur le modèle obsolète, il faut ajouter l'écouteur au nouveau modèle. Est-ce que cela pourrait être le problème? –

+0

Que voulez-vous dire "définir le modèle"? –

Répondre

1

Il fonctionne cependant lorsque l'utilisateur clique hors jtable et clique sur un bouton, il cesse de fonctionner.

Par défaut, l'éditeur de cellule de tableau est arrêté uniquement lorsque vous passez à une autre cellule de la table. Par conséquent, lorsque vous cliquez sur un autre composant, vous devez indiquer à la table d'arrêter la modification. Ensuite, les données seront sauvegardées et le TableModelListener sera appelé.

Consultez Table Stop Editing pour deux façons de le faire:

1) Ajouter une propriété à la table:

JTable table = new JTable(...); 
table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); 

2) Ajouter le code à l'auditeur de votre bouton:

if (table.isEditing()) 
    table.getCellEditor().stopCellEditing(); 

Vous pouvez également vérifier Table Cell Listener qui peut être plus approprié à utiliser à la place de TableModelListener.

+0

J'ai essayé ceci mais j'ai le même problème, j'ai édité mon article original pour montrer ce que j'ai découvert. –