Aktualisierung einer JTable in einem Scrollpane durch klick auf Button

Bullet1990

Mitglied
Guten Abend,

Ich suche nun schon seit Tagen im Web nach einer Lösung, aber bin wirklich nirgends fündig geworden, also dachte ich, dass ich doch mal frage. :)

Ich habe eine Programm geschrieben (zumindest sitz ich dran), das eine GUI besitzt.
Dabei handelt es sich um ein einfaches Datenbank-Programm.

Ziel ist es, Daten anzulegen, zu löschen, zu ändern etc.
Bei der Datenbank handelt es sich um eine SQLite-Datenbank.

Mein Problem liegt jedoch bei der JTable, die ich verwende, um die Daten aus der Datenbank anzuzeigen.

Beim Testen durch Eclipse öffnet es sich wie gewollt, die JTable zeigt die gesamten Daten der Datenbank auch wie gewollt an.

Klickt man nun auf den Button "Teil hinzufügen", so öffnet sich ein neues Fenster mit Textfeldern in die man die Daten eingibt.
Wenn man dann bestätigt, werden die Daten in die Datenbank geschrieben.

Genau hier ist mein Problem.
Nach Bestätigung schließt sich mein "Update-Fenster", wie geplant, und auf dem Main-Frame befindet sich noch die alte JTable.
Hier soll nun durch Klick auf den Button "Aktualisieren" die ganze Tabelle aktualisiert werden.

Ich habe es schon mit table.repaint() versucht, in org.apache.commons.dbutils.* gesucht und unzählige anderen Methoden probiert. Jedoch blieb meine JTable unaktualisiert.

Man erhält erst die aktuelle Tabelle, wenn man das Programm schließt und nochmal ausführt.


Hier habt ihr meinen Code:

(Ich lass die Imports und ein paar Buttons, die keinen Einfluss darauf haben, aus, damit der Code hier keinen erschlägt :) )

Code:
public class TeileGUI {
	
	Lager lager = new Lager();

	private JFrame frmAutoLagerbestand;
	private JTable table;
	static int l = 0;
	static Zeile[] results;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		
		
		
		try{
			Class.forName( "org.sqlite.JDBC" );
			Connection cn = DriverManager.getConnection( "jdbc:sqlite:/D:/TeileDB.sqlite");
			Statement st = cn.createStatement();
			String qry = "SELECT COUNT(id) FROM Teile";
			ResultSet  rs = st.executeQuery(qry);
			rs.next();
			String count = rs.getString("COUNT(id)");
			int c = Integer.parseInt(count);
			Zeile [] zeilen = new Zeile[ c];
			l = c;
			String qry1 = "SELECT * FROM Teile";
			ResultSet rs1 = st.executeQuery(qry1);
			int index = 0;
			
			
			
			while(rs1.next()){
				zeilen[index] = new Zeile(rs1.getInt("ID"), rs1.getString("Bezeichnung"),
								rs1.getString("Hersteller"),rs1.getString("Modell"),
								rs1.getInt("Baujahr"), rs1.getDouble("Preis"), rs1.getInt("Anzahl"), rs1.getString("Ort"));
				index++;	
				
			}
			results = zeilen;
			
			
			
			
			
		}catch (Exception e)
		{
			e.printStackTrace();
			}
		
		
		
		
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					TeileGUI window = new TeileGUI();
					window.frmAutoLagerbestand.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public TeileGUI() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frmAutoLagerbestand = new JFrame();
		frmAutoLagerbestand.getContentPane().setFont(new Font("Times New Roman", Font.PLAIN, 12));
		frmAutoLagerbestand.getContentPane().setForeground(Color.LIGHT_GRAY);
		frmAutoLagerbestand.setTitle("Auto-J\u00E4ger Lagerbestand");
		frmAutoLagerbestand.setForeground(Color.BLACK);
		frmAutoLagerbestand.setFont(new Font("Calibri", Font.PLAIN, 12));
		frmAutoLagerbestand.setBounds(100, 100, 997, 499);
		frmAutoLagerbestand.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frmAutoLagerbestand.getContentPane().setLayout(null);
		
		
		
		
		JScrollBar scrollBar = new JScrollBar();
		scrollBar.setBounds(979, 143, 16, 5);
		frmAutoLagerbestand.getContentPane().add(scrollBar);
		

		JButton btnTeilHinzufgen = new JButton("Teil hinzuf\u00FCgen");
		btnTeilHinzufgen.setBounds(839, 153, 105, 23);
		btnTeilHinzufgen.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				frmAdd add = new frmAdd();
				l++;
							}
		});
		frmAutojgerLagerbestand.getContentPane().add(btnTeilHinzufgen);
		
		/* Hier hab ich probleme, es passiert nicht das, was ich erreichen will
                    ich hab erstmal die repaint-Methode stehen lassen, weil das die häufigste Antwort in anderen Foren war */

		JButton btnAktualisieren = new JButton("Aktualisieren");
		btnAktualisieren.setBounds(854, 115, 75, 23);
		btnAktualisieren.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				try{
					
					table.repaint();
				}
				catch (Exception e)
				{
					e.printStackTrace();
					}							
				
				
			}
		});
		frmAutojgerLagerbestand.getContentPane().add(btnAktualisieren);
		
		
		JButton btnBeenden = new JButton("Beenden");
		btnBeenden.setBounds(854, 385, 75, 23);
		btnBeenden.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});
		frmAutojgerLagerbestand.getContentPane().add(btnBeenden);
		
		final JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(59, 69, 747, 339);
		frmAutojgerLagerbestand.getContentPane().add(scrollPane);
		
		table = new JTable();
		
		
		
		
		
		scrollPane.setViewportView(table);
		table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		Object[][] matrix = new Object[l][8];
		
		for(int i = 0; i < l; i++)
			{
				matrix[i][0] = results[i].getID();
				matrix[i][1] = results[i].getBezeichnung();
				matrix[i][2] = results[i].getHersteller();
				matrix[i][3] = results[i].getModell();
				matrix[i][4] = results[i].getBaujahr();
				matrix[i][5] = results[i].getPreis();
				matrix[i][6] = results[i].getAnzahl();
				matrix[i][7] = results[i].getOrt();
				
			}
		table.setModel(new DefaultTableModel(
			matrix,
			new String[] {
				"ID", "Bezeichnung", "Modell", "Marke", "Baujahr", "Preis", "Anzahl", "Lagerort"
			}
		));
		
	
		
		String [] columnNames = {"ID","Teilbezeichnung","Fahrzeughersteller","Fahrzeugmodell",
				"Baujahr","Preis","Anzahl","Lagerort"
		};
		
		String [][] rowData = {
				{"1","Scheinwerfer","BMW","525i","1998","50","2","Schrottplatz"},
				{"2","Reifen","Mercedes-Benz","A-Klasse","2001","35.50","4","Reifenstapel"}
		};
		
		
		
		
		
	}

	
}

Die Klasse Zeile ist dabei eine eine einfache Klasse, die als eine Art Container dient für die Daten einer Zeile aus der Datenbank.


Ich danke schonmal im Vorraus für die Hilfe.


MfG
 

Akeshihiro

Erfahrenes Mitglied
Das repaint() an sich bringt dir doch überhaupt nichts. Du musst dabei die Daten aus der Datenbank neu einlesen und in die Tabelle schieben, wie sollen die Daten denn sonst in die Tabelle gelangen.
 

Bullet1990

Mitglied
Ja, natürlich!
Ich hab so viel rumprobiert, auch neue Daten in die Tabelle reinzuschreiben, aber nicht einmal kam ich auf die Idee, die Daten einzulesen und am Ende die repaint-Methode aufzuführen. :D

Danke vielmals für den Tipp, es funktioniert wie gewollt :)

Also für alle die das gleiche Problem haben hier poste ich den Code mit dem man per Klick die JTable aktualisiert.

Code:
JButton btnAktualisieren = new JButton("Aktualisieren");
btnAktualisieren.setBounds(854, 115, 75, 23);
btnAktualisieren.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				try{
					
					int zaehler;
					Zeile[] result;   

                                      /* Die Klasse Zeile ist eine Klasse, die eine Zeile der DB enthält, wenn eure DB zB
                                      Spalten wie "Name","Vorname","Alter" enthält, dann definiert ihr in der Klasse Zeile
                                       auch Typen wie "String name, vorname" und "int alter", denkt dran Get-Methoden rein zu schreiben */
 
					
                                        //Hier sind die gewohnten SQLite-Befehle
					Class.forName( "org.sqlite.JDBC" );
					Connection cn = DriverManager.getConnection( "jdbc:sqlite:/D:/TeileDB.sqlite"); 
					Statement st = cn.createStatement();

                                    //  ******************** Hier wird die Anzahl der Zeilen gezählt **************
					String qry = "SELECT COUNT(id) FROM Teile";    
					ResultSet  rs = st.executeQuery(qry);
					rs.next();


                                   // ******************* Dann wird ein Array erstellt, das jeweils eine Zeile aus der DB enthält *******
					String count = rs.getString("COUNT(id)");
					int c = Integer.parseInt(count);
					Zeile [] zeilen = new Zeile[ c];

					zaehler = c;

                                   // *************  Hier werden alle Zeilen aus der DB abgerufen und im Zeilen-Array gespeichert ******
					String qry1 = "SELECT * FROM Teile";
					ResultSet rs1 = st.executeQuery(qry1);
					
					int index = 0;
					
					while(rs1.next()){
						zeilen[index] = new Zeile(rs1.getInt("ID"), rs1.getString("Bezeichnung"),
										rs1.getString("Hersteller"),rs1.getString("Modell"),
										rs1.getInt("Baujahr"), rs1.getDouble("Preis"), rs1.getInt("Anzahl"),               rs1.getString("Ort"));
						index++;	
						
					}
					
					result = zeilen;
					
						Object[][] matrix = new Object[zaehler][8];
						
						for(int i = 0; i < zaehler; i++)
							{
								matrix[i][0] = result[i].getID();
								matrix[i][1] = result[i].getBezeichnung();
								matrix[i][2] = result[i].getHersteller();
								matrix[i][3] = result[i].getModell();
								matrix[i][4] = result[i].getBaujahr();
								matrix[i][5] = result[i].getPreis();
								matrix[i][6] = result[i].getAnzahl();
								matrix[i][7] = result[i].getOrt();
								
							}
						
					
					/* Eure Tabelle, die ihr vorher definiert habt kriegt hier ein neues Model zugewiesen 
                                            und zwar die aktuelle Tabelle */
					
					table.setModel(new DefaultTableModel(
							matrix,
							new String[] {
								"ID", "Bezeichnung", "Modell", "Marke", "Baujahr", "Preis", "Anzahl", "Lagerort"
							}
						));
					
					
					
					table.repaint();  // Und am Ende wird die Tabelle neu gezeichnet
					
					
				}
				catch (Exception e)
				{
					e.printStackTrace();
					}							
				
				
			}
		});
		frmAutojgerLagerbestand.getContentPane().add(btnAktualisieren);