JTable aktualisieren

jueman

Grünschnabel
Hallo,

bin ziemlich neu beim Programmieren mit Java.

Habe es hingekriegt, ein kleines Programm zu schreiben, welches eine MySQL-DB abfragt und sie auch aktualisiert. Dazu habe ich in der Methode setValueAt eine eigene UPDATE-Funktion für die MySQL-DB eingebaut. Der Wert wird auch in der DB aktualisiert, und auch im JTable aktualisiert angezeigt. Einziges Problem, die Tabelle soll nun auch sortiert angezeigt werden, und zwar nicht nach einer Sortierroutine von java, sondern nach der SQL-ABfrage mit ORDER BY, so wie sie sortiert angezeigt wird, beim ersten Anzeigen der Tabelle. Es muß doch möglich sein, eine Funktion ausfindig zu machen, die die Tabelle so aufruft, wie der erste Aufruf über das Menü. Ich suche schon seit 2 Tagen, habe schon alles Mögliche mit Listeners und Events ausprobiert, ich komm einfach nicht drauf:

Hier der Code:

Java:
/*
 * GerichtTableModel.java
 *
 * Created on 25. Juli 2007, 16:09
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package dblib;

import doku0001.doku;
import javax.swing.table.AbstractTableModel;
import java.sql.*;
import java.util.ArrayList;

/**
 *
 * @author jue
 */
public class GerichtTableModel extends AbstractTableModel {
    
    private boolean DEBUG = false;
    
    private int colnum = 4;
    private int rownum;
    private String[] colNames = { "gericht_id", "gericht_name", "gericht_proz_aufschlag", "gericht_preisfest" };
    private ArrayList<String[]> ResultSets;
    
    /** Creates a new instance of GerichtTableModel */
    public GerichtTableModel( ResultSet rs ) {
        
        ResultSets = new ArrayList<String[]>();
        try {
            while(rs.next()){
                String[] row = {
                    rs.getString("gericht_id"), rs.getString("gericht_name"), rs.getString("gericht_proz_aufschlag"), rs.getString("gericht_preisfest")
                };
                ResultSets.add(row);
            }
        } catch (Exception e) {
            System.out.println("Exception in GerichtTableModel");
        }
    }
    
    public Object getValueAt(int rowIndex, int columnIndex) {
        String[] row = ResultSets.get(rowIndex);
        return row[columnIndex];
    }
    
    public int getRowCount() {
        return ResultSets.size();
    }
    
    public int getColumnCount() {
        return colnum;
    }
    
    public String getColumnName( int param ){
        return colNames[param];
    }
    
    public boolean isCellEditable(int row, int col) {
        //Note that the data/cell address is constant,
        //no matter where the cell appears onscreen.
        if (col < 1) {
            return false;
        } else {
            return true;
        }
    }
    
    public void setValueAt(Object value, int rowIndex, int columnIndex) {
        if (DEBUG) {
            System.out.println("Setting value at " + rowIndex + "," + columnIndex
                    + " to " + value
                    + " (an instance of "
                    + value.getClass() + ")");
        }
        
        String[] row = ResultSets.get(rowIndex);
        row[columnIndex] = (String) value;
        String gericht_id = row[0];
        
        try {
            dblc = new DBLibClass();
        } catch (Exception e) {
            System.out.println("Exception Aufruf DBLibClass");
        }
        
        dblc.updateGerichtSetRow(row);
        
        fireTableCellUpdated(rowIndex, columnIndex);
        
        if (DEBUG) {
            System.out.println("New value of data:");
            printDebugData();
        }
    }

    private void printDebugData() {
        int numRows = getRowCount();
        int numCols = getColumnCount();
        
        for (int i=0; i < numRows; i++) {
            System.out.print("    row " + i + ":");
            for (int j=0; j < numCols; j++) {
                //System.out.print("  " + data[i][j]);
            }
            System.out.println();
        }
        System.out.println("--------------------------");
    }
    
    private DBLibClass dblc;
    private doku dokuclass;
    
}

Java:
/*
 * DBLibClass.java
 *
 * Created on 25. Juli 2007, 14:13
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package dblib;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.ResultSet;
import java.sql.SQLException;

/**
 *
 * @author jue
 */
public class DBLibClass {
    
    /** Creates a new instance of DBLibClass */
    public DBLibClass()  throws Exception {
        mdbc = new MyDBConnection();
        mdbc.init();
        Connection conn = (Connection) mdbc.getMyConnection();
        stmt = conn.createStatement();
    }
    
    public ResultSet getResultFromGericht() {
        ResultSet rs = null;
        try{
            rs = (ResultSet) stmt.executeQuery("SELECT * FROM k_gericht ORDER BY gericht_name");
        } catch(SQLException e){
            System.out.println("Fehler bei Abfrage: getResultFromGericht: SELECT * FROM k_gericht ORDER BY gericht_name");
        }
        return rs;
    }
    
    public boolean updateGerichtSetRow(String[] row) {
        
        String gericht_id = row[0];
        String gericht_name = row[1];
        String gericht_proz_aufschlag = row[2];
        String gericht_preisfest = row[3];
        
        String updateStr="";
        
        try{
            updateStr="UPDATE k_gericht SET gericht_name = " + quotate(gericht_name) + "," +
                    "gericht_proz_aufschlag = " + quotate(gericht_proz_aufschlag) + "," +
                    "gericht_preisfest = " + quotate(gericht_preisfest) +
                    " WHERE gericht_id = " + quotate(gericht_id);
            
            int done=stmt.executeUpdate(updateStr);
            
            return true;
            
        } catch(Exception e){
            e.printStackTrace();
            return false;
        }
    }
    
    public String quotate(String content){
        
        return "'"+content+"'";
    }
    
    private java.sql.Statement stmt;
    private MyDBConnection mdbc;
}

und hier das Hauptprogramm mit main:

Java:
/*
 * doku.java
 *
 * Created on 23. Juli 2007, 12:46
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package doku0001;

import com.mysql.jdbc.ResultSetMetaData;
import dblib.*;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.ResultSet;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.swing.*;

/**
 *
 * @author jue
 */
public class doku extends javax.swing.JLayeredPane{
    
    /** Creates a new instance of doku */
    public doku() throws Exception {
        
        mdbc = new MyDBConnection();
        mdbc.init();
        Connection conn = (Connection) mdbc.getMyConnection();
        stmt = conn.createStatement();
        
        JFrame frame = new JFrame("doku");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        JMenuBar menuBar;
        JMenu menu, submenu;
        JMenuItem MI_bewohner;
        JMenuItem MI_gesetzlichebetreuer;
        
        // Create the menu bar
        menuBar = new JMenuBar();
        
        // Build the first menu.
        menu = new JMenu("Allgem. Daten");
        menu.setMnemonic(KeyEvent.VK_A);
        menuBar.add(menu);
        
        frame.setJMenuBar(menuBar);
        
        pane = frame.getContentPane();
        
        JPanel card1 = new JPanel();
        card1.add(new JButton("Button 1"));
        card1.add(new JButton("Button 2"));
        card1.add(new JButton("Button 3"));
        
        JPanel card2 = new JPanel();
        nameField = new JTextField(30);
        card2.add(nameField);
        
        label = new JLabel();
        card2.add(label);
        //card2.add(new JTextField("nameField", 20));
        
        jScrollPane1 = new javax.swing.JScrollPane();
        
        card2.add(jScrollPane1);
        
        MI_bewohner = new JMenuItem("Bewohner", KeyEvent.VK_B);
        menu.add(MI_bewohner);
        
        MI_bewohner.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                MI_bewohnerActionPerformed(evt);
            }
        });
        
        MI_gesetzlichebetreuer = new JMenuItem("Gesetzl. Betreuer", KeyEvent.VK_G);
        menu.add(MI_gesetzlichebetreuer);
        
        MI_gesetzlichebetreuer.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                MI_gesetzlichebetreuerActionPerformed(evt);
            }
        });
        
        //Create the panel that contains the "cards".
        cards = new JPanel(new CardLayout());
        cards.add(card1, "BUTTONPANEL");
        cards.add(card2, "TEXTPANEL");
        
        //pane.add(comboBoxPane, BorderLayout.PAGE_START);
        pane.add(cards, BorderLayout.CENTER);

        //Display the window.
        frame.setSize(1000,700);
        //frame.pack();
        frame.setVisible(true);
    }

    private void MI_bewohnerActionPerformed(java.awt.event.ActionEvent evt) {
        
        CardLayout cl = (CardLayout)(cards.getLayout());
        cl.show(cards, "TEXTPANEL");
        
        ResultSetMetaData rowcount;
        
        ResultSet rs_ = null;
        
        try{
            rs_ = (ResultSet)stmt.executeQuery("Select * from k_gericht" +
                    " ORDER BY gericht_name DESC");
            
            while(rs_.next()){
                nameField.setText(rs_.getString("gericht_name"));
                label.setText(rs_.getString("gericht_name"));
            }
        } catch(Exception e){
            System.out.println("Exception in doku");
        }
        
        
        try {
            dblc = new DBLibClass();
        } catch (Exception e) {
            System.out.println("Exception Aufruf DBLibClass");
        }
        
        gerichtTable = new javax.swing.JTable();

        ResultSet rs = dblc.getResultFromGericht();
        gerichtTable.setModel(new GerichtTableModel(rs));
        
        mdbc.close(rs);
        jScrollPane1.setViewportView(gerichtTable);
    }
    
    private void MI_gesetzlichebetreuerActionPerformed(java.awt.event.ActionEvent evt) {
        
        CardLayout cl = (CardLayout)(cards.getLayout());
        cl.show(cards, "BUTTONPANEL");
        
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                try {
                    new doku();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        });
    }
    
    private Container pane;
    private JPanel cards;
    private MyDBConnection mdbc;
    private java.sql.Statement stmt;
    private JTextField nameField;
    private JLabel label;
    private DBLibClass dblc;
    private javax.swing.JTable gerichtTable;
    private javax.swing.JScrollPane jScrollPane1;
}
 
Zuletzt bearbeitet:
Hallo,

ich weiß nicht ob es am Montag Morgen liegt, aber ich verstehe dein Problem gerade nicht. Du willst die Tabelle nicht mit Java sortieren. Du kennst den Befehl ORDER BY, also warum machst du stellst du nicht eine neue Anfrage an die DB die dir die Tabelle mit neuem Datensatz sortiert ausgibt?


Benutze doch bitte das nächste mal die Code-Tags!

MFG

zEriX
 
Hallo, zEriX,

o.k., vielleicht habe ich mich etwas unklar ausgedrückt! Ich kann natürlich eine neue Anfrage an die Datenbank stellen mit der erneuten Sortierung nach ORDER BY, aber das JTable wird nicht neu ausgegeben! Habe jetzt in der Methode setValueAt zusätzlich den Aufruf zum Sortieren nochmals angehängt: dblc.getResultFromGericht();

Soweit ich es verstanden habe, wird die Aktualisierung der Anzeige durch Events und Listener bewirkt, sozusagen durch das Verlassen der Zelle ( wie lostFocus in anderen Programmiersprachen ). Der Befehl dazu lautet:

fireTableCellUpdated(rowIndex, columnIndex);

oder für die gesamte Tabelle:

fireTableStructureChanged();

trotzdem wird zwar ein Zellinhalt wie z.B. Butter in Kutter geändert und auch so angezeigt, die Tabelle wird aber auch trotz des erneuten Aufrufes von getResultFromGericht() nicht aktualisiert angezeigt.

Im Hauptprogramm doku.java kommen zum Ausgeben der Tabelle ja noch folgende Codezeilen dazu:

gerichtTable.setModel(new GerichtTableModel(rs));
mdbc.close(rs);
jScrollPane1.setViewportView(gerichtTable);

Ich denke mal, daß die Ausgabe letzten Endes durch den Befehl setViewportView ... bewirkt wird. Nur, mir ist es nicht gelungen, diesen Befehl von der Datei GerichtTableModel.java aus aufzurufen. Ist wahrscheinlich auch falsch. Irgendwie muß ich wahrscheinlich so etwas wie einen TableModelListener einbauen. Weiß aber nicht, wie das geht!

Habe diesbezüglich die Methode tableChanged eingebaut, die wird aber überhaupt nicht ausgelöst. (Durch Debuggen getestet) (... und das hier angepasst: implements TableModelListener ...)

Hier nochmal meine derzeitige Implementierung der Datei GerichtTableModel.java:

Java:
/*
 * GerichtTableModel.java
 *
 * Created on 25. Juli 2007, 16:09
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package dblib;

import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import java.sql.*;
import java.util.ArrayList;

/**
 *
 * @author jue
 */
public class GerichtTableModel extends AbstractTableModel implements TableModelListener {
    
    private boolean DEBUG = false;
    
    private int colnum = 4;
    private int rownum;
    private String[] colNames = { "gericht_id", "gericht_name", "gericht_proz_aufschlag", "gericht_preisfest" };
    private ArrayList<String[]> ResultSets;
    
    /** Creates a new instance of GerichtTableModel */
    public GerichtTableModel( ResultSet rs ) {
        
        ResultSets = new ArrayList<String[]>();
        try {
            while(rs.next()){
                String[] row = {
                    rs.getString("gericht_id"), rs.getString("gericht_name"), rs.getString("gericht_proz_aufschlag"), rs.getString("gericht_preisfest")
                };
                ResultSets.add(row);
            }
        } catch (Exception e) {
            System.out.println("Exception in GerichtTableModel");
        }
    }
    
    public Object getValueAt(int rowIndex, int columnIndex) {
        String[] row = ResultSets.get(rowIndex);
        return row[columnIndex];
    }
    
    public int getRowCount() {
        return ResultSets.size();
    }
    
    public int getColumnCount() {
        return colnum;
    }
    
    public String getColumnName( int param ){
        return colNames[param];
    }
    
    public boolean isCellEditable(int row, int col) {
        //Note that the data/cell address is constant,
        //no matter where the cell appears onscreen.
        if (col < 1) {
            return false;
        } else {
            return true;
        }
    }
    
    public void setValueAt(Object value, int rowIndex, int columnIndex) {
        if (DEBUG) {
            System.out.println("Setting value at " + rowIndex + "," + columnIndex
                    + " to " + value
                    + " (an instance of "
                    + value.getClass() + ")");
        }
        
        String[] row = ResultSets.get(rowIndex);
        row[columnIndex] = (String) value;
        String gericht_id = row[0];
        
        try {
            dblc = new DBLibClass();
        } catch (Exception e) {
            System.out.println("Exception Aufruf DBLibClass");
        }
        
        dblc.updateGerichtSetRow(row);
        
        dblc.getResultFromGericht();
        //setModel(new GerichtTableModel(rs));
        
        //fireTableCellUpdated(rowIndex, columnIndex);
        fireTableStructureChanged();
        
        if (DEBUG) {
            System.out.println("New value of data:");
            printDebugData();
        }
    }
    
    private void printDebugData() {
        int numRows = getRowCount();
        int numCols = getColumnCount();
        
        for (int i=0; i < numRows; i++) {
            System.out.print("    row " + i + ":");
            for (int j=0; j < numCols; j++) {
                String[] row = ResultSets.get(i);
                System.out.print(" " + row[j]);
            }
            System.out.println();
        }
        System.out.println("--------------------------");
    }

    public void tableChanged(TableModelEvent e) {
        System.out.println(e);
    }
    
    private DBLibClass dblc;
    
}

Hoffe, daß es nun klarer geworden ist, wo mein Problem liegt!
 
Zuletzt bearbeitet:
Hallo,

auf meinem java - Entdeckungstrip bin ich nun ein Stück des Weges gegangen, habe in etlichen anderen Foren weitere Anregungen gesucht - allein, es will nicht gelingen! Hier mein derzeitiger Stand:

Die Methode setValueAt im GerichtTableModel sieht nun so aus ( wie man sieht, habe ich da auch schon Weiteres ausprobiert, um den Event zum Aktualisieren auszulösen... Auskommentiertes )

Java:
    public void setValueAt(Object value, int rowIndex, int columnIndex) {
        if (DEBUG) {
            System.out.println("Setting value at " + rowIndex + "," + columnIndex
                    + " to " + value
                    + " (an instance of "
                    + value.getClass() + ")");
        }
        
        String[] row = ResultSets.get(rowIndex);
        row[columnIndex] = (String) value;
        //String gericht_id = row[0];
        
        try {
            dblc = new DBLibClass();
        } catch (Exception e) {
            System.out.println("Exception Aufruf DBLibClass");
        }
        
        dblc.updateGerichtSetRow(row);
        fireTableCellUpdated(rowIndex, columnIndex);
        //fireTableStructureChanged();
        
        //e = new javax.swing.event.TableModelEvent(this);
        
        //this.fireTableChanged(e);
        
        //cards = new JPanel(new CardLayout());
        //CardLayout cl = (CardLayout)(cards.getLayout());
        //cl.show(cards, "TEXTPANEL");
        //ResultSet rs = dblc.getResultFromGericht();
        //setModel(new GerichtTableModel(rs));
        //JTable t = new JTable(this);
        //t.setModel(new GerichtTableModel(rs));
        //jScrollPane1 = new javax.swing.JScrollPane();
        //jScrollPane1.setViewportView(t);
        //this.fireTableChanged(this.e);
        //tml.tableChanged(e);
        
        if (DEBUG) {
            System.out.println("New value of data:");
            printDebugData();
        }
    }

Vielleicht liegt es aber auch daran, daß es nicht funktioniert, daß ich ein CardLayout gewählt habe?

Hier der Aufrufcode im Hauptprogramm doku.java:

Java:
    /** Creates a new instance of doku */
    public doku() throws Exception {
        
        mdbc = new MyDBConnection();
        mdbc.init();
        Connection conn = (Connection) mdbc.getMyConnection();
        stmt = conn.createStatement();
        
        JFrame frame = new JFrame("doku");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        JMenuBar menuBar;
        JMenu menu, submenu;
        JMenuItem MI_bewohner;
        JMenuItem MI_gesetzlichebetreuer;
        
        // Create the menu bar
        menuBar = new JMenuBar();
        
        // Build the first menu.
        menu = new JMenu("Allgem. Daten");
        menu.setMnemonic(KeyEvent.VK_A);
        menuBar.add(menu);
        
        frame.setJMenuBar(menuBar);
        
        pane = frame.getContentPane();
        
        JPanel card1 = new JPanel();
        card1.add(new JButton("Button 1"));
        card1.add(new JButton("Button 2"));
        card1.add(new JButton("Button 3"));
        
        JPanel card2 = new JPanel();
        //nameField = new JTextField(30);
        //card2.add(nameField);
        
        //label = new JLabel();
        //card2.add(label);
        //card2.add(new JTextField("nameField", 20));
        
        jScrollPane1 = new javax.swing.JScrollPane();
        
        card2.add(jScrollPane1);
        
        JButton tableupdatebutton = new JButton();
        card2.add(tableupdatebutton);
        tableupdatebutton.setText("Tabelle aktualisieren");
        tableupdatebutton.setSize(100,50);
        tableupdatebutton.setLocation(50,50);
        tableupdatebutton.setVisible(true);
        tableupdatebutton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                tableupdatebuttonaction(evt);
            }
        });
        
        MI_bewohner = new JMenuItem("Bewohner", KeyEvent.VK_B);
        menu.add(MI_bewohner);
        
        MI_bewohner.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                MI_bewohnerActionPerformed(evt);
            }
        });
        
        MI_gesetzlichebetreuer = new JMenuItem("Gesetzl. Betreuer", KeyEvent.VK_G);
        menu.add(MI_gesetzlichebetreuer);
        
        MI_gesetzlichebetreuer.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                MI_gesetzlichebetreuerActionPerformed(evt);
            }
        });
        
        gerichtTable = new javax.swing.JTable();
        
        try {
            dblc = new DBLibClass();
        } catch (Exception e) {
            System.out.println("Exception Aufruf DBLibClass");
        }
        
        ResultSet rs = dblc.getResultFromGericht();
        gerichtTable.setModel(new GerichtTableModel(rs));
        gtm = (GerichtTableModel) gerichtTable.getModel();
        gtm.addTableModelListener(new javax.swing.event.TableModelListener() {
            public void tableChanged(javax.swing.event.TableModelEvent e) {
                if (e.getType() == TableModelEvent.ALL_COLUMNS) {
                    tableupdateeventaction(e);        //your code here
                }
            }
        });
        
        
        //gerichtTable.tableChanged(TableModelEvent);
        
        //Create the panel that contains the "cards".
        cards = new JPanel(new CardLayout());
        cards.add(card1, "BUTTONPANEL");
        cards.add(card2, "TEXTPANEL");
        
        //pane.add(comboBoxPane, BorderLayout.PAGE_START);
        pane.add(cards, BorderLayout.CENTER);
        
        //Display the window.
        frame.setSize(1000,700);
        //frame.pack();
        frame.setVisible(true);
    }

Um das Ganze ein wenig mehr zu veranschaulichen, was ich möchte, habe ich einen 'tableupdatebutton' eingebaut und einen Listener draufgesetzt. Damit funktioniert es dann auch: Sowie ich den Button drücke, wird die Tabelle aktualisiert angezeigt.

Hier die Funktion: tableupdatebuttonaction, die aufgerufen wird:

Java:
    private void tableupdatebuttonaction(java.awt.event.ActionEvent evt) {
        
        CardLayout cl = (CardLayout)(cards.getLayout());
        cl.show(cards, "TEXTPANEL");
        
        try {
            dblc = new DBLibClass();
        } catch (Exception e) {
            System.out.println("Exception Aufruf DBLibClass");
        }
        
        ResultSet rs = dblc.getResultFromGericht();
        gerichtTable.setModel(new GerichtTableModel(rs));
        mdbc.close(rs);
        jScrollPane1.setViewportView(gerichtTable);
    }

Nur, ich möchte eben, daß die Neuausgabe ausgelöst wird, sowie ich einen Wert in der Tabelle ändere! (Wie gesagt, der geänderte Wert wird ja in der Tabelle neu angezeigt und auch das Eintragen in die DB funktioniert) Nur das aufrufen des Listeners zur kompletten Neuausgabe nach dieser Änderung läßt sich nicht auslösen...

Dazu habe ich auf das 'GerichtTableModel' einen TableModelListener gesetzt, der meiner Meinung nach eigentlich ausgelöst werden sollte, wenn in der Methode setValueAt in der Datei GerichtTableModel.java der Befehl zum aktualisieren aufgerufen wird: fireTableCellUpdated(rowIndex, columnIndex);

oder:

fireTableStructureChanged();

In anderen Foren wird es jedenfalls so beschrieben, aber, es funktioniert nicht!

Liegt das an meiner Wahl des CardLayouts vielleicht?

Bin nach weiteren 3 Tagen des Testens ehrlich gesagt nun ziemlich ratlos

:-(

jue


Neueste Idee:

Das Ganze hat was mit dem Object TableCellEditor zu tun, weil, ich möchte ja eine Aktion, wenn ich die Zelle verlasse, also eine sozusagen Lostfocus Aktion in anderen Programmiersprachen, ich stocher im Nebel, wie man sieht! ;-)
 
Zuletzt bearbeitet:
OK, da sich ja offensichtlich niemand für dieses Thema interessiert, möchte ich mir nun selbst die Antwort geben:

So sieht nun die Methode setValueAt aus:

Java:
public void setValueAt(Object value, int rowIndex, int columnIndex) {
        if (DEBUG) {
            System.out.println("Setting value at " + rowIndex + "," + columnIndex
                    + " to " + value
                    + " (an instance of "
                    + value.getClass() + ")");
        }
        
        String[] row = ResultSets.get(rowIndex);
        row[columnIndex] = (String) value;
        
        try {
            dblc = new DBLibClass();
        } catch (Exception e) {
            System.out.println("Exception Aufruf DBLibClass");
        }
        
        dblc.updateGerichtSetRow(row);
        fireTableChanged(new TableModelEvent(this));
        
        if (DEBUG) {
            System.out.println("New value of data:");
            printDebugData();
        }
    }

Der Listener wird ausgelöst durch:

fireTableChanged(new TableModelEvent(this));

So sieht jetzt der Listener aus im Hauptprogramm (wurde in eine Unterfunktion initComponents verschoben, damit der Listener erneut registriert werden kann, nachdem er einmal ausgelöst wurde, sonst klappt das Ganze nämlich nur 1 X:

Java:
public class doku extends javax.swing.JLayeredPane{
    
    /** Creates a new instance of doku */
    public doku() throws Exception {
        
        mdbc = new MyDBConnection();
        mdbc.init();
        Connection conn = (Connection) mdbc.getMyConnection();
        stmt = conn.createStatement();
        
        JFrame frame = new JFrame("doku");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        JMenuBar menuBar;
        JMenu menu, submenu;
        JMenuItem MI_bewohner;
        JMenuItem MI_gesetzlichebetreuer;
        
        // Create the menu bar
        menuBar = new JMenuBar();
        
        // Build the first menu.
        menu = new JMenu("Allgem. Daten");
        menu.setMnemonic(KeyEvent.VK_A);
        menuBar.add(menu);
        
        frame.setJMenuBar(menuBar);
        
        pane = frame.getContentPane();
        
        JPanel card2 = new JPanel();
        card2.add(new JButton("Button 1"));
        card2.add(new JButton("Button 2"));
        card2.add(new JButton("Button 3"));
        
        JPanel card1 = new JPanel();
        //nameField = new JTextField(30);
        //card2.add(nameField);
        
        //label = new JLabel();
        //card2.add(label);
        //card2.add(new JTextField("nameField", 20));
        
        jScrollPane1 = new javax.swing.JScrollPane();
        
        card1.add(jScrollPane1);
        
        JButton tableupdatebutton = new JButton();
        card1.add(tableupdatebutton);
        tableupdatebutton.setText("Tabelle aktualisieren");
        tableupdatebutton.setSize(100,50);
        tableupdatebutton.setLocation(50,50);
        tableupdatebutton.setVisible(true);
        tableupdatebutton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                tableupdatebuttonaction(evt);
            }
        });
        
        MI_bewohner = new JMenuItem("Bewohner", KeyEvent.VK_B);
        menu.add(MI_bewohner);
        
        MI_bewohner.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                MI_bewohnerActionPerformed(evt);
            }
        });
        
        MI_gesetzlichebetreuer = new JMenuItem("Gesetzl. Betreuer", KeyEvent.VK_G);
        menu.add(MI_gesetzlichebetreuer);
        
        MI_gesetzlichebetreuer.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                MI_gesetzlichebetreuerActionPerformed(evt);
            }
        });
        
        gerichtTable = new javax.swing.JTable();
        
        initComponents();
        
        jScrollPane1.setViewportView(gerichtTable);
        
        //Create the panel that contains the "cards".
        cards = new JPanel(new CardLayout());
        cards.add(card1, "TABLEPANEL");
        cards.add(card2, "BUTTONPANEL");
        
        //pane.add(comboBoxPane, BorderLayout.PAGE_START);
        pane.add(cards, BorderLayout.CENTER);
        
        //Display the window.
        frame.setSize(1000,700);
        //frame.pack();
        frame.setVisible(true);
    }
    
    private void initComponents() {
        
        try {
            dblc = new DBLibClass();
        } catch (Exception e) {
            System.out.println("Exception Aufruf DBLibClass");
        }
        
        ResultSet rs = dblc.getResultFromGericht();
        gerichtTable.setModel(new GerichtTableModel(rs));
        gtm = (GerichtTableModel) gerichtTable.getModel();
        gtm.addTableModelListener(new javax.swing.event.TableModelListener() {
            public void tableChanged(javax.swing.event.TableModelEvent e) {
                     tableupdateeventaction();
             }
        });
    }

...und in die ausführende Funktion tableupdateeventaction() wurde unten nochmal der Aufruf initComponents unten angefügt, damit der Listener neu registriert wird:

Java:
   private void tableupdateeventaction() {
        
        CardLayout cl = (CardLayout)(cards.getLayout());
        cl.show(cards, "TABLEPANEL");
        
        try {
            dblc = new DBLibClass();
        } catch (Exception e) {
            System.out.println("Exception Aufruf DBLibClass");
        }
        
        ResultSet rs = dblc.getResultFromGericht();
        gerichtTable.setModel(new GerichtTableModel(rs));
        mdbc.close(rs);
        jScrollPane1.setViewportView(gerichtTable);
        initComponents();
    }

Ich weiß zwar nicht, ob das so die RICHTIGE Lösung ist, jedenfalls funktioniert es jetzt, wie ich es wollte.

Schreibt mir mal, wenn Ihr damit was anfangen konntet! Beziehungsweise auch dann, wenn Ihr Verbesserungsvorschläge habt, oder ich offensichtlich etwas mit etwas zu viel Overhead geschrieben habe!

jue
 
Zuletzt bearbeitet:
Zurück