Jtable nicht aktualisieren/Daten aktualisieren
Ich habe ein problem mit JTable
/JScrollPane
. Meine Daten-Tabelle nicht aktualisieren/Aktualisierung. Ich bin mit DefultTableModel
und nach dem code alles in Ordnung und ich habe keine Fehler. Auch ich habe eine Tabelle mit paging und das ist, warum ich bin mit action-Listener und buttons "prev" und "next". Ich bin die von anderen auf Funktion codiert ist, die in der Klasse, wo ist JTable
. Problem ist, dass ich füllen von arrays enthält die Daten für die Tabelle, aber die Tabelle nicht aktualisieren/aktualisieren. Hier ist mein code. Danke im Voraus.
GROß BEARBEITEN Alt-code wurde entfernt. Ich fügte hinzu, neue codes, die Ihnen helfen, Jungs/Mädchen zu verstehen, problem, das ich habe. Hoffe, dass dies helfen wird. Grüße.
Erste hier ist Klasse, die zeigen, 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);
}
});
}
}
Zweite hier ist Klasse, die übergeben Strings auf die gui-Klasse, die die jtable enthält
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);
}
}
}
Nächste hier ist die Erklärung des gui (contructor):
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);
}
Hier ist 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);
}
}
InformationsquelleAutor ZhiZha | 2012-09-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre erste Ausschnitt zeigt dies:
JTable table = new JTable(model);
aber Ihre
gui()
Konstruktor zeigt:JTable table = new JTable(data, columnNames);
Initiieren Sie die Tabelle zweimal. Wenn Sie mit der
TableModel
(JTable(TableModel tm)
) der nächste mitJTable(int rows,int cols)
das ist nicht gut, leiten Sie dieJTable
einmal im Konstruktor:UPDATE:
Hier ist ein Beispiel, hat einen thread gestartet wird 2.5 secinds nach der UI sichtbar ist, und ändern Sie den Wert der
JTable
:Entweder Sie verwenden
SwingUtilities
(die Sie bereits in Ihremmain
Methode, btw, so dass Sie mit vertraut sein sollten - es sei denn, Sie haben einfach kopieren-einfügen, dass der code von irgendwo ohne zu wissen, was es bedeutet), oder Sie Graben, dassThread
und ersetzen Sie es durch einjavax.swing.Timer
die ausgelegt ist zum ausführen von Operationen auf der EDT in festen IntervallenUnd nun sind Sie schlafen auf der EDT, die im Grunde macht Ihr UI nicht mehr reagiert. Mein Vorschlag für die
SwingUtilities
Anruf war nicht für die ganzeRunnable
nur für das update-Modell Teil. Ich empfehle dringend, Lesen Sie die Swing Parallelität tutorialIch weiß, für was der Schlaf gemeint war. Aber simuliert das laden von Daten oder die tatsächlichen Daten laden sollte das nicht passieren, auf der EDT. Und für einen post mit einer hohen Anzahl an upvotes (hoch bedeutet im Vergleich zu anderen Swing-Fragen), die Antwort sollte nicht gegen die grundlegende Swing-threading-Regeln imo. Dass es nun behoben ist, kann ich das entfernen von meinem unten abstimmen
-1 für Ereignisse auslösen, im Namen der Modell - das ist die exklusive Verantwortung des Modells selbst
InformationsquelleAutor David Kroukamp
Aus, was ich verstehe, aus den Kommentaren und der Frage, haben Sie zunächst ein
DefaultTableModel
durch die übergabe der Daten als arrays im Konstruktorist und Sie versuchen, die Tabelle zu ändern im Nachhinein durch anpassen der arrays. Das wird nie jemals einen Effekt haben, wie die
DefaultTableModel
nicht verwenden diese arrays. Dies kann gesehen werden in den source-code dieser Klassewas am Ende kommt es auf
Also alle Elemente des Arrays werden kopiert, in eine interne
Vector
, und das array wird nicht mehr verwendet.Lösung: aktualisieren Sie nicht die arrays, sondern aktualisieren Sie die
DefaultTableModel
. Diese Klasse enthält alle API müssen Sie hinzufügen/entfernen von Daten zu/von ihm.Hi @Robin. Nochmal vielen Dank für die Hilfe. Werfen Sie einen Blick auf code, den ich aktualisiert. Es gibt eine ganze code, der verwendet wird. Sie können einfach per copy/paste in eclipse... Wie Sie sehen können ich bin nicht mit arrays mehr. Ich bin mit DefaultTableModel Funktion setValueAt() ist zum hinzufügen neuer Werte zu modellieren. Noch keine Daten zeigten,...
Ihre
passDatatoTable
Klasse noch schafft ein neues UI (gui SendStringsToGUI = new gui();
) statt der Aktualisierung der bestehendenDanke @Robin für das update. Also Sag mir, wie kann ich Daten richtig? Ich bin am überlegen zu schaffen, extra-Konstruktor mit String als variable übergeben und von dort aus erfolgt die Aktualisierung der Tabelle und wird es nicht schaffen, neue GUI. Ich werde versuchen, diese zu Programmieren und nach hinten ergibt.
Ich habe versucht, es mit anderen Konstruktor und immer noch nicht funktioniert. Hat jemand wissen, gute Tutorials dazu ? Ich bin den Umgang mit diesem für 2 Tage und immer noch kein Glück...
InformationsquelleAutor Robin