2017-05-29 2 views
2

J'ai étudié de nombreuses questions et réponses différentes, mais je ne trouve pas celle qui semble fonctionner. Je suis novice en Java, mais j'ai de l'expérience dans une variété de langues et, jusqu'à présent (dans le contexte de ce que j'expérimente), je me sens un peu comme VBA, sauf que je dois construire les actions/fonctions que vous estimez devoir être déjà là. C'est, je pense, juste à ma propre inexpérience cependant.Java: Rafraîchissement de ma jTable après la mise à jour des données dans l'enfant jDialog

J'utilise Netbeans IDE 8.2 avec Java Runtime 1.80.

J'ai créé jFrame qui contient un jTable. Le jtable est construit avec des données comme ceci:

public void showTasks(Boolean removeID) { 
    ArrayList<Tasks> list = tasksList("SELECT * FROM tasks"); 
    JTable table = jTable1; 
    DefaultTableModel model = (DefaultTableModel) jTable1.getModel(); 
    Object[] row = new Object[4]; 
    for(int i=0;i<list.size();i++) { 
     row[0]=list.get(i).getId(); 
     row[1]=list.get(i).getName(); 
     row[2]=list.get(i).getDesc(); 
     row[3]=list.get(i).getDate(); 
     model.addRow(row); 
    } 
    // Remove the 'id' column from the table view 
    if(removeID) { table.removeColumn(table.getColumnModel().getColumn(0)); } 
} 

L'arrière-plan derrière cela est moins pertinent, mais essentiellement TasksList est une fonction qui applique la requête à une instruction SQL, renvoyant un ArrayList. Je construis mes lignes avec 4 colonnes, puis enlève la première colonne afin que 'ID' soit disponible mais pas visible (cette action finale a été séparée par test/expérimentation).

J'ai une autre zone de code qui ouvre un jDialog quand on clique sur une ligne, dans laquelle il est possible de mettre à jour la base de données MySQL.

Problème

Je suis en train de jeter dans un appel de fonction pour que « » rafraîchit les données du tableau lorsque le JDialog est fermé. J'ai temporairement ajouté dans un bouton au jFrame (où le jTable vit) pour tester/déboguer cette fonction. Cependant, je n'arrive pas à faire fonctionner ça. Le plus proche que j'ai réalisé est de rappeler showTasks (false), mais cette évidence ajoute simplement des lignes avec des données mises à jour, plutôt que de remplacer l'ensemble de données. Je ne suis pas sûr à 100% si la suppression de toutes les lignes, puis les reconstruire est «meilleure pratique». Comme je suis novice en Java, et que je peux encore l'examiner à partir d'une méthode erronée, je trouve difficile d'appliquer d'autres exemples à la mienne. Je ne peux pas sembler trouver un moyen de mettre en œuvre fireTableDataChanged().

Sûrement c'est un concept simple que je suis trop penser?

Edition - basé sur ci-dessous réponse

Y at-il une raison pour laquelle quelque chose comme cela serait considéré comme incorrect, si la suppression de toutes les lignes et les réintégrant dans est d'accord?

public void refreshTasks() { 
    DefaultTableModel model = (DefaultTableModel) jTable1.getModel(); 
    int row_total = model.getRowCount(); 
    for(int i= row_total -1;i>=0;i--) { 
     model.removeRow(i); 
    } 
showTasks(false); 
} 

Edit: bouton pour appeler des données mise à jour

fonctionne maintenant correctement (sinon mal) avec les éléments suivants:

private DefaultTableModel parentTable;  // To store the parent 'Task' table model 

public void setStart(int user,DefaultTableModel table) { 

    this.txt_taskID.setText(Integer.toString(user)); // Converts the ID to a string 
    addData(user);   // Populates the fields 
    parentTable = table; // Sets parent TableModel to a variable 

} 

Le code ci-dessus est appelé à partir du parent Jframe lorsque le La boîte de dialogue s'ouvre et transmet le modèle Table et l'ID de la ligne que je cherche à modifier. Le modèle de table est stocké dans parentTable.

Il y a aussi un bouton 'Enregistrer' et un bouton 'Annuler'. Je suis encore à séparer ceux-ci, et actuellement «Enregistrer» fait juste cela (mise à jour SQL et ainsi de suite).Mon bouton « Annuler » ferme la boîte de dialogue et rafraîchit la jtable, selon la fonction ci-dessous:

private void btn_CancelActionPerformed(java.awt.event.ActionEvent evt) { 

    this.setVisible(false);   // Hide the dialog 
    Menu menu = new Menu();   // for accessing the tasksList function 

    parentTable.setRowCount(0);  // Clears the jTable data 

    // jTable data is then 'rebuilt' using the new data 

    ArrayList<Tasks> list = menu.tasksList("SELECT * FROM tasks"); 
    Object[] row = new Object[4]; 
    for(int i=0;i<list.size();i++) { 
     row[0]=list.get(i).getId(); 
     row[1]=list.get(i).getName(); 
     row[2]=list.get(i).getDesc(); 
     row[3]=list.get(i).getDate(); 
     parentTable.addRow(row); 
    } 
} 

Répondre

2

Je ne suis pas 100% Assurez-vous de supprimer toutes les lignes, puis de les reconstruire est la meilleure pratique.

Oui c'est probablement la meilleure pratique.

La seule autre approche consiste à créer un TableModel complètement nouveau et à l'ajouter à la table en utilisant la méthode setModel(). Le problème de cette approche est qu'elle réinitialisera tous les rendus/éditeurs personnalisés que vous avez définis sur la table.

La meilleure façon de supprimer toutes les lignes de la DefaultTableModel est d'utiliser simplement:

model.setRowCount(0); 
+0

Merci - c'est sans aucun doute une méthode beaucoup plus simplifiée de supprimer les lignes actuelles. Pour une raison que je suis encore à découvrir, je ne peux pas invoquer la fonction 'refreshTasks' de la jDialog, En utilisant println comme une méthode de débogage, je peux voir que l'appel est correct, mais il ne veut pas modifier le modèle de table. La fonction 'refreshTasks' fonctionne comme prévu via l'utilisation d'un bouton sur le formulaire, mais pas à distance depuis jDialog. –

+1

@ChrisJ, passez une référence au TableModel lorsque vous créez la boîte de dialogue. Ensuite, lorsque l'utilisateur clique sur le bouton "Enregistrer", vous mettez simplement à jour les données dans le TableModel. La table va se repeindre. – camickr

+0

Merci - réussi à le faire fonctionner comme vous le souhaitez, et ont mis à jour mon code en utilisant vos suggestions! –

-1

Je ne sais pas comment vous voulez le faire, mais je vais vous donner l'exemple simple pour supprimer et rafraîchissante JTable peut-être que ça vous aide.

Ce btnDelete suivant DButton ajouté à JFrame pour la suppression de lignes de la table:

btnDelete.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      int rowIndex = table.getSelectedRow(); 
      if(rowIndex > -1) { 
       int x = (Integer) table.getModel().getValueAt(rowIndex, 0); 
       if (conn.removeContact(x) == true) { //here add your own code like removeID 

        model.removeRow(rowIndex); 
        lblInfo.setText("Contact deleted successfully."); 
        model.fireTableDataChanged(); 
       } else { 
        lblInfo.setText("Cannot remove at this time!"); 
       } 
      }else { 
       lblInfo.setText("At first you need select a row with single click!"); 
       return; 
      } 
     } 
    }); 

et ces codes suivants pour la table rafraîchissante de manière primitive:

btnRefresh.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      int rowCount = model.getRowCount(); 
      for (int i = rowCount - 1; i >= 0; i--) {//remove all rows 

       model.removeRow(i); 
      } 
      lblInfo.setText("Table datas updated successfully."); 

      for (Person p : conn.readAllContacts()) {//add all row from scratch 
       model.addRow(new Object[] { p.getId(), p.getName(), p.getLastName(), p.getPhone(), p.getEmail() }); 
      } 

     } 
    }); 
+0

Merci pour vos commentaires. Si la suppression et la reconstruction des données sont un moyen efficace/acceptable d'y parvenir, y a-t-il une raison pour que quelqu'un de plus concis comme celui-ci soit vicié/incorrect? (voir question éditée) –

+0

@ChrisJ non ce n'est pas incorrect mais pas le meilleur moyen. –

+0

Si vous voulez jeter un coup d'oeil pour ce lien: http://docs.oracle.com/javase/7/docs/api/javax/swing/table/AbstractTableModel.html#fireTableDataChanged%28%29 –