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);
}
}
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. –
@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
Merci - réussi à le faire fonctionner comme vous le souhaitez, et ont mis à jour mon code en utilisant vos suggestions! –