Jtable n'a pas d'actualisation/mise à jour des données
J'ai un problème avec JTable
/JScrollPane
. Mon tableau de données n'est pas rafraîchissant/mise à jour. Je suis à l'aide de DefultTableModel
et selon le code, tout est parfait et je n'ai pas toutes les erreurs. Aussi, j'ai un tableau avec la pagination et c'est pourquoi je suis à l'aide de l'action des auditeurs et des boutons "précédent" et "suivant". Je suis de passage à partir d'une autre fonction à la fonction qui est codé dans la classe où est JTable
. Le problème est que je remplis les tableaux qui contient des données pour la table, mais la table ne sera pas mise à jour/l'actualiser. Voici mon code. Merci d'avance.
BIG MODIFIER Ancien code a été supprimé. J'ai ajouté de nouveaux codes qui vont vous aider les gars et les filles à comprendre le problème que j'ai. Espérons que cela va aider. Ce qui concerne.
Premier ici est de classe qui montrent gui:
import javax.swing.*;
public class Glavni {
public static void main(String[] args) {
//TODO Auto-generated method stub
SwingUtilities.invokeLater(new Runnable() {
public void run() {
gui Scanner = new gui();
Scanner.setVisible(true);
}
});
}
}
Deuxième ici est de classe qui passent de la Chaîne graphique de la classe qui contient jtable
public class passDatatoTable {
public void passData(){
String str1,str2,str3,str4;
gui SendStringsToGUI = new gui();
for (int i =0;i<=10;i++){
str1="Column 1 of row: "+i;
str2="Column 2 of row: "+i;
str3="Column 3 of row: "+i;
str4="Column 4 of row: "+i;
SendStringsToGUI.WriteMonitorData(str1, str2, str3, str4);
}
}
}
Prochaine voici la déclaration de l'interface graphique (constructeur):
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class gui extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
String[][] data = new String[100][4];
String[] columnNames = new String[]{
"IP", "PC_NAME", "ttl", "db"
};
DefaultTableModel model = new DefaultTableModel(data,columnNames);
JTable table = new JTable(model);
JScrollPane scrollPane = new JScrollPane(table);
int i=0;
public void WriteMonitorData (String IP, String PC_NAME, String ttl, String gw)
{
System.out.println(IP);//just for testing (check if data was passed)
model.setValueAt(IP, i, 0);
model.setValueAt(PC_NAME, i, 1);
model.setValueAt(ttl, i, 2);
model.setValueAt(gw, i, 3);
i++;
model.fireTableDataChanged();
table.repaint();
scrollPane.repaint();
}
gui(){
JButton addData= new JButton("Add Data");
JButton next = new JButton("next");
JButton prev = new JButton("prev");
addData.addActionListener(this);
next.addActionListener(this);
prev.addActionListener(this);
JPanel panel = new JPanel(new BorderLayout());
JPanel buttonPanel = new JPanel();
buttonPanel.add(addData);
buttonPanel.add(prev);
buttonPanel.add(next);
panel.add(buttonPanel, BorderLayout.SOUTH);
panel.add(table.getTableHeader(), BorderLayout.PAGE_START);
panel.add(scrollPane, BorderLayout.CENTER);
getContentPane().add(panel);
}
Ici est actionListeners:
public void actionPerformed(ActionEvent e) {
if ("Add Data".equals(e.getActionCommand())){
passDatatoTable passSomeData = new passDatatoTable();
passSomeData.passData();
}
if ("next".equals(e.getActionCommand())) {
Rectangle rect = scrollPane.getVisibleRect();
JScrollBar bar = scrollPane.getVerticalScrollBar();
int blockIncr = scrollPane.getViewport().getViewRect().height;
bar.setValue(bar.getValue() + blockIncr);
scrollPane.scrollRectToVisible(rect);
}
if ("prev".equals(e.getActionCommand())) {
Rectangle rect = scrollPane.getVisibleRect();
JScrollBar bar = scrollPane.getVerticalScrollBar();
int blockIncr = scrollPane.getViewport().getViewRect().height;
bar.setValue(bar.getValue() - blockIncr);
scrollPane.scrollRectToVisible(rect);
}
}
OriginalL'auteur ZhiZha | 2012-09-28
Vous devez vous connecter pour publier un commentaire.
Votre première montre l'extrait de code ce:
JTable table = new JTable(model);
mais votre
gui()
constructeur montre:JTable table = new JTable(data, columnNames);
De vous initier la table deux fois. Une fois à l'aide de la
TableModel
(JTable(TableModel tm)
) l'autre à l'aide deJTable(int lignes,int colonnes)
ce n'est pas la bonne, lancer lesJTable
une fois dans le constructeur:Mise à JOUR:
Voici un exemple qui a un thread qui va commencer à 2,5 secinds après l'INTERFACE utilisateur est visible et modifier une valeur de la
JTable
:Soit vous utilisez
SwingUtilities
(que vous avez utilisé déjà dans votremain
méthode btw, de sorte que vous devez être familier avec elle - à moins que vous suffit de copier / coller de ce code à partir de quelque part sans savoir ce que cela signifie), ou vous fossé quiThread
et de le remplacer par unjavax.swing.Timer
qui est conçu pour effectuer des opérations sur les EDT à intervalles fixesEt maintenant, vous dormez sur l'EDT, ce qui le rend fondamentalement votre INTERFACE utilisateur ne répond pas. Ma suggestion pour le
SwingUtilities
appel n'était pas pour l'ensemble de laRunnable
, juste pour le mettre à jour le modèle de la partie. Je vous suggère fortement de lire le Swing simultanéité tutorielJe sais que le sommeil a été signifié. Mais simuler le chargement de données, ou des données réelles de chargement ne devrait pas arriver sur le EDT. Et pour un poste avec un nombre élevé de upvotes (haut moyen par rapport à d'autres Swing questions connexes), la réponse ne doit pas violer les Swing filetage règles de l'omi. Maintenant que c'est corrigé, je peux enlever mon bas de vote
-1 pour déclencher des événements sur le nom du modèle de la en exclusivité responsabilité de l'installateur modèle lui-même
OriginalL'auteur David Kroukamp
De ce que je comprends de commentaires, et la question, vous devez d'abord créé un
DefaultTableModel
par de transmettre les données sous forme de tableaux dans le constructeuret vous essayez de modifier le tableau par la suite par l'ajustement de ces tableaux. Qui n'ont aucun effet, puisque la
DefaultTableModel
ne pas utiliser ces tableaux. Ceci peut être vu dans le code source de cette classequi au final revient à
De sorte que tous les éléments du tableau sont copiés dans une interne
Vector
et la matrice n'est plus utilisé.Solution: ne pas mettre à jour les tableaux mais la mise à jour de la
DefaultTableModel
. Cette classe fournit toutes les API, vous devez ajouter/supprimer des données vers/à partir d'elle.Salut @Robin. Encore une fois merci pour l'aide. Prendre un coup d'oeil au code que j'ai mis à jour. Il y a tout un code qui est utilisé. Vous pouvez simplement copier/coller dans eclipse... Comme vous pouvez le voir je ne suis pas à l'aide de tableaux plus. Je suis à l'aide de DefaultTableModel fonction setValueAt() qui est utilisé pour ajouter de nouvelles valeurs pour le modèle. Pas encore de données est montré...
votre
passDatatoTable
classe crée une nouvelle INTERFACE utilisateur (gui SendStringsToGUI = new gui();
) au lieu de la mise à jour de l'existantMerci @Robin pour la mise à jour. Alors, dites-moi comment puis-je transmettre les données correctement? Je pense à créer constructeur supplémentaire avec de la Ficelle de transmettre variable et à partir de là, il va mettre à jour le tableau et il ne crée pas de nouvelle interface graphique. Je vais essayer de code et afficher les résultats.
J'ai essayé de l'utiliser avec d'autres constructeur et ne fonctionne toujours pas. Quelqu'un sait-bon tuto à ce sujet ? Je fais affaire avec ce depuis 2 jours et toujours pas de chance...
OriginalL'auteur Robin