Swing Daten in JTable aktualisieren

lowbird

Mitglied
Hallo,

ich hab folgendes Problem, ich benutze ein JTable um Daten für einen Ausflugsplaner anzuzeigen und die Teilnehmer zu verwalten. Ich habe ein eigenes TableModel von AbstractTableModel abgeleitet und dieses implementiert zusätzlich noch TableModelListener. Um festzulegen ob ein Teilnehmer an einer bestimmten Aktivität während des Ausflugs teilnimmt, existiert für jede der Aktivitäten eine eigene Spalte mit Checkboxen. In Abhänigkeit von der Anzahl der Teilnehmer je Aktivität ändert sich der Betrag, den jeder der Teilnehmer zu bezahlen hat. Nach jeder Änderung in einer Checkbox wird tableChanged(...) aufgerufen(durch modelxy.fireTableChanged(....)). Hierin werden die Kosten jedes Teilnehmers neu errechnet und in dem jeweiligen Objekt gespeichert.

Leider ändert sich der Endbetrag jedes Teilnehmers in der JTable erst nachdem ich eine weiter Checkbox angeklickt hab. Das führt dazu das die Kosten quasi immer einen Schritt zu spät korrekt angezeigt werden.

Wie kann ich innerhalb der Funktion tableChanged(..) erzwingen, dass jeweils aktuelle Daten aller Teilnehmer angezeigt werden?

modelxy.fireTableDataChanged() funktionniert leider nicht

Ich hoffe jmd kann mir helfen.
 

KrokoDiehl

Top Contributor
Prinzipiell läuft es so: Wenn sich in einem Modell etwas ändert, müssen die entsprechenden Listener benachrichtigt werden. Und das funktioniert bei Tabellen mit JTable und AbstractTableModel (bei mir zumindest) bisher immer.

Von der Beschreibung her tippe ich darauf, dass etwas in deiner Ereigniskette nicht stimmt. Wenn dein Tabellenmodell selbst Listener auf anderen Modellen ist, dann muss er z.B. nach einer (fremden) Änderung seine eigenen Daten aktualisieren und dann erst seine eigenen Listener benachrichtigen. Als Quellcode etwa so:
Java:
public class MyTableModel extends AbtractTableModel implements XYListener
{
    @Overwrite
    public void xyChanged( XYEvent event )
    {
        // das ist nur ein Beispiel, wie die eigenen Daten aktualisiert werden könnten
        myTableData[ irgendwieDieZeileRausfinden ][ spalteAbhaengigVonXY ]
             = event.getValue();

        // jetzt muss das Modell seinen eigenen Listener die Änderung weiterleiten (ua der JTable)
        this.fireTableCellUpdated(
                irgendwieDieZeileRausfinden,
                spalteAbhaengigVonXY); 
    }
}

Du kannst mit Testausgaben oder Debugger auch mal prüfen, ob dein Modell die fremden Ereignisse mitbekommt. Vielleicht hast du auch einfach vergessen es als Listener wo dranzuhängen.

Das ist eigentlich alles, was ich bisher dazu sagen kann. Wenn dein Programm nicht zu umfangreich ist, kannst du es auch mal posten, aber ich denke schon, dass es (zu)viel ist :)
Oder die - deiner Meinung nach - schuldigen Stellen posten.
 

lowbird

Mitglied
Hmm also der TableModelListener in meinem TableModel ist nur ein Listener auf sich selbst.

Ich versuch mal die wesentlichen Code-Stücke zu posten

Java:
public class TeilnehmerTableModel extends AbstractTableModel implements TableModelListener
{
public TeilnehmerTableModel(Ausflug a)
{
...
this.addTableModelListener(this);	
}
...
...
...
public void setValueAt(Object arg0, int arg1, int arg2)
{
        ...
        fireTableChanged(new TableModelEvent(this, arg1, arg2));			
}
public void tableChanged(TableModelEvent arg0)
{
	//Teilnehmer je Aktivität zählen und Kosten für jeden einzelnen Teilnehmer berechnen und in 
        //den jeweiligen Objekten speichern

        //Nach allen Berechnungen soll dann das TableModel aktualisiert werden
}
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Ein Model als Listener an sich selbst zu hängen... naja.
Du bekommst doch über die setValueAt(...) Änderungen an einzelnen Zellen mit.

Ich würde die Aktivitäten als eigene Objekte mit den Attributen nameActivity, numOfParticipants, price und den Methoden getActivityName(), getPricePerParticipant()
Diese Objekte würde ich in das TableModel stecken und die Werte der beiden Methoden anzeigen lassen. Wenn sich dann ein Teilnehmer einer Aktivtät anschliesst oder von einer abmeldet einfach die Teilnehmerzahl anpassen und per fire... der JTable mitteilen, dass sich was am Model geändert hat.
 

lowbird

Mitglied
Ein Model als Listener an sich selbst zu hängen... naja.
An welches Objekt sollte ich ihn sonst hängen?
Wobei mir grad aufgefallen ist, dass der Listener sinnlos ist, geht auch ohne -.-

Du bekommst doch über die setValueAt(...) Änderungen an einzelnen Zellen mit.
Jo und dann berechne ich die Kosten für jeden Teilnehmer neu.
Das Problem ist halt, dass es Aktivitäten gibt bei denen sich die Anzahl der Teilnehmer auf die Kosten für den Einzelnen auswirkt, somit muss ich für alle Teilnehmer die Endbeträge neu berechnen.
Das ist ja auch nicht das Problem.

Ich würde die Aktivitäten als eigene Objekte mit den Attributen nameActivity, numOfParticipants, price und den Methoden getActivityName(), getPricePerParticipant()
Diese Objekte würde ich in das TableModel stecken und die Werte der beiden Methoden anzeigen lassen. Wenn sich dann ein Teilnehmer einer Aktivtät anschliesst oder von einer abmeldet einfach die Teilnehmerzahl anpassen und per fire... der JTable mitteilen, dass sich was am Model geändert hat.
Die betreffenden Objekte sind im TableModel... sonst könnte ich ja nicht die neuen Endbeträge berechnen. Diese werden auch korrekt errechnet.
Nach der Berechnung kommt dann ein "fireTableDataChanged()", also am Ende der Funktion setValueAt(...).
Das Problem ist einfach das die Änderungen nicht sofort in der Tabelle erscheinen, sondern erst nach der nächsten Aktion in der Tabelle(Checkbox-Klick).
 

Michael...

Top Contributor
Hier mal ein Beispiel wie ich es gemeint habe.
Ist nur ein erster Schnellschuss ohne grossartige Überlegung, aber vielleicht liefert es Dir ja einen möglichen Ansatz:
Java:
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class ActivityTableDemo extends JFrame {
	
	public ActivityTableDemo() {
		Activity sailing = new Activity("Sailing", 10000d) {
			public double getPricePerPerson() {
				if (participants==0)
					return 0d;
				return price/participants;
			}
		};
		Activity climbing = new Activity("Climbing", 600d) {
			public double getTotalPrice() {
				return price * participants;
			}
			
			public double getPricePerPerson() {
				if (participants==0)
					return 0d;
				return price;
			}
		};
		ActivityTableModel model = new ActivityTableModel();
		model.setDataVector(new Object[][]{
				{"Meier", sailing, null, false, null},
				{"Meier", climbing, null, false, null},
				{"Huber", sailing, null, false, null},
				{"Huber", climbing, null, false, null},
				{"Schmidt", sailing, null, false, null},
				{"Schmidt", climbing, null, false, null}
				},
				new String[] {"Person", "Aktivität", "Gesamtpreis", "Teilnahme", "Preis p.P."});
		JTable table = new JTable(model);
		this.getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
	}
	
	class ActivityTableModel extends DefaultTableModel {
		public boolean isCellEditable(int row, int column) {
			if (column==3)
				return true;
			return false;
		}
		
		public Class<?> getColumnClass(int column) {
			if (column==2)
				return Double.class;
			if (column==3)
				return Boolean.class;
			if (column==4)
				return Double.class;
			return Object.class;
		}
		
		public Object getValueAt(int row, int column) {
			Activity activity = (Activity)super.getValueAt(row, 1);
			switch (column) {
			case 1: return activity.getTitle();
			case 2: return activity.getTotalPrice();
			case 4: {
				boolean checked = ((Boolean)super.getValueAt(row, 3)).booleanValue();
				if (checked)
					return activity.getPricePerPerson();
				else
					return 0d;
			}
			}
			return super.getValueAt(row, column);
		}
		
		public void setValueAt(Object obj, int row, int column) {
			if (column==3) {
				boolean checked = ((Boolean)obj).booleanValue();
				Activity activity = (Activity)super.getValueAt(row, 1);
				if (checked)
					activity.addParticipant();
				else
					activity.removeParticipant();
			}
			super.setValueAt(obj, row, column);
			this.fireTableDataChanged();
		}
	}
	
	abstract class Activity {
		protected String title;
		protected double price;
		protected int participants;
		
		public Activity(String title, double price) {
			this.title = title;
			this.price = price;
			this.participants = 0;
		}
		
		public String getTitle() {
			return title;
		}
		
		public double getTotalPrice() {
			return price;
		}
		
		public void addParticipant() {
			this.participants++;
		}
		
		public void removeParticipant() {
			this.participants--;
		}
		
		public abstract double getPricePerPerson();
	}
	
	public static void main(String[] args) {
		JFrame frame = new ActivityTableDemo();
		frame.setBounds(0, 0, 500, 300);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Daten aus DB -> JTable aktualisieren klappt nicht AWT, Swing, JavaFX & SWT 16
F JTable Daten aktualisieren AWT, Swing, JavaFX & SWT 2
D MySQL Daten in JTable anzeigen AWT, Swing, JavaFX & SWT 2
A JTable mit Daten füllen AWT, Swing, JavaFX & SWT 1
C Swing Daten in JTable wiedergeben per TableModel und MVC Pattern AWT, Swing, JavaFX & SWT 16
I JTable: Doppelklick auf Table soll neues Fenster öffnen und Daten aus JTable anzeigen AWT, Swing, JavaFX & SWT 4
S JTable Daten aus Array AWT, Swing, JavaFX & SWT 9
B Swing JTable mit Daten - Reihen-Größe anpassen AWT, Swing, JavaFX & SWT 0
F Swing JTable: Daten voreinstellen AWT, Swing, JavaFX & SWT 4
B Daten in eine JTable schreiben AWT, Swing, JavaFX & SWT 3
D Daten von JDialog an JTable in JFrame übergeben AWT, Swing, JavaFX & SWT 7
O JTable zeigt die alte Daten wieder AWT, Swing, JavaFX & SWT 23
H JTable zeigt keine Daten an AWT, Swing, JavaFX & SWT 5
C Swing JTable Daten einfügen AWT, Swing, JavaFX & SWT 6
Ollek IndexOutOfBoundsException bei neuen Daten in JTable AWT, Swing, JavaFX & SWT 13
J Swing JTable-Daten Speichern und bei zeilen-änderung beibehalten. AWT, Swing, JavaFX & SWT 6
T Daten mittels ComboBox in ein JTable adden AWT, Swing, JavaFX & SWT 7
Ollek Realisierung: JTable zur Laufzeit mit neuen Daten füllen AWT, Swing, JavaFX & SWT 3
GianaSisters Swing jTable Daten unsichtbar AWT, Swing, JavaFX & SWT 12
D Problem mit JFileChooser -> Daten werden mit anführungsstriche in JTable geschrieben AWT, Swing, JavaFX & SWT 8
S Swing Daten aus Datenbank in JTable AWT, Swing, JavaFX & SWT 2
L Daten werden in JTable nicht angezeigt:( AWT, Swing, JavaFX & SWT 6
J Daten in JTable nach Sortierung auslesen AWT, Swing, JavaFX & SWT 2
hdi Swing JTable & Filtern: Daten nicht in der View AWT, Swing, JavaFX & SWT 2
S JTable Bug - eingegebene Daten werden falsch geparst :( AWT, Swing, JavaFX & SWT 4
hdi Swing JTable: Löschen vom Daten im Model AWT, Swing, JavaFX & SWT 7
U JTable mit Daten aus einer HashMap füllen AWT, Swing, JavaFX & SWT 8
R JTable für sehr viele Daten sehr langsam AWT, Swing, JavaFX & SWT 20
B JTable: Wie speichert man manuell eingegebene Daten ausTable AWT, Swing, JavaFX & SWT 2
A JTable Vector mit Daten Ordnen bei setAutoCreateRowS AWT, Swing, JavaFX & SWT 8
S JTable Daten bearbeiten und Grauwertbild erzeugen! AWT, Swing, JavaFX & SWT 4
R Daten in JTable in mehreren Zeilen darstellen AWT, Swing, JavaFX & SWT 11
C JTable fehlende Daten AWT, Swing, JavaFX & SWT 2
raptorrs Daten aus JTable in JTextField übertragen AWT, Swing, JavaFX & SWT 11
G JTable Daten auslesen AWT, Swing, JavaFX & SWT 2
M JTable alte Daten vor Änderung abfangen AWT, Swing, JavaFX & SWT 11
O JTable mit objekt-daten füllen AWT, Swing, JavaFX & SWT 4
M Auslesen veränderter Daten in einer jTable AWT, Swing, JavaFX & SWT 2
J jTable Daten werden nicht sofort sichtbar AWT, Swing, JavaFX & SWT 5
G JTable dynamische Darstellung der ankommenden Daten AWT, Swing, JavaFX & SWT 19
vogella JTable - Hinzufügen von Datensätzen und Ändern von Daten AWT, Swing, JavaFX & SWT 2
D JTable und ungültige Daten AWT, Swing, JavaFX & SWT 2
F JTable Daten übernehmen AWT, Swing, JavaFX & SWT 2
D Daten über Button-Druck in JTable einfügen AWT, Swing, JavaFX & SWT 7
R nur bestimmte Daten in JTable anzeigen lassen? AWT, Swing, JavaFX & SWT 3
L JTable und Daten aus einer ArrayList AWT, Swing, JavaFX & SWT 6
D JTable zum Einfügen/Löschen/Editieren von Daten AWT, Swing, JavaFX & SWT 5
J JTable / Model Daten verändern AWT, Swing, JavaFX & SWT 5
M JTable zeigt daten nicht aktuell an AWT, Swing, JavaFX & SWT 4
C Dynamisches Zuweisen von Daten an eine JTable zur Laufzeit AWT, Swing, JavaFX & SWT 4
L Checkbox in JTable (again), bei true Daten in Header AWT, Swing, JavaFX & SWT 7
G Problem mit JTable / mit dem Eintragen der Daten aus Vector AWT, Swing, JavaFX & SWT 4
R JTable mit Daten aus der Datenbank füllen AWT, Swing, JavaFX & SWT 3
V Daten ins JTable laden bei Start der GUI AWT, Swing, JavaFX & SWT 6
M Daten aus Datenbank ins JTable einfügen AWT, Swing, JavaFX & SWT 4
V Daten im JTable speichern AWT, Swing, JavaFX & SWT 11
G JTable daten auslesen AWT, Swing, JavaFX & SWT 6
M Daten in JTable aus DB schreiben ? AWT, Swing, JavaFX & SWT 16
H Daten aus einer JTable in einer Datei speichern AWT, Swing, JavaFX & SWT 10
D Merken, daß Daten in der JTable sich geändert haben... AWT, Swing, JavaFX & SWT 2
L Daten mittels ObjectInputStream ins JTable AWT, Swing, JavaFX & SWT 7
H JTabel - RowFilter Daten für Berechnung filtern AWT, Swing, JavaFX & SWT 6
M Daten zufällig Einlesen aus einer Datei (binäres Format) AWT, Swing, JavaFX & SWT 7
W Nullpointer Exception beim übertragen von Daten von Scene zu Scene AWT, Swing, JavaFX & SWT 6
W Daten von Controller zu Controller übertragen AWT, Swing, JavaFX & SWT 7
D Columns unabhängig voneinander mit Daten füllen JavaFx AWT, Swing, JavaFX & SWT 1
H Daten aus einer XML(x83-Datei) in einem JFrame anzeigen lassen AWT, Swing, JavaFX & SWT 9
T Anbinden der Tabelle an die Daten AWT, Swing, JavaFX & SWT 5
F JavaFX Tabelle mit Daten füllen AWT, Swing, JavaFX & SWT 9
A JavaFX Daten in eine HTML-Table mit JS schreiben AWT, Swing, JavaFX & SWT 3
ralfb1105 JavaFX Daten zwischen Controllern austauschen- neue Frage AWT, Swing, JavaFX & SWT 7
ralfb1105 JavaFX Daten zwischen Controller "austauschen" AWT, Swing, JavaFX & SWT 65
B AWT Bot um Daten auf Website einzugeben und die Antwort zu bekommen AWT, Swing, JavaFX & SWT 2
L Daten bearbeiten ohne GUI zu blockieren - daten haltung/zurück geben AWT, Swing, JavaFX & SWT 15
ralfb1105 Swing JComboBox update der Daten AWT, Swing, JavaFX & SWT 8
ralfb1105 Swing Dynamischer Graph zum anzeigen Perfomance Daten AWT, Swing, JavaFX & SWT 35
K TreeTableView (cellFactory) - wie Daten in Spalten einfügen AWT, Swing, JavaFX & SWT 0
J TableView Daten werden nicht ausgegeben AWT, Swing, JavaFX & SWT 9
A Swing Wie Daten in der Form speichern? Array oder ArrayList AWT, Swing, JavaFX & SWT 2
T JavaFX Model Daten übergeben AWT, Swing, JavaFX & SWT 4
D Swing Größe einer JComboBox im GridBagLayout aufgrund der maximalen Länge der enthaltenen Daten AWT, Swing, JavaFX & SWT 7
J JavaFX Tableview Daten hinzufügen aus anderer Klasse AWT, Swing, JavaFX & SWT 7
J Tableview Daten hinzufügen und aktualisieren AWT, Swing, JavaFX & SWT 5
S AWT Daten über TextField und Button in array speichern AWT, Swing, JavaFX & SWT 5
G Event Handling TableView daten in ein neues Fenster herauslesen? AWT, Swing, JavaFX & SWT 3
S JavaFX (Best Practise) Daten zwischen Controllern austauschen AWT, Swing, JavaFX & SWT 1
thet1983 JavaFX TableView Objekt Daten anzeige AWT, Swing, JavaFX & SWT 2
L JavaFX Verzögerung beim Laden von Daten AWT, Swing, JavaFX & SWT 6
L Daten in neuem Fenster AWT, Swing, JavaFX & SWT 2
Tort-E JavaFX Daten an WebView Komponente AWT, Swing, JavaFX & SWT 1
M Java FX Daten an Controller übergeben AWT, Swing, JavaFX & SWT 3
S JList ist leer, aber DefaultListModel hat die Daten? AWT, Swing, JavaFX & SWT 9
M JavaFX Von FXML-Controllerdatei Daten zurückgeben AWT, Swing, JavaFX & SWT 6
F JavaFX Daten aus Tabelle in ComboBox AWT, Swing, JavaFX & SWT 9
D Applet GWT speichert Daten nicht in Datenbank AWT, Swing, JavaFX & SWT 2
S SWT In Listen den Einträgen Daten zuordnen AWT, Swing, JavaFX & SWT 2
T SWT Table (mit Spinner Spalte) Daten auslesen AWT, Swing, JavaFX & SWT 4
H Swing JfreeChart aktualisieren - mit daten aus thread AWT, Swing, JavaFX & SWT 3
J valueChanged()-Methode liefert unbrauchbare Daten AWT, Swing, JavaFX & SWT 4
B Datenübergabe zwischen Tabs und Daten speichern AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben