JTable aktualisieren (nach Datenbank updade)

Status
Nicht offen für weitere Antworten.

Spyder

Mitglied
Hallo,
ich weiß, das Problem ist hier bekannt, leider finde ich aber keine konkrete Lösung zu meinem Problem, versuche das jetzt schon Stunden.

Also habe eine Tabelle und daneben ein Eingabebereich. Nach Ausfüllen der Textfelder werden die Daten in die Datenbank geschrieben. Leider wird aber nicht die Tabelle aktualiisert, bekomme dies auch nicht hin.

Der Code sieht wie folgt aus:

Code:
AbstractTableModel model = new MyTableModel();

//Im Konstruktor wird setTable() aufgerufen
public void setTable(){
        table = new JTable(model);
        table.setPreferredScrollableViewportSize(new Dimension(250, 270));
        table.setFillsViewportHeight(true);
        leftpanel.add(new JScrollPane(table));
    }

class MyTableModel extends AbstractTableModel {
        private String[] columnNames = {"Team", "Ort"};

        private Object[][] data = getTeams();
        
        public int getColumnCount() {
            return columnNames.length;
        }
        
        public int getRowCount() {
            return data.length;
        }
        
        public String getColumnName(int col) {
            return columnNames[col];
        }
        
        public Object getValueAt(int row, int col) {
            return data[row][col];
        }
        
        public Class getColumnClass(int c) {
            return getValueAt(0, c).getClass();
        }
        
        public boolean isCellEditable(int row, int col) {
            return false;
        }

        public void setValueAt(Object value, int row, int col) {
            data[row][col] = value;
            fireTableCellUpdated(row, col);
        }
        
    }
//Nach klick auf Hinzufügen Button wird dann per ActionListener die Methode insertTeam() aufgerufen,
//welche den Eintrag zur Datenbank hinzufügt.

Habe schon verschiedene Varianten mit TableListenern versucht, aber irgendwie hat nichts geklappt. Denke ich mache irgendwelche Fehler im Code. Ist das erste mal das ich mit TableModels arbeite.

Gruß und schon mal Danke
 
S

SlaterB

Gast
> Nach Ausfüllen der Textfelder werden die Daten in die Datenbank geschrieben. Leider wird aber nicht die Tabelle aktualiisert, bekomme dies auch nicht hin.

was für Textfelder? wie soll die JTable aktualisiert werden, welche Operation rufst du dazu bisher auf (oder gar nix?)

> Habe schon verschiedene Varianten mit TableListenern versucht, aber irgendwie hat nichts geklappt.

was sollen TableListenern mit dem Problem 'die JTable ändern' zu tun haben?

> Denke ich mache irgendwelche Fehler im Code.

welchen Code hast du denn bisher, der sich mit 'die JTable ändern' beschäftigt?
ich kann noch keinen entdecken
 

Spyder

Mitglied
Ok, dachte die Infos sind eher unwichtig fürs aktualisieren der JTable.

Aber gut hier die Methode die den Eintrag in die Datenbank schreibt

Code:
 public void insertTeam(){
        String d_tname = text_team.getText();
        String d_plz = text_plz.getText();
        String d_ort = text_ort.getText();
        String d_name = text_name.getText();
        String d_vname = text_vname.getText();
        String d_tel = text_telefon.getText();
        
        try{
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            Connection con =
                    java.sql.DriverManager.getConnection("jdbc:odbc:turnier");
            Statement s = con.createStatement();
            try {
                s.executeUpdate("INSERT INTO Teilnehmer VALUES ('"+d_tname+"', '"+d_plz+"', '"+d_ort+"', '"+d_name+"', '"+d_vname+"', '"+d_tel+"')");} catch (SQLException e) {}
        } catch (Exception e) {
            System.out.println("insertTeam - Fehler: " + e.getMessage());
        }
        
        text_team.setText("");
        text_plz.setText("");
        text_ort.setText("");
        text_name.setText("");
        text_vname.setText("");
        text_telefon.setText("");
        
    }

Die verschiedenen Versuche die ich unternommen habe, habe ich wieder rausgelöscht wenn sie nicht funktioniert haben, allein schon wegen der Übersichtlichkeit.

Wie im oberen Code schon zu sehen wird im abstracttablemodel mit

Code:
private Object[][] data = getTeams();

das data Array für das TableModel gefüllt.

Hier noch die Methoden die ich dazu benutze

Code:
    /*
     *Füllt Tabellenarray mit Werten aus Datenbank
     */
    public Object[][] getTeams(){
        int rowcnt = staticmethods.getRowcnt("Teilnehmer", "Teamname");
        Object[][] result = new Object[rowcnt][2];
        Object[] teams = getColumn("Teamname", rowcnt);
        Object[] orte = getColumn("Ort", rowcnt);
        
        for (int i=0; i<rowcnt; i++){
            result[i][0] = teams[i];
            result[i][1] = orte[i];
        }
        
        return result;
    }
    
    /*
     *Holt Spalte "Column" aus Tabelle "table"
     */
    public Object[] getColumn(String column, int rowcnt){
        int i=0;
        String[] combofeld = new String[rowcnt];
        
        try {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            Connection con = java.sql.DriverManager.getConnection("jdbc:odbc:turnier");
            Statement statement = con.createStatement();
            
            ResultSet result = statement.executeQuery("SELECT "+column+" FROM Teilnehmer");
            
            while (result.next()) {
                String team = result.getString(column);
                combofeld[i]=team;
                i++;
            }
            con.close();
        } catch (Exception e) {System.out.println("getColumn Fehler: " + e.getMessage());}
        return combofeld;
    }
 
S

SlaterB

Gast
aber diese Operation wird ja nur am Anfang ausgeführt, nicht nach dem Ausführen von
insertTeam()


am Ende von insertTeam() musst du das Model informieren,
dieses muss erneut
data = getTeams();
ausführen sowie mit
fireTableDataChanged();
die GUI (JTable) informieren
 

Spyder

Mitglied
So was hab ich mir schon gedacht, nur wie komme ich wieder an data ran? Muss ich ein ganz neues TableModel erzeugen, wenn ja wie?
 
S

SlaterB

Gast
nicht unbedingt,
du kannst auch das vorhandene Model dazu veranlassen, sich upzudaten

von außen sagst du nur
updateDich();
der Rest passiert intern im Model
 

Spyder

Mitglied
OK, nur wie sage ich dem Model das es sich updaten soll?
Meine Idee wäre alle Zeilen zu löschen und die neu hinzuzufügen?
Aber auch dafür hat AbstractTableModel keine Methoden.
Bin da ratlos? Wäre schön wenn es da eine einfache update Methode geben würde.
 
S

SlaterB

Gast
du hast doch class MyTableModel, das ist deine Klasse, da kannst du reinschreiben was du willst:

public void myUpdate() {
this.data = getTeams();
fireTableDataChanged();
}

fertig, nur noch aufrufen
 

Spyder

Mitglied
Jetzt hab ichs. Hatte model ja als AbstractTableModel und nicht direkt als MyTableModel definiert, daher kam ich an die selbstgeschriebenen Methoden in der Klasse MyTableModel nicht ran.
Jetzt klappts.

Danke dir.

Das nächste Ziel ist für mich jetzt das Ändern und Löschen. Sollte aber jetzt kein Problem mehr sein
 

Meru

Bekanntes Mitglied
SlaterB hat gesagt.:
fireTableDataChanged();

Das bringt doch aber nichts wenn die Daten in der Datenbank sind und diese vorher neu geladen werden sollen, oder?


Also ich mache das immer so:

Code:
public class MyTableModel extends DefaultTableModel {
	
    public MyTableModel() {
		super();
	}

	public MyTableModel(int rowCount, int columnCount) {
		super(rowCount, columnCount);
	}

	public MyTableModel(Object[] columnNames, int rowCount) {
		super(columnNames, rowCount);
	}

	public MyTableModel(Object[][] data, Object[] columnNames) {
		super(data, columnNames);
	}

	public MyTableModel(Vector columnNames, int rowCount) {
		super(columnNames, rowCount);
	}

	public MyTableModel(Vector data, Vector columnNames) {
		super(data, columnNames);
	}

	/*
     * JTable uses this method to determine the default renderer/
     * editor for each cell.  If we didn't implement this method,
     * then the last column would contain text ("true"/"false"),
     * rather than a check box.
     */
    public Class getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }
}

Code:
// Vereinfacht dargestellt
ClassXYZ{
  JTable _table;
  MyTableModel _tableModel;

  public void initComponents(){
    // Datenbankabfrage -> Speichern der Daten in 2 Vectoren (header und data)
    _table = new JTable();
    _tableModel = new MyTableModel(_v_tableData, _v_tableHeader);
    table.setModel(tableModel);
  )

  public void refreshTableData(){
     // Datenbankabfrage -> Speichern der Daten in 2 Vectoren (header und data)
    _tableModel.setDataVector(_v_tableData, _v_tableHeader);
  }
}
 
S

SlaterB

Gast
> Das bringt doch aber nichts wenn die Daten in der Datenbank sind und diese vorher neu geladen werden sollen, oder?


deswegen steht ja auch
this.data = getTeams();
davor, denn das sind die Daten, die bei getValueAt() zurückgeliefert werden,
entspricht _tableModel.setDataVector() beim DefaultTableModel
 

Meru

Bekanntes Mitglied
Na da hab ich den Quelltext in diesem Thread zu schnell überflogen. Hast dann natürlich recht ^^
 

Spyder

Mitglied
Hab nun ein neues (kleineres) Problem.
Habe jetzt weiter implementiert das bei klick auf eine Zeile, die Daten zur Zeile wieder in die Textfelder geschrieben wird.
Wenn man jetzt den Löschen-Button drück soll dieser Datensatz entfernt werden. Dies passiert auch, nur der Aufruf der Update Methode fürs TableModel funktioniert nicht mehr richtig.

Ich habe rausgefunden das
Code:
fireTableDataChanged();
einen ArrayOutOfBounds Error -1 zurückliefert. Aber warum?
Das selber passiert auch wenn ich die Felder per Buttonklick alle zurücksetze (also mit "" befülle) und dann
wieder einen Datensatz hinzufügen oder entfernen will. Denke das hat irgendwas damit zu tun das eine Zeile selektiert ist, es gibt aber keine Methode die eine Zeile deselektiert. Oder liegts wo anders dran?

Also wenn ich ohne vorher eine Zeile zu selektieren einen Datensatz einfüge klappts.

nochmal der geänderte Code:


RowListener
Code:
private class RowListener implements ListSelectionListener {
        public void valueChanged(ListSelectionEvent event) {
            
            /*if (event.getValueIsAdjusting()) {
                return;
            }*/
            
            int rowcnt = staticmethods.getRowcnt("Teilnehmer", "Teamname");
            
            String tname = (String) table.getValueAt(table.getSelectedRow(),0);
            
            try {
                Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
                Connection con = java.sql.DriverManager.getConnection("jdbc:odbc:turnier");
                Statement statement = con.createStatement();
                
                ResultSet result = statement.executeQuery("SELECT * FROM Teilnehmer WHERE Teamname='"+tname+"'");
                
                while (result.next()) {
                    text_team.setText(result.getString(1));
                    text_plz.setText(result.getString(2));
                    text_ort.setText(result.getString(3));
                    text_name.setText(result.getString(4));
                    text_vname.setText(result.getString(5));
                    text_telefon.setText(result.getString(6));
                }
                con.close();
            } catch (Exception e) {System.out.println("getColumn Fehler: " + e.getMessage());}
        }
    }

Hier die funktionierende delete Methode
Code:
public void deleteTeam(){
        String d_tname = text_team.getText();
        
        try{
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            Connection con =
                    java.sql.DriverManager.getConnection("jdbc:odbc:turnier");
            Statement s = con.createStatement();
            try {
                s.executeUpdate("DELETE FROM Teilnehmer WHERE Teamname='"+d_tname+"'");} catch (SQLException e) {}
            con.close();
        } catch (Exception e) {
            System.out.println("deleteTeam - Fehler: " + e.getMessage());
        }

        text_team.setText("");
        text_plz.setText("");
        text_ort.setText("");
        text_name.setText("");
        text_vname.setText("");
        text_telefon.setText("");
    }


Wäre super wenn jemand da noch ne Lösung hat. Ich sehe noch nicht mal richtig das Problem.

Gruß
 
S

SlaterB

Gast
> es gibt aber keine Methode die eine Zeile deselektiert

fängt mit remove an, siehe API

zum Rest kann ich nicht viel sagen ohne ein Gesamtprogramm und Ablaufbeschreibung zum Fehler hin,
und selbstverständlich ohne DB-Operationen, kannst du auch alles (testweise) im Arbeitsspeicher vorhalten



---------

warum hast du eigentlich
try {
s.executeUpdate("DELETE FROM Teilnehmer WHERE Teamname='"+d_tname+"'");} catch (SQLException e) {}

innerhalb des
try {
} catch (Exception e) {
Ausgabe
}
Blocks? lass das innere try/ catch weg
 

Spyder

Mitglied
Hi,
ich habs durch zufall gefunden. Nach dem löschen eines Datensatzes
rufe ich ja deleteTeam(); und dann model.myUpdate(); auf. Es fehlt aber aus irgendeinem Grund noch ein repaint(); damit der die Tabelle korrekt darstellt. fireTableDataChanged schmeißt zwar immer noch ein Fehler, den hab ich aber abgefangen. Also beim Einfügen von Datensätzen benötigt der fireTableDataChanged (funktoniert in dem Fall auch) und beim löschen benötigt der noch ein repaint();

Danke nochmal für deine Hilfe!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D JTable aktualisieren Java Basics - Anfänger-Themen 2
J Jtable änderung soll graphics aktualisieren Java Basics - Anfänger-Themen 4
U jTable aktualisieren Java Basics - Anfänger-Themen 5
J JTable aktualisieren wenn TableModel sich ändert Java Basics - Anfänger-Themen 6
N Aktualisieren JTable Java Basics - Anfänger-Themen 2
M jTable aktualisieren Java Basics - Anfänger-Themen 5
H JTable richtig aktualisieren Java Basics - Anfänger-Themen 4
B JTable Werte aktualisieren Java Basics - Anfänger-Themen 2
F Aktualisieren einer einzelnen Zelle in JTable Java Basics - Anfänger-Themen 2
G JTable aktualisieren Java Basics - Anfänger-Themen 15
richis-fragen JTable den angezeigten WERT nicht den Wert aus dem Model ausgeben. Java Basics - Anfänger-Themen 3
richis-fragen JTable Header ausgeblendete (width = 0) nicht per mouseDragged aufziehen. Java Basics - Anfänger-Themen 9
richis-fragen JTable sowohl Spaltennamen wie auch Spaltenbeschriftungen Java Basics - Anfänger-Themen 7
richis-fragen JTable effektiv angezeigter Text ausgeben nicht Inhalt vom Model Java Basics - Anfänger-Themen 9
G JTable Listselectionlistener friert das Programm ein Java Basics - Anfänger-Themen 8
Mady Daten von JList & Combobox in JTable adden Java Basics - Anfänger-Themen 2
W Liste mit Listen in JTable darstellen Java Basics - Anfänger-Themen 1
J Zelleninhalt einer Jtable löschen Java Basics - Anfänger-Themen 2
E JTable einzelne Zelle färben Java Basics - Anfänger-Themen 2
thobren jtable arraylist Java Basics - Anfänger-Themen 12
thobren JTable Icon Java Basics - Anfänger-Themen 1
R Compiler-Fehler JTable mit XML befüllen | The constructor JTable(Object[], String[]) is undefined Java Basics - Anfänger-Themen 10
H Kapselung JProgressBar in JTable, aber getValueAt() greift nicht Java Basics - Anfänger-Themen 7
G JTable, Zeile auswählen und Ergebnis an Schaltfläche übergeben Java Basics - Anfänger-Themen 4
J Jtable Eingabe nach Klick ausserhalb der Tabelle übernehmen Java Basics - Anfänger-Themen 6
J JTable Spalteninhalt löschen Java Basics - Anfänger-Themen 1
J JTable Titel wird nicht angezeigt Java Basics - Anfänger-Themen 6
B jTable Spalte summieren Java Basics - Anfänger-Themen 7
N JTable auslesen Java Basics - Anfänger-Themen 6
O JTable in Excel mit Farben Java Basics - Anfänger-Themen 8
O Kommentar auf JTable Zelle Java Basics - Anfänger-Themen 2
M Jtable Reenderer Java Basics - Anfänger-Themen 0
O Popoup Menü im JTable richtig anzeigen Java Basics - Anfänger-Themen 6
M Jtable änderung updaten Java Basics - Anfänger-Themen 2
O JTable Suchfunktion Java Basics - Anfänger-Themen 2
M jTable bekommt null Java Basics - Anfänger-Themen 1
M JTable an andere Klasse übergeben Java Basics - Anfänger-Themen 2
M Datenbank in jTable Laden Java Basics - Anfänger-Themen 49
M Klasse in JTable einfügen Java Basics - Anfänger-Themen 7
S JTable Java Basics - Anfänger-Themen 16
S JTable mit Daten füllen Java Basics - Anfänger-Themen 7
L JTable Tagebuch Spaltenhöhe verändern Java Basics - Anfänger-Themen 3
S JTable - Filter an anderen Colums Java Basics - Anfänger-Themen 2
R JTable Suchfunktion mit SQL Daten Java Basics - Anfänger-Themen 2
C JTable update mit MySQL Datenbank Java Basics - Anfänger-Themen 1
C Best Practice JTable in MVC Pattern Java Basics - Anfänger-Themen 7
J Daten einer Textdatei in ein JTable importieren. Java Basics - Anfänger-Themen 3
A zykl. Aktualisierne JTable Java Basics - Anfänger-Themen 9
C Endlosschleife bei füllen von Daten im JTable Java Basics - Anfänger-Themen 5
C Werte aus JTable auslesen Java Basics - Anfänger-Themen 4
A Probleme beim zykl. aktulisieren von Daten in JTable Java Basics - Anfänger-Themen 3
V JTable welcher Listener ? Java Basics - Anfänger-Themen 7
D Falsche Zeile wird in JTable gelöscht Java Basics - Anfänger-Themen 6
D MySQL Abfrage in JTable speichern Java Basics - Anfänger-Themen 43
D JTable Zeile wird nicht in MySQL gelöscht Java Basics - Anfänger-Themen 16
D JTable Zeilen löschen Java Basics - Anfänger-Themen 5
C Klassen JTable wird ohne Header aufgebaut Java Basics - Anfänger-Themen 6
K (JTable) Text einer Zelle auf der linken Seite kürzel Java Basics - Anfänger-Themen 2
B Kniffel JTable Java Basics - Anfänger-Themen 5
N JTable flackert Java Basics - Anfänger-Themen 8
T JTable Daten aus txt datei Java Basics - Anfänger-Themen 3
J ArrayList wird in JTable falsch angezeigt Java Basics - Anfänger-Themen 0
J Eintragen von Personen in JTable Java Basics - Anfänger-Themen 4
X JTable mit grünen und roten Punkten Java Basics - Anfänger-Themen 2
LexeB4F DEL --> JTable Zelleninhalt Java Basics - Anfänger-Themen 3
R JTable Auslesen Java Basics - Anfänger-Themen 1
Crazynet jTable erste Zeile mit deffinierten Werten Java Basics - Anfänger-Themen 0
K Collections Sortieren nach zweiter Spalte in JTable Java Basics - Anfänger-Themen 18
J JTable Wert gleich überschreiben Java Basics - Anfänger-Themen 6
S Zeile entfernen aus JTable Java Basics - Anfänger-Themen 15
S JTable clonen Java Basics - Anfänger-Themen 5
H Best Practice PDF JTable Java Basics - Anfänger-Themen 4
S In JTable Zeile selektieren mit Mausklick Java Basics - Anfänger-Themen 16
D JTable Probleme beim Sortieren von Zahlen. Java Basics - Anfänger-Themen 6
M JTable mit XML datei befüllen Java Basics - Anfänger-Themen 1
F Zeile bei JTable hinzufügen Java Basics - Anfänger-Themen 6
K JTable Bild einfügen Java Basics - Anfänger-Themen 1
M [JTable] getValue throws ArrayOutOfBoundException Java Basics - Anfänger-Themen 1
B JTable - Highlighter ??? Java Basics - Anfänger-Themen 3
S JTable LinkedList <Objekt> befüllen Java Basics - Anfänger-Themen 1
S JTable dynamisch mit Datenbankinhalten füllen Java Basics - Anfänger-Themen 6
W JTable mit einem JButton-Array füllen Java Basics - Anfänger-Themen 4
O JScrollPane zu gross für JTable Java Basics - Anfänger-Themen 2
L JTable Row selected -> fireTableDataChange do nothing. Java Basics - Anfänger-Themen 3
E JTable + TableModel updaten? Java Basics - Anfänger-Themen 1
O java.lang.IndexOutOfBoundsException JTable autoSort Java Basics - Anfänger-Themen 5
F JTable adding Row Java Basics - Anfänger-Themen 5
P jTable getColumnClass, mit unterschiedlichen Klassen in einer Column? Java Basics - Anfänger-Themen 5
M Eingabe in JTable bei Eingabe korrigieren Java Basics - Anfänger-Themen 2
Z jtable problem (das tausendste??) Java Basics - Anfänger-Themen 12
J JTable Java Basics - Anfänger-Themen 7
T JTable Java Basics - Anfänger-Themen 2
T JTable einzelne Zeilen löschen Java Basics - Anfänger-Themen 3
S Farbe eine Zeile in JTable ändern, wenn JButton geklickt wurd Java Basics - Anfänger-Themen 4
Uzi21 jTable / Inhalt speichern Java Basics - Anfänger-Themen 2
M Problem mit JTable und Model Java Basics - Anfänger-Themen 3
F Methoden JTable + 2 For-Schleifen Java Basics - Anfänger-Themen 4
C jtextfield und jtable Java Basics - Anfänger-Themen 34
X JTable mit Inhalten aus JTextField o.ä. füllen Java Basics - Anfänger-Themen 4
G JTable: SelectionListener Problem Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben