Default table model aktualisieren

CConraths

Aktives Mitglied
Hallo Forum

wie kann man nach Änderung in der "Liste" einen update des models herbeiführen.
ich rufe erstelleDefaultTableModel_Gas erneeut auf um das model neu zu füllen
was muss ich nun noch tun denn die "Liste" ist immer noch alt

Danke fürs anschauen und helfen

[CODE lang="java" title="fuellen"]private static void fuelle_panel_Liste_Gas(Daten_Strom_und_Gas[] daten, Verbrauchswerte verbrauchswerte) throws SQLException {
//neue ScrollPane
gbc_scrollPane_Liste_Gas = new GridBagConstraints();
gbc_scrollPane_Liste_Gas.gridwidth = 1;
gbc_scrollPane_Liste_Gas.gridheight = 1;
gbc_scrollPane_Liste_Gas.insets = new Insets(5, 5, 5, 5);
gbc_scrollPane_Liste_Gas.fill = GridBagConstraints.BOTH;
gbl_panel_Liste_Gas = new GridBagLayout();
gbl_panel_Liste_Gas.columnWidths = new int[]{20, 20, 20, 10};
gbl_panel_Liste_Gas.rowHeights = new int[]{10, 0};
gbl_panel_Liste_Gas.columnWeights = new double[]{0.0, 0.0, 0.0, Double.MIN_VALUE};
gbl_panel_Liste_Gas.rowWeights = new double[]{0.0, Double.MIN_VALUE};
model_Gas = erstelle_DefaultTableModel_Gas(daten);
table_Gas = new JTable(model_Gas);
table_Gas.setAutoCreateRowSorter(true);
table_Gas.setPreferredScrollableViewportSize(new Dimension(408, 160));
scrollPaneLayout_Liste_Gas = new ScrollPaneLayout();
scrollPane_Liste_Gas = new JScrollPane(table_Gas);
scrollPane_Liste_Gas.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scrollPane_Liste_Gas.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane_Liste_Gas.setLayout(scrollPaneLayout_Liste_Gas);
panel_Liste_Gas.add(scrollPane_Liste_Gas, gbc_scrollPane_Liste_Gas);
}[/CODE]
 
Tip: Du solltest die Variable model_Gas in dieser Methode lokal anlegen und nicht als Klassenvariable, das erspart dir etwas Verwirrung aus dem Grund, den mihe genannt hat. Du weist dem Table nämlich nicht diese Variable zu, sondern deren Inhalt. Du kommst jederzeit an das vom Table verwendete Model mit table_Gas.getModel() ran.

Du könntest sogar komplett darauf verzichten.
Java:
table_Gas = new JTable(erstelle_DefaultTableModel_Gas(daten));
 
Tip: Du solltest die Variable model_Gas in dieser Methode lokal anlegen und nicht als Klassenvariable, das erspart dir etwas Verwirrung aus dem Grund, den mihe genannt hat. Du weist dem Table nämlich nicht diese Variable zu, sondern deren Inhalt. Du kommst jederzeit an das vom Table verwendete Model mit table_Gas.getModel() ran.

Du könntest sogar komplett darauf verzichten.
Java:
table_Gas = new JTable(erstelle_DefaultTableModel_Gas(daten));
Hallo Neumi5694 und Mihe7
danke für die Antworten.
ich kapiere es noch nicht 🙁
ich poste noch mal meine betreffende Source
den Ablauf schildere ich dazu noch mal in meinem Verständnis.
1) Ich habe ein übergeordnetes JPanel welches in eine tabbedpane kommt
Java:
private static void erstelle_Panel_Strom() {
            panel_Strom = new JPanel();
            gbl_panel_Strom = new GridBagLayout();
            gbl_panel_Strom.columnWidths = new int[]{20, 10, 10, 0};
            gbl_panel_Strom.rowHeights = new int[]{10, 0};
            gbl_panel_Strom.columnWeights = new double[]{0.0, 0.0, 0.0, Double.MIN_VALUE};
            gbl_panel_Strom.rowWeights = new double[]{0.0, Double.MIN_VALUE};
            panel_Strom.setLayout(gbl_panel_Strom);
            tabbed_Pane.addTab("Strom", null, panel_Strom, null);
        }
2) Dieses Panel nimmt neben anderen Komponenten auch ein wweiteres JPanel auf
Code:
private static void erstelle_Panel_Liste_Verbrauch_Vorjahr_Strom() {
            panel_Liste_Verbrauch_Vorjahr_Strom = new JPanel();
            panel_Liste_Verbrauch_Vorjahr_Strom.setBorder(new TitledBorder(new EtchedBorder(EtchedBorder.LOWERED, new Color(255, 255, 255),
                      new Color(160, 160, 160)), "Verbrauch Strom", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)));
            gbc_panel_Liste_Verbrauch_Vorjahr_Strom = new GridBagConstraints();
            gbc_panel_Liste_Verbrauch_Vorjahr_Strom.insets = new Insets (5, 5, 5, 5);
            gbc_panel_Liste_Verbrauch_Vorjahr_Strom.fill = GridBagConstraints.HORIZONTAL;
            gbc_panel_Liste_Verbrauch_Vorjahr_Strom.gridx = 1;
            gbc_panel_Liste_Verbrauch_Vorjahr_Strom.gridy = 0;
            gbl_panel_Liste_Verbrauch_Vorjahr_Strom = new GridBagLayout();
            gbl_panel_Liste_Verbrauch_Vorjahr_Strom.columnWidths = new int[]{50, 30, 30, 30, 30};
            gbl_panel_Liste_Verbrauch_Vorjahr_Strom.rowHeights = new int[]{10, 0};
            gbl_panel_Liste_Verbrauch_Vorjahr_Strom.columnWeights = new double[]{0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
            gbl_panel_Liste_Verbrauch_Vorjahr_Strom.rowWeights = new double[]{0.0, Double.MIN_VALUE};
            panel_Liste_Verbrauch_Vorjahr_Strom.setLayout(gbl_panel_Liste_Verbrauch_Vorjahr_Strom);
            panel_Strom.add(panel_Liste_Verbrauch_Vorjahr_Strom, gbc_panel_Liste_Verbrauch_Vorjahr_Strom);
        }
3 a) Dieses Panel nimmt ein JLabel ein JTextField und einem JButton auf
Code:
      private static void erstelle_Eingabe_Jahreszahl_Vorjahreswerte_Gas(TEST_Verbrauchswerte verbrauchswerte) {
            lbl_Jahreszahl_Gas = new JLabel("Auswahl Jahr :");  
            GridBagConstraints  gbc_lbl_Jahreszahl_Gas = new GridBagConstraints();
            gbc_lbl_Jahreszahl_Gas.gridx = 0;
            gbc_lbl_Jahreszahl_Gas.gridy = 0;
            gbc_lbl_Jahreszahl_Gas.fill = GridBagConstraints.HORIZONTAL;
            gbc_lbl_Jahreszahl_Gas.insets = new Insets (5, 5, 5, 5);
            gbc_lbl_Jahreszahl_Gas.weightx = 1;
            gbc_lbl_Jahreszahl_Gas.weighty = 1;
            gbc_lbl_Jahreszahl_Gas.gridwidth = 1;
            gbc_lbl_Jahreszahl_Gas.gridheight = 1;
            panel_Liste_Verbrauch_Vorjahr_Strom.add(lbl_Jahreszahl_Gas,gbc_lbl_Jahreszahl_Gas);
            text_Jahreszahl_Vorjahr_Strom = new JTextField(4);
            text_Jahreszahl_Vorjahr_Strom.setText("2021");
            text_Jahreszahl_Vorjahr_Strom.addActionListener(verbrauchswerte);
            GridBagConstraints gbc_text_Jahreszahl_Gas = new GridBagConstraints();
            gbc_text_Jahreszahl_Gas.gridx = 1;
            gbc_text_Jahreszahl_Gas.gridy = 0;
            gbc_text_Jahreszahl_Gas.weightx = 1;
            gbc_text_Jahreszahl_Gas.weighty = 1;
            gbc_text_Jahreszahl_Gas.gridwidth = 1;
            gbc_text_Jahreszahl_Gas.gridheight = 1;
            gbc_text_Jahreszahl_Gas.fill = GridBagConstraints.HORIZONTAL;
            gbc_text_Jahreszahl_Gas.insets = new Insets (5, 5, 5, 5);
            panel_Liste_Verbrauch_Vorjahr_Strom.add(text_Jahreszahl_Vorjahr_Strom,gbc_text_Jahreszahl_Gas);
        }
        private static void erstelle_Button_Speichern_Vorjahreswerte_Gas(TEST_Verbrauchswerte verbrauchswerte) {
            btn_Laden_Vorjahreswerte_Gas = new JButton("Jahr übernehmen ");
            btn_Laden_Vorjahreswerte_Gas.addActionListener(verbrauchswerte);
            gbc_btn_Speichern_Vorjahreswerte_Gas = new GridBagConstraints();
            gbc_btn_Speichern_Vorjahreswerte_Gas.gridx = 0;
            gbc_btn_Speichern_Vorjahreswerte_Gas.gridy = 1;
            gbc_btn_Speichern_Vorjahreswerte_Gas.weightx = 2;
            gbc_btn_Speichern_Vorjahreswerte_Gas.weighty = 1;
            gbc_btn_Speichern_Vorjahreswerte_Gas.insets = new Insets (5, 5, 5, 5);
            gbc_btn_Speichern_Vorjahreswerte_Gas.fill = GridBagConstraints.HORIZONTAL;
            panel_Liste_Verbrauch_Vorjahr_Strom.add(btn_Laden_Vorjahreswerte_Gas,gbc_btn_Speichern_Vorjahreswerte_Gas);
        }
3 b) Des weiteren nimmt diese Panel auch eine ScrollPane auf
Diese ScrollPane nimmt einen JTable auf welchem ein DefaultTableModel zugewiesen wird
Code:
        private static void fuelle_panel_Liste_Verbrauch_Vorjahr_Strom(Daten_Strom_und_Gas[] liste_Verbrauch_Vorjahr_Strom, boolean erstaufruf)        throws SQLException {
            if (erstaufruf) {
                gbc_scrollPane_Liste_Verbrauch_Vorjahr_Strom = new GridBagConstraints();
                gbc_scrollPane_Liste_Verbrauch_Vorjahr_Strom.gridwidth = 0;
                gbc_scrollPane_Liste_Verbrauch_Vorjahr_Strom.gridheight = 0;
                gbc_scrollPane_Liste_Verbrauch_Vorjahr_Strom.insets = new Insets(5, 5, 5, 5);
                gbc_scrollPane_Liste_Verbrauch_Vorjahr_Strom.fill = GridBagConstraints.BOTH;
                erstelle_TableModel_Liste_Verbrauch_Vorjahr_Strom();  
                table_Liste_Verbrauch_Vorjahr_Strom = new JTable(tableModel_Liste_Verbrauch_Vorjahr_Strom);
                table_Liste_Verbrauch_Vorjahr_Strom.setAutoCreateRowSorter(true);
                table_Liste_Verbrauch_Vorjahr_Strom.setPreferredScrollableViewportSize(new Dimension(408, 160));
                //neue ScrollPaneLayout
                scrollPaneLayout_Liste_Verbrauch_Vorjahr_Strom = new ScrollPaneLayout();  
                //neue ScrollPane
                scrollPane_Liste_Verbrauch_Vorjahr_Strom = new JScrollPane(table_Liste_Verbrauch_Vorjahr_Strom);
                scrollPane_Liste_Verbrauch_Vorjahr_Strom.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
                scrollPane_Liste_Verbrauch_Vorjahr_Strom.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
                scrollPane_Liste_Verbrauch_Vorjahr_Strom.setLayout(scrollPaneLayout_Liste_Verbrauch_Vorjahr_Strom);
                panel_Liste_Verbrauch_Vorjahr_Strom.add(scrollPane_Liste_Verbrauch_Vorjahr_Strom, gbc_scrollPane_Liste_Verbrauch_Vorjahr_Strom);
       
            }
            else {
                erstelle_TableModel_Liste_Verbrauch_Vorjahr_Strom();  
                table_Liste_Verbrauch_Vorjahr_Strom = new JTable(tableModel_Liste_Verbrauch_Vorjahr_Strom);
                table_Liste_Verbrauch_Vorjahr_Strom.setAutoCreateRowSorter(true);
                table_Liste_Verbrauch_Vorjahr_Strom.setPreferredScrollableViewportSize(new Dimension(408, 160));
                table_Liste_Verbrauch_Vorjahr_Strom.setModel(tableModel_Liste_Verbrauch_Vorjahr_Strom);
            }
        }

Java:
        private static void erstelle_TableModel_Liste_Verbrauch_Vorjahr_Strom() throws SQLException {
            tableModel_Liste_Verbrauch_Vorjahr_Strom = new DefaultTableModel() {
                private static final long serialVersionUID = 1L;
                public boolean isCellEditable(int row, int column) {
                   //all cells false
                   return false;
                }
            };    
            // Die Überschriften der Spalten setzen
            int columns = resultSet_Liste_Vorjahr_Strom.getMetaData().getColumnCount();
            String[] titles = new String[columns];
            int i = 0;
            for (i = 0; i <= columns -1; i++) {
                 titles[i] = resultSet_Liste_Vorjahr_Strom.getMetaData().getColumnLabel(i+1);
            }
            //in DefaultTableModel bringen
            tableModel_Liste_Verbrauch_Vorjahr_Strom.setColumnIdentifiers( titles);    
            for( int r = 0 ; r < rowCount_Liste_Vorjahr_Strom ; r++ ){
                Object[] row = new Object[ tableModel_Liste_Verbrauch_Vorjahr_Strom.getColumnCount() ];        
                for( int c = 0; c < row.length; c++ ){
                    switch(c){
                    case 0:
                         row[c] = daten_Liste_Vorjahr_Strom[r].getWochentag();
                        break;
                    case 1:
                        row[c] = daten_Liste_Vorjahr_Strom[r].getZaehlerstand();
                        break;
                    case 2:
                        row[c] = daten_Liste_Vorjahr_Strom[r].getDatum();
                        break;
                    case 3:
                        row[c] = daten_Liste_Vorjahr_Strom[r].getDifferenz();
                        break;
                    case 4:
                        row[c] = daten_Liste_Vorjahr_Strom[r].getKosten_Tag();
                        break;
                    default:
                        break;
                    }
                }        
                tableModel_Liste_Verbrauch_Vorjahr_Strom.addRow( row );
            }
        }

4) Nach Auswahl eines Berichtsjahres und bestätigen mit Buttonclick werden die neuen Daten in das Array daten_Liste_Vorjahr_Strom eingestellt.
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == btn_Speichern_Strom){
try {
try {
speichern_Daten_Strom();
} catch (ParseException e1) {
e1.printStackTrace();
}
} catch (SQLException e1) {
e1.printStackTrace();
}
}
if(e.getSource() == btn_Laden_Vorjahreswerte_Gas){
try {
lesen_Daten_Vorjahr_Strom("strom");
fuelle_panel_Liste_Verbrauch_Vorjahr_Strom(daten_Liste_Vorjahr_Strom, false);
} catch (SQLException e1) {
e1.printStackTrace();
}

}
}
5) Dann wird das DefaultTableModel neu gefüllt und dem Table zugewiesen
Java:
else {
                erstelle_TableModel_Liste_Verbrauch_Vorjahr_Strom();       
                table_Liste_Verbrauch_Vorjahr_Strom = new JTable(tableModel_Liste_Verbrauch_Vorjahr_Strom);
                table_Liste_Verbrauch_Vorjahr_Strom.setAutoCreateRowSorter(true);
                table_Liste_Verbrauch_Vorjahr_Strom.setPreferredScrollableViewportSize(new Dimension(408, 160));
              [B]  table_Liste_Verbrauch_Vorjahr_Strom.setModel(tableModel_Liste_Verbrauch_Vorjahr_Strom);[/B]
            }

trotzdem bleibt der Inhalt des Table unverändert.

Was mache ich falsch oder was habe ich noch vergessen ???

danke fürs helfen
Christian
 
Zuletzt bearbeitet:
model = neues Model();
table = new Table(model);
model = new Model(); //ab jetzt haben "model" und "table" nicht mehr die gleichen Daten. Eine Änderung am Model ändert den Table nicht.
model.modifySomething();//wird den Table nicht mehr beeinflussen.
//Deshalb sag ich: Verwende beim Erstellen eine lokale Variable, damit du später nicht auf die Idee kommst, die model-Variable zu verändern.

table.getModel().modifySomething();//so ist besser

Und nicht vergessen, nach Änderungen am Model einen fireTableChange oder wie das immer auch heißt, auszulösen, sonst tut sich am Bildschirm nichts.
 
Dann wird das DefaultTableModel neu gefüllt und dem Table zugewiesen
Nein, Du weist ein neues Model einer neuen Tabelle zu. Angezeigt wird natürlich die alte Tabelle.

Du hast, glaube ich, ein Verständnisproblem dahingehend, dass Variablen Referenzen auf Objekte speichern und Methodenaufrufe in Java call-by-value sind.

Kurz zur Erklärung:

1. Schritt:
Java:
table_Liste_Verbrauch_Vorjahr_Strom = new JTable(tableModel_Liste_Verbrauch_Vorjahr_Strom);
Mit new JTable(...) erstellst Du ein neues JTable-Objekt. Die Adresse dieses Objekts im Speicher (=Referenz) wird in der Variablen table_Liste_Verbrauch_Vorjahr_Strom gespeichert.

2. Schritt:
Wenn Du nun z. B. einPanel.add(table_Liste_Verbrauch_Vorjahr_Strom) aufrufst, wird der Wert der Variablen table_Liste_Verbrauch_Vorjahr_Strom an die add-Methode übergeben. Dabei handelt es sich um die Adresse des Objekts im Speicher.

3. Schritt:
Wenn Du jetzt nochmal
Java:
table_Liste_Verbrauch_Vorjahr_Strom = new JTable(tableModel_Liste_Verbrauch_Vorjahr_Strom);
aufrufst, passiert das gleiche wie im ersten Schritt. An dem Wert, der an einPanel.add im Schritt 2 übergeben wurde, ändert sich dadurch natürlich nichts. D. h. einPanel verweist immer noch auf das JTable-Objekt, das im 1. Schritt erstellt wurde. Folglich siehst Du keine Änderung.

TLDR; Wenn Du die Tabelle neu befüllen willst, darfst Du keine neue Tabelle erstellen.
 
Nein, Du weist ein neues Model einer neuen Tabelle zu. Angezeigt wird natürlich die alte Tabelle.

Du hast, glaube ich, ein Verständnisproblem dahingehend, dass Variablen Referenzen auf Objekte speichern und Methodenaufrufe in Java call-by-value sind.

Kurz zur Erklärung:

1. Schritt:
Java:
table_Liste_Verbrauch_Vorjahr_Strom = new JTable(tableModel_Liste_Verbrauch_Vorjahr_Strom);
Mit new JTable(...) erstellst Du ein neues JTable-Objekt. Die Adresse dieses Objekts im Speicher (=Referenz) wird in der Variablen table_Liste_Verbrauch_Vorjahr_Strom gespeichert.

2. Schritt:
Wenn Du nun z. B. einPanel.add(table_Liste_Verbrauch_Vorjahr_Strom) aufrufst, wird der Wert der Variablen table_Liste_Verbrauch_Vorjahr_Strom an die add-Methode übergeben. Dabei handelt es sich um die Adresse des Objekts im Speicher.

3. Schritt:
Wenn Du jetzt nochmal
Java:
table_Liste_Verbrauch_Vorjahr_Strom = new JTable(tableModel_Liste_Verbrauch_Vorjahr_Strom);
aufrufst, passiert das gleiche wie im ersten Schritt. An dem Wert, der an einPanel.add im Schritt 2 übergeben wurde, ändert sich dadurch natürlich nichts. D. h. einPanel verweist immer noch auf das JTable-Objekt, das im 1. Schritt erstellt wurde. Folglich siehst Du keine Änderung.

TLDR; Wenn Du die Tabelle neu befüllen willst, darfst Du keine neue Tabelle erstellen.
juhuu es funzt
statt neuen Table instanziieren nun
table_Liste_Verbrauch_Vorjahr_Strom.setModel(tableModel_Liste_Verbrauch_Vorjahr_Strom);
und es klappt
das mit den Speicheradressen und Referenzen darauf muss ich mir echt nochmal besser ansehen

vielen Dank an alle Helfer
 

Zurück
Oben