jTable mit Model lässt sich nicht neu laden

Status
Nicht offen für weitere Antworten.

Padde85

Mitglied
Ich habe ein kleines Problem.

Und zwar arbeite ich mit Eclipse 3.1 und habe eine Scrollpane mit jTable erstellt.

Dieser jTable habe ich ein Tablemodel verpasst. Dieses Model läuft auch beim ersten start und lädt aus der Datenbank die Daten in das jTable rein.

Nun habe ich einen Button, der mir zwei Werte erhöht und anschließend das Model bzw die jTable neu aufbauen soll mit Werten aus der DB, da sich ja jetzt die Selektionskriterien geändert haben.

Allerdings passiert nix beim Klick auf den Button, die Krieterien werden aber hochgezählt, wie es sein sollte.

Hier mal der komplette Sourcecode, der dafür wichtig ist.

Hier der Button und seine Funktionalität:
Code:
private JButton getBtnNextmonth() {
		if (btnNextmonth == null) {
			btnNextmonth = new JButton();
			btnNextmonth.setBounds(new java.awt.Rectangle(669,48,108,23));
			btnNextmonth.setText(">>");
			btnNextmonth.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					if(month==11) 
					{
						month = 0;
						year++;
					}
					else month++;
				labMonat.setText(monate[month]+" "+year);
                                tabCenter.revalidate();
				}
			});
		}
		return btnNextmonth;
	}


Und hier die Scrollpane, die jTable und das Model:
Code:
private JScrollPane getScrCenter() {
		if (scrCenter == null) {
			scrCenter = new JScrollPane();
			scrCenter.setBounds(new java.awt.Rectangle(76,30,1139,766));
			scrCenter.setViewportView(getTabCenter());
		}
		return scrCenter;
	}

	/**
	 * This method initializes tabCenter	
	 * 	
	 * @return javax.swing.JTable	
	 */
	private JTable getTabCenter() {
		if (tabCenter == null) {
			tabCenter = new JTable();
			tabCenter.setCellSelectionEnabled(true);
			tabCenter.setModel(getTabmodModel());
		}
		return tabCenter;
	}

	/**
	 * This method initializes tabmodModel	
	 * 	
	 * @return javax.swing.table.DefaultTableModel	
	 */
	private DefaultTableModel getTabmodModel() {
		int zaehler = 0;
		int zaehler2 = 0;
		int anz = 0;
		
		if (tabmodModel == null) {
			tabmodModel = new DefaultTableModel();
			tabmodModel.setColumnIdentifiers(ueber);
			
			try {
				createquery("select ein_aus,text,betrag,monat,jahr from konto where monat="+month+" and jahr="+year);
				rs.last();
				anz = rs.getRow();
				rs.first();
			} catch (SQLException e1) { System.out.print(e1);	}
			
			String[][] ein = new String[anz][2];
			String[][] aus = new String[anz][2];
			String[][] data = new String[anz][4];
			try {
				if(rs.getRow()!=0)
				{
				do
				{
					if(rs.getDouble("ein_aus")==0)
					{
						ein[zaehler][0] = rs.getString("text");
						ein[zaehler][1] = Double.toString(rs.getDouble("betrag"));
						zaehler++;
					}
					else
					{
						aus[zaehler2][0] = rs.getString("text");
						aus[zaehler2][1] = Double.toString(rs.getDouble("betrag"));
						zaehler2++;
					}
				}
				while(rs.next());
				}
			} catch (SQLException e1) { }
			if(ein.length >= aus.length)
			{
				for(int i=0;i<ein.length;i++)
				{
					data[i][0] = ein[i][0];
					data[i][1] = ein[i][1];
					if(i <= aus.length)
					{
						data[i][2] = aus[i][0];
						data[i][3] = aus[i][1];
					}
					else
					{
						data[i][2] = "";
						data[i][3] = "";
					}
				tabmodModel.addRow(data[i]);
				}
			}
			else
			{
				for(int i=0;i<aus.length;i++)
				{
					if(i <= ein.length)
					{
						data[i][0] = ein[i][0];
						data[i][1] = ein[i][1];
					}
					else
					{
						data[i][0] = "";
						data[i][1] = "";
					}
				data[i][2] = aus[i][0];
				data[i][3] = aus[i][1];
				tabmodModel.addRow(data[i]);
				}
			}
			
			tabmodModel.addTableModelListener(new javax.swing.event.TableModelListener() {
				public void tableChanged(javax.swing.event.TableModelEvent e) {
					//DB-Update
				}
			});
		}
		return tabmodModel;
	}


Würde mich freuen, wenn hierzu jemand eine Lösung finden würde, dass die jTable neu aufgebaut wird beim Klick auf den Button 🙂

das tabCenter.revalidate(); war die letzte Lösung die ich ausprobiert habe, habe auch schon versucht, das Model neu zu übergeben, hat auch net gefunzt 🙁

Viel Spaß beim tüfteln 🙂
 
dein ActionListener macht doch nix außer revalidate() und paar Variablen zu setzen,
wo wird das Model geändert?
 
das ist es ja grad.

Wo muss ich was ändern, damit die Tabelle neu aufgebaut wird?
Ich hatte schon versucht, beim klick auf den Button getTabmodModel() aufzurufen.
Das hat aber auch net gefunzt.

Mein Gedanke dabei war, dass monat und jahr als private in der Klasse verfügbar sind, also im gesamten Programm.
Und damit eigentlich das Model neu aufgebaut werden müsste, hat sich aber als Trugschluss rausgestellt. Deswegen erhoffe ich mir ja von euch en Fingerzeig wo ich ansetzen muss 🙂
 
dann fange aber damit an ein TableModel mit Testdaten "Test1" und "Test2" neu zu setzen,
nicht mit 100 Zeilen komplizierten Extra-Code,
der mit dem allgemeinen Problem, die Daten zu ändern, nix zu tun hat,

--------

im DefaultTableModel gibts eine Operation namens setDataVector() oder removeRow()/ addRow(),
Daten neu setzen ist also kein Problem,

dann musst du noch an die Daten kommen, der Code ist wahrscheinlich in getTabmodModel() versteckt und muss da raus in seine separate Operation wie fillTableModel() oder getData()

und dann musst du natürlich noch vom ActionListener aus darauf zugreifen, wenn das alles in einer Klasse passiert, dann ist das nicht ganz so schwer,
ansonsten muss die andere Klasse bzw. das Objekt davon bekannt sein

------

diese Top Level-Schritte erfordern natürliche viele kleine Einzelheiten, die ich nicht alle hier erkläre,
kannst versuchen nachzufragen (ich gehe jetzt aber schlafen),
im Allgemeinen klingt deine Frage aber danach, dass dir viele Grundlagen fehlen
 
dann werde ich das mal machen, die datenbank-Abfrage auszugliedern.

Und ja, das passiert alles in einer einzigen klasse, von daher muss nix neu bekannt gemacht werden.

Und werde dann hinterher auch mal die Reihen entfernen und neue dem Model übergeben.

Und Grundlagen fehlen... nunja, ist zwar mein erstes Java-Projekt aber habe schon in C++ und Delphi andere projekte realisiert, aber das unterscheidet sich doch grundlegend habe ich das Gefühl.
 
danke dir SlaterB.

Dein Tip hats gebracht.
Die Tabelle wird nun automatisch immer neu gefüllt bei jedem Buttonclick.

🙂
Saubere Arbeit :toll:
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben