Problem mit JTable und fireTableDataChanged()

Status
Nicht offen für weitere Antworten.

Weisswurst

Aktives Mitglied
Hi!

Ich habe ein kleines Problem mit meiner Tabelle.

In meiner Klasse wird zu oberst ein DataModel initialisiert und an eine Tabelle übergeben.
Die GUI wird aufgebaut und dann eine Funktion aufgerufen, die das DataModel füllt.

DataModel ist übrigens ne Ableitung von AbstractTableModel,

Das GAnze sieht in etwa so aus:

Code:
public class meineKlasse()
{
    DataModel dataModel = new DataModel();
    JTable table;
    JScrollPane scrollPane;

    public go()
    {
        table = new JTable(dataModel);
         //Gui zusammenstecken, table in Scrollpane stecken...
        updateDataModel() //Einlesen der Daten in das DataModel
    }

    public updateDataModel()
    {
        dataModel = new DataModel(); //Wieso???
        //Mehrere Funktionen, die Daten über die addDataSet() Methode in das dataModel schreiben
        table.setModel(dataModel); //Eigentlich sollte aktualisiert werden nicht komplett neu gemacht werden...
    }
}

So die Änderungen im dataModel werden über eine Funktion namens addDataSet() durchgeführt, die eine Klasse entgegennimmt, in der einige Werte drin stehen, und diese in eine ArrayListe steckt. So ein DataSet ist quasi eine Zeile in meiner Tabelle und die ArrayList sammelt diese Zeilen.

Code:
public class DataModel()
{
    public void addDataSet(DataSet set)
    {
        dataRow.add(set); //DataRow ist das ArrayList
        fireTableDataChanged();
    }
}

Mein Problem ist nun, dass beim Einlesen der Daten in das DataModel Dateien von versch. Rechenrn im Netz abgefragt werden müssen. Das dauert ne Weile. Ich hätte gerne, dass die Tabelle aktuell vorhandenen DataSets anzeigt, während neue eingelesen werden.

Wenn ich aber in der UpdateDataModel Methode ein neues DataModel anlege und dann sogar noch neu der Tabelle zuweisen muss, wird des nix mit der ständigen Aktualisierung. Das ich ein neues DataModel neu der Tabelle zuweisen muss ist klar. Aber warum muss ich ein neues DataModell anlegen???

Die Aktualisierung muss übrigens in der Funktion bleiben, weil es da so nen Refreshbutton gibt, der wie der Name schon sagt, die Tabelle refreshen soll...

Sicher ne Anfänger Frage und für eich Cracks gar kein Problem ;)
Vielen Dank!!!
 

anfänger15

Bekanntes Mitglied
du könntest mit removeRow und addRow die Datensätze die sich geändert haben in der Tabelle ändern. Dadurch bleiben alle anderen Datensätze da weil das TableModel nicht gelöscht wird.

vllt. gibt es aber noch besser Möglichkeiten
 

Weisswurst

Aktives Mitglied
Hmm, ich versteh nicht ganz, wie mir das Helfen soll.

Im Prinzip ist es schon richtig eine komplett neue Tabelle zu zeichnen, weil sich im Zweifel alle Zeilen
geändert haben.

Ich hatte extra dafür eine resetList Funktion, die das Modell geleert hat.

Meine eigentliche Frage ist aber, warum ich in der UpdateFunktion exta nochmal ein dataModel erstellen muss.
Eigentlich habe ich doch schon eins für die Klasse, das halt von mehreren Funktionen vearbeitet wird.
 

HLX

Top Contributor
Versuchs mal so:

Code:
public class meineKlasse()
{
    JTable table;
    JScrollPane scrollPane;

    public void initialize()
    {
        table = new JTable(dataModel);
        DataModel dataModel = new DataModel();
        table.setModel(dataModel); // Model einmalig zuweisen
        //Gui zusammenstecken, table in Scrollpane stecken...
    }

    public void go() {
          updateDataModel() //Einlesen der Daten in das DataModel
    }

    public void updateDataModel()
    {
           //Mehrere Funktionen, die Daten über die addDataSet() Methode in das dataModel schreiben
           // Zugriff über table.getModel()
    }
}
 

Weisswurst

Aktives Mitglied
Ich habe jetzt mal ein paar Ausgaben eingebaut.
Ich musste dabei feststellen, dass die Tabelle gar nicht neugezeichnet wird wenn geupdatet wird.
Die Funktionen getColumnCount und RowCount und ColumnName werden trotz fireTableDataUpdated und fireTableStructureChanged nicht erneut aufgerufen.

Ich hänge mal das ganze Modell an...
Code:
import java.io.Console;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;

import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;

public class DataModel extends AbstractTableModel implements Iterator<DataSet>
{
	/**
	 * 
	 */
	private static final long	serialVersionUID	= 1L;
	
	private ArrayList<DataSet> dataRow = new ArrayList<DataSet>();
	private Vector<TableModelListener> listeners = new Vector<TableModelListener>();
	private int iMaxCountOfUsers = 0;
	private Iterator<DataSet> iterator;
	
	public void update()
	{
		System.out.println("Update requested");
		fireTableStructureChanged(); 
		fireTableDataChanged();
	}
	
	public void addDataSet(DataSet set)
	{
		dataRow.add(set);
		System.out.println("Neuer Datensatz: " + set.getNameServer() + " User Count: " +  set.getLoggedInUserList().size());
		if(set.getLoggedInUserList().size() > iMaxCountOfUsers)
			iMaxCountOfUsers = set.getLoggedInUserList().size();
		 iterator = dataRow.iterator(); //Der Iterator muss immer aktualisiert werden wenn neues Element...
	}
	
	public void addTableModelListener(TableModelListener arg0)
	{
		listeners.add(arg0);
	}
	
	public Class<?> getColumnClass(int col)
	{
		switch (col)
		{
		case 0:
			return String.class;
		case 1:
			return String.class;
		case 2:
			return String.class;
		case 3:
			return String.class;
		case 4:
			return Integer.class;
		default:
			return String.class;
		}
		
	}
	
	public String getColumnName(int arg0)
	{
		System.out.println("GetColumnName: " + arg0);
		switch (arg0)
		{
		case 0:
			return "IP Server";
		case 1:
			return "Name Server";
		case 2:
			return "Project";
		case 3:
			return "Version";
		case 4:
			return "UserAnzahl";
		default:
			return "Active User";
		}
	}
	
	public int getColumnCount()
	{	
		System.out.println("GetColumnCount: " + (5 + iMaxCountOfUsers));
		return 5 + iMaxCountOfUsers;
	}

	public int getRowCount()
	{
		System.out.println("GetRowCount: " + (dataRow.size()));
		return dataRow.size();
	}

	public Object getValueAt(int row, int col)
	{
		DataSet set = dataRow.get(row);
		
		switch (col)
		{
			case 0:
				return set.getIPServer();
			case 1:
				return set.getNameServer();
			case 2:
				return set.getProject();
			case 3:
				return set.getVersion();
			case 4:
				return set.getUserCount();
			default:
			{
				try
				{
					return set.getLoggedInUserList().get(col - 4);
				} catch (RuntimeException e)
				{
					e.printStackTrace();
				}
			}
			return null;
		
		}
	}
	public boolean isCellEditable(int arg0, int arg1)
	{

		return false;
	}

	public void removeTableModelListener(TableModelListener arg0)
	{
		listeners.remove(arg0);		
	}
	
	public void resetList()
	{
		Collections.fill(dataRow, new DataSet());
		update();
	}

	public void setValueAt(Object arg0, int arg1, int arg2)
	{
		return;	
	}

	public boolean hasNext()
	{
		return iterator.hasNext();
		
	}

	public DataSet next()
	{
		return iterator.next();
	}

	public void remove()
	{
		iterator.remove();
		update();
	}
}
 

Weisswurst

Aktives Mitglied
Ja, aber es hilft nicht.
Das Updateverhalten ist im wesentlichen identisch :(

Edit:
Die letzte Zeile aus meinem log besagt "Update requested". Also wurde die update Funktion aus dem Model aufgerufen. (siehe oben) Die müsste eigentlich die Tabelle komplett zum neuzeichen veranlassen...
Aber die ganzen getFunktionen aus dem Model werden nicht mehr aufgerufen.

Edit2:
Ich habe sicherheitshalber nochmal nachgeschaut. An der stelle wo dieses letzte "Update requested" ausgegeben wird, ist das DataModel reichlich mit eigentlich anzuzeigenden Daten gefüllt...
 

Weisswurst

Aktives Mitglied
Von mir selbst niergends.
Sollte?

Edit:
Die Funktion wird aber ganz zu Beginn einmal aufgerufen.

Edit2:
Der Listener wird automatisch hinzugefügt, wenn das Model an die Table übergeben wird.
Also bei JTable table = new JTable(dataModel);
 

Weisswurst

Aktives Mitglied
Sieht so aus, als hätte ich es.
In der update Funktion ein TableModelEvent anzulegen und an den listener zu übergeben tut dem Updateverhalten sehr gut.
 

André Uhres

Top Contributor
Warum so kompliziert? Lass die listeners einfach weg, die sind doch schon in der Oberklasse vollständig implementiert.
 

Weisswurst

Aktives Mitglied
So, ich komm endlich mal dazu an dieser Front weiter zu machen.

Das mit den Listenern habe ich so gemacht, weil ich durch ein Tut den Einduck bekommen habe, dass das so gemacht werden müsste. Aber bei dem Tut ging es dann auch noch darum die Zellen mit einem eigenen Renderer zu versehen.
Möglicherweise sind deshalb die Listener dabei.

Ich habe sie jetzt raus genommen.

Das Programm läuft jetzt im Prinzip. Leider werden jede menge Exceptions geschmissen, weil ein Array out of Bounds ist.
Ich suche jetzt schon eine ganze Weile rum und kann mit Sicherheit sagen, dass der Fehler bei "fireTableStructureChanged();" Auftritt.

Weiterhin kann ich noch sagen, dass im defaultTableColumnModel die Funktion getColumn() aufgerufen und direkt danach in util.vector.elementAt() die Exception fliegt.

in meinem DataModel gibt es die Funktion

Code:
   public int getColumnCount()
   {   
      System.out.println("GetColumnCount: " + (5 + iMaxCountOfUsers));
      return 5 + iMaxCountOfUsers;
   }

Ich habe das exemplarisch mehrfach durchgezählt und bin mir doch sehr sicher, dass der Wert "iMaxCountOfUsers" stimmt. Das ich tatsächlich 5 zusätzliche Spalten habe sieht man ja im Quellcode ein paar Posts weiter oben.

Das Programm funktioniert zwar so, aber mit den ganzen Exceptions möcht ich's nicht liegen lassen :(
 

André Uhres

Top Contributor
Weisswurst hat gesagt.:
..kann mit Sicherheit sagen, dass der Fehler bei "fireTableStructureChanged();" Auftritt..
Machst du "fireTableStructureChanged" auch genau dort, wo die Struktur verändert wird?
Wenn ich das richtig sehe, dann müsste hier z.B. ein "fireTableStructureChanged" hin:
Code:
  public void addDataSet(DataSet set)
   {
      dataRow.add(set);
      System.out.println("Neuer Datensatz: " + set.getNameServer() + " User Count: " +  set.getLoggedInUserList().size());
      if(set.getLoggedInUserList().size() > iMaxCountOfUsers)
         iMaxCountOfUsers = set.getLoggedInUserList().size();
       iterator = dataRow.iterator(); //Der Iterator muss immer aktualisiert werden wenn neues Element...
   }
 
G

Guest

Gast
AHA! Wenn ich alles Sets eintragen lasse und erst dann mein Update mit fire dies und das mache, dann funzt das.
Offensichtlich habe ich update ich da irgendwann wenn die Daten nicht passen.

Ich schau mir das nochmal genau an.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
D Problem mit JTable AWT, Swing, JavaFX & SWT 1
I JTable,AbstractTableModel Problem AWT, Swing, JavaFX & SWT 3
K Swing JTable Problem... AWT, Swing, JavaFX & SWT 3
J JTable: Problem bei CellRenderer AWT, Swing, JavaFX & SWT 3
W jTable Scrollbar Problem AWT, Swing, JavaFX & SWT 2
GianaSisters Swing jTable Undo Problem. AWT, Swing, JavaFX & SWT 5
J Swing Problem mit JTable erweitern AWT, Swing, JavaFX & SWT 6
Draculajr Problem mit jformattedtextfields und jtable AWT, Swing, JavaFX & SWT 10
B Swing JTable custom ColumnModel Problem AWT, Swing, JavaFX & SWT 5
T JSpinner in JTable: Problem beim Auslesen, funktioniert erst beim Zellwechsel AWT, Swing, JavaFX & SWT 7
D Problem mit JFileChooser -> Daten werden mit anführungsstriche in JTable geschrieben AWT, Swing, JavaFX & SWT 8
B Problem mit Alignment in JTable AWT, Swing, JavaFX & SWT 2
N Swing JTable - Problem mit Zeilenumbruch AWT, Swing, JavaFX & SWT 6
F Swing Problem mit Drag&Drop in JTable AWT, Swing, JavaFX & SWT 4
D Swing JTable Model View Problem AWT, Swing, JavaFX & SWT 6
D Swing JTable Problem bei automatischem update von Zellen AWT, Swing, JavaFX & SWT 3
F Swing JTable: Problem beim zeile löschen AWT, Swing, JavaFX & SWT 3
C Swing Problem mit MouseEvent in JTable AWT, Swing, JavaFX & SWT 5
O JDialog-JScrollPane-JTable Problem AWT, Swing, JavaFX & SWT 3
aze JTable in Popup.Problem mit DefaultTableCellRenderer AWT, Swing, JavaFX & SWT 9
N Swing Problem beim Einlesen von Jtable in Array AWT, Swing, JavaFX & SWT 5
M Problem mit funktionellem JTable Header AWT, Swing, JavaFX & SWT 5
M Problem mit Festsetzen der Anzahl ein reihen in einer JTable AWT, Swing, JavaFX & SWT 11
S JTable & TableCellEditor Problem AWT, Swing, JavaFX & SWT 5
M JTable und ListSelectionListener Problem AWT, Swing, JavaFX & SWT 3
S Sortierter JTable Problem AWT, Swing, JavaFX & SWT 2
K Problem mit JButton in JTable AWT, Swing, JavaFX & SWT 4
M JTable & Problem, das nicht die komplette Zeile gefärbt AWT, Swing, JavaFX & SWT 6
B Anspruchsvolles JTable Problem AWT, Swing, JavaFX & SWT 4
M Layout-Problem: JTable AWT, Swing, JavaFX & SWT 3
S JTable - Problem mit der Selection AWT, Swing, JavaFX & SWT 4
G Darstellungs Problem mit ComboBox in JTable AWT, Swing, JavaFX & SWT 15
G Problem bei JTable in JInternalFrame AWT, Swing, JavaFX & SWT 4
H JTable problem mit TableSorter AWT, Swing, JavaFX & SWT 4
M JDBC + dynamischer JTable - Spalten problem AWT, Swing, JavaFX & SWT 5
S JTable Problem AWT, Swing, JavaFX & SWT 2
E JTable: Problem mit clearSelection() AWT, Swing, JavaFX & SWT 7
R JTable auslesen Problem AWT, Swing, JavaFX & SWT 4
D GridBagLayout Problem mit JTable AWT, Swing, JavaFX & SWT 6
M Problem mit ImageIcon in einer JTable AWT, Swing, JavaFX & SWT 2
G JTable - Problem.:( AWT, Swing, JavaFX & SWT 6
Z Problem mit Icons in JTable AWT, Swing, JavaFX & SWT 3
D Jtable farbig markieren - Verständnis Problem AWT, Swing, JavaFX & SWT 5
M Problem mit JTable und DefaultTableModel AWT, Swing, JavaFX & SWT 2
G Problem mit JTable / mit dem Eintragen der Daten aus Vector AWT, Swing, JavaFX & SWT 4
S JTable + Sortieren => Problem bei Darstellung AWT, Swing, JavaFX & SWT 13
TRunKX Problem mit JTable AWT, Swing, JavaFX & SWT 3
J jtable + Textarea problem AWT, Swing, JavaFX & SWT 3
M Problem bei Verbinden v. jTable, ScrollPane u. JLabel AWT, Swing, JavaFX & SWT 5
G Problem mit Scrollpanel in JTable AWT, Swing, JavaFX & SWT 2
T Problem mit JTable - Renderer AWT, Swing, JavaFX & SWT 3
W Problem/Absturz bei Zelle nicht editierbar setzen (JTable) AWT, Swing, JavaFX & SWT 6
N JTable - Problem mit markieren von Zellen AWT, Swing, JavaFX & SWT 3
M JTable Problem AWT, Swing, JavaFX & SWT 9
EagleEye Problem mit ObjectOutputStream / JTable AWT, Swing, JavaFX & SWT 5
G JTable CellRenderer-Problem AWT, Swing, JavaFX & SWT 4
G Problem mit der Anzeige von jLabel. Unlesbar wenn der Text geändert wird. AWT, Swing, JavaFX & SWT 28
H 2D-Grafik Problem mit Paint AWT, Swing, JavaFX & SWT 1
S Layout - Problem AWT, Swing, JavaFX & SWT 1
Tassos JavaFX/Problem mit der Maussteuerung in Stackpane AWT, Swing, JavaFX & SWT 7
sserio Java Fx - Problem AWT, Swing, JavaFX & SWT 3
A Problem Spiel auf Panel der GUI zu bringen AWT, Swing, JavaFX & SWT 1
A JavaFX Controller Problem AWT, Swing, JavaFX & SWT 1
TheWhiteShadow JavaFX ListView Problem beim Entfernen von Elementen AWT, Swing, JavaFX & SWT 1
E LayoutManager Welcher Layout-Mix löst mein Problem? AWT, Swing, JavaFX & SWT 3
Umb3rus JavaFX Problem mit PropertyValueFactory: can not read from unreadable property AWT, Swing, JavaFX & SWT 1
T Problem mit paintComponent() AWT, Swing, JavaFX & SWT 17
AmsananKING Java Menü-Problem AWT, Swing, JavaFX & SWT 1
K JavaFX Resizing-Problem beim BorderLayout (Center Component) beim Arbeiten mit mehreren FXMLs AWT, Swing, JavaFX & SWT 2
G Instance OF Problem AWT, Swing, JavaFX & SWT 9
FrittenFritze Ein Problem mit der CSSBox, die Größe wird nicht angepasst AWT, Swing, JavaFX & SWT 5
M Problem mit dem Anzeigen von Frames im Vordergrund AWT, Swing, JavaFX & SWT 5
Badebay Problem mit JButton AWT, Swing, JavaFX & SWT 2
newJavaGeek Grid-Layout problem AWT, Swing, JavaFX & SWT 7
J JavaFX Löschen im Tabelview macht Problem AWT, Swing, JavaFX & SWT 15
JavaTalksToMe JavaFx ExekutorService Problem AWT, Swing, JavaFX & SWT 2
Zrebna Problem bei Eventhandling (Value soll nach jedem erneutem Klick gelöscht werden) AWT, Swing, JavaFX & SWT 4
B Problem mit JavaFX AWT, Swing, JavaFX & SWT 5
J css Problem AWT, Swing, JavaFX & SWT 5
B JavaFX habe mein Problem fett markiert AWT, Swing, JavaFX & SWT 2
A Swing Filter-Problem AWT, Swing, JavaFX & SWT 1
temi JavaFX Problem mit IntelliJ und JavaFx 11 unter XUbuntu AWT, Swing, JavaFX & SWT 3
L Java FX Problem mit Ubuntu 18 und JavaFx AWT, Swing, JavaFX & SWT 27
kodela Swing Problem mit Warten-Dialog AWT, Swing, JavaFX & SWT 16
B JavaFx Scene Builder Problem AWT, Swing, JavaFX & SWT 2
B [Problem] Java öffnet Word-Datein nicht AWT, Swing, JavaFX & SWT 14
T DataBinding Problem AWT, Swing, JavaFX & SWT 5
Blender3D Problem mit € Symbol Font Gotham Windows 10 Swing AWT, Swing, JavaFX & SWT 11
J Problem mit Platfrom run later AWT, Swing, JavaFX & SWT 15
J Problem mit Platfrom run later AWT, Swing, JavaFX & SWT 0
D Swing SwingUtils / Thread Problem AWT, Swing, JavaFX & SWT 3
L JavaFX Problem beim Aufrufen einer Methode AWT, Swing, JavaFX & SWT 5
T Swing Problem mit Datum und FormattedTextField AWT, Swing, JavaFX & SWT 2
S AWT Java print dialog Problem AWT, Swing, JavaFX & SWT 0
olfibits JavaFX Problem mit HTMLEditor AWT, Swing, JavaFX & SWT 0
W SWT hover-background-problem with first column in TreeViewer AWT, Swing, JavaFX & SWT 0
M Problem mit Add JScrollPane AWT, Swing, JavaFX & SWT 25
Mario1409 Swing JTextArea scroll Problem AWT, Swing, JavaFX & SWT 0

Ähnliche Java Themen

Neue Themen


Oben