Ändern / Aktualisieren von JTable-Inhalten mit JComboBox (Kategorie)

Ich habe ein Problem mit meiner JTable. My JTable zeigt den Inhalt einer Datenbank an. Eine Datenbanktabelle hat den Namenstyp. Jede Kategorie wird in der JComboBox angezeigt. Wenn ich auf eine Kategorie klicke, sollte der Tabelleninhalt aktualisiert werden.

Hier ist ein kurzer Auszug meines Codes für Sie, damit es einfacher ist, mir zu helfen. Der Code sollte lauffähig sein:

(Testklasse - Haupt)

package test;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.LinkedList;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;

public class TestClass implements ActionListener{

    String[] header = {"head", "head", "head"};
    Object[][] data = {{Boolean.FALSE, "text", "text"}, {Boolean.FALSE, "text", "text"}, {Boolean.FALSE, "text", "text"}};

    LinkedList<String> newdata = new LinkedList<String>();

    String[] combolist = {"apple", "banana", "cranberry"};

    JComboBox<String> combobox = new JComboBox<String>(combolist);
    JTable table = new JTable(new TestTableModel(data, header));
    JFrame frame = new JFrame();
    JPanel panel = new JPanel(new GridLayout(1, 0, 1, 0));

    public TestClass() {
        combobox.addActionListener(this);
        panel.add(combobox);

        frame.add(panel, BorderLayout.NORTH);
        frame.add(new JScrollPane(table), BorderLayout.CENTER);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
        frame.pack();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == this.combobox) {
            JComboBox<String> combobox = this.combobox;

            newdata.add("Test1");
            newdata.add("Test2");

            TestTableModel model = (TestTableModel) table.getModel();

            int i = 0;
            for (String text : newdata) {
                data[i][0] = Boolean.TRUE;
                data[i][1] = text;
                data[i][2] = text;
                i++;
            }

            model.setData(data);
        }
    }

    public static void main(String[] args) {
        new TestClass();
    }
}

(TestTableModel - AbstractTableModel falls erforderlich (Sie benötigen es, um den Code auszuführen!))

package test;

import javax.swing.table.AbstractTableModel;

public class TestTableModel extends AbstractTableModel {
    private static final long serialVersionUID = 5044877015250409328L;

    private String[] header;
    private Object[][] data;

    public TestTableModel(Object[][] data, String[] header) {
        this.header = header;
        this.data = data;
    }

    public void setData(Object[][] data) {
        this.data = data;
        fireTableDataChanged();
    }

    @Override
    public Class<?> getColumnClass(int column) {
        if (column == 0) {
            return Boolean.class;
        }
        return super.getColumnClass(column);
    }

    @Override
    public int getColumnCount() {
        return header.length;
    }

    @Override
    public String getColumnName(int column) {
        return header[column];
    }

    @Override
    public int getRowCount() {
        return data.length;
    }

    @Override
    public Object getValueAt(int row, int column) {
        return data[row][column];
    }

    @Override
    public boolean isCellEditable(int row, int column) {
        return column == 0;
    }

    @Override
    public void setValueAt(Object value, int row, int column) {
        data[row][column] = value;
    }

}

Mit diesem Funktionscode friert die Tabelle ein, wenn Sie die Kategorie ändern. Mein gesamter Code friert ebenfalls ein, aber ich kann die aktualisierte Tabelle im Hintergrund sehen, wenn ich die Größe des Fensters ändere (Größe der Tabelle auf die gleiche Größe wie der Rahmen ändern). Ich weiß nicht, warum es nicht bei den Ausgeschnittenen ist.

EDIT: Das Problem beim Ändern des Inhalts wurde behoben. Die Quelle wurde aktualisiert. Das Problem, die richtige Tischgröße zu finden, ist jedoch noch nicht gelöst. In der Quelle verwende ich zuerst ein 3-Zeilen-Array und danach ein 2-Zeilen-Array. Ich möchte die alte Tabelle löschen und eine neue erstellen, damit die Zeilengröße stimmt.

Grundsätzlich möchte ich nur die Tabelle mit neuen Inhalten aktualisieren.

Danke für die Hilfe!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage