JTable zur Laufzeit aktualisieren

cHucKy51

Mitglied
In meinem TableModel für meine JTable werden Daten aus einer CSV-Datei gelesen. Je nach Datenmenge (Überschriften + items) wird die Tabelle aufgebaut.

Die Klasse MainFrame greift auf dieses Model zu.

Meine Frage lautet nun: Wie kann ich in meinem Konfigurationsmenü eine andere CSV-Datei laden und diese sofort im Frame darstellen. Das einlesen der Dateien und setzen als Standard funktioniert bereits, doch leider wird die neue Tabelle erst nach dem Neustart des Programms sichtbar.


Klasse MainFrame:
Java:
public class FrameMain
{
    private static final long serialVersionUID = 1L;

    public static class MeinWindowListener extends WindowAdapter
    {
        public void windowClosing(WindowEvent arg0)
        {
            System.exit(0);
        }
    }
    
    private static MenuBarMain menueLeiste = new MenuBarMain();

    public static JLabel labelUeberschrift = null;

    public static JTable tableZahlen = null;

    public static MyTableModel tableModel = new MyTableModel();

    public static JFrame mainFrame = new JFrame();
    
    private static JComponent contentPane = (JComponent) mainFrame.getContentPane();
    
    public static void newFrameMain()
    {
        mainFrame.setTitle("AMC TableTest");
        mainFrame.setSize(420, 385);
        mainFrame.setJMenuBar(menueLeiste.MenueLeiste());
        initLayout();
        mainFrame.setLocationRelativeTo(null); // Zentriert das Fenster
        mainFrame.addWindowListener(new MeinWindowListener());
        mainFrame.setVisible(true);
        mainFrame.setResizable(true);
    }

    public static void initLayout()
    {
        contentPane.setLayout(new BorderLayout());

        tableModel.readFile();

        tableModel.writeHashMap();

        tableModel.refresh();

        // Das Tabellenmodell wird der JTable beim Erzeugen hinzugefügt
        tableZahlen = new JTable(tableModel);

        // Der Renderer wird der JTable hinzugefügt
        tableZahlen.setDefaultRenderer(Object.class, new Renderer());

        tableZahlen.setAutoCreateRowSorter(true);

        // Der eigens erzeugte Keylistener wird der Tabelle hinzugefügt
        KeyListener kl = new KeyListener();
        kl.keyList(tableZahlen);

        // Jede Spalte ist bei der Erstellung gleich breit
        tableZahlen.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);

        // Die Tabelle wird in eine JScrollPane eingebettet
        JScrollPane scrollPane = new JScrollPane(tableZahlen);

        scrollPane.setPreferredSize(new Dimension(405, 300));

        // Die Tabelle wird in ein Panel gesetzt
        JPanel jpTable = new JPanel();

        jpTable.add("Center", scrollPane);

        contentPane.add("West", jpTable);

        // Das Label "Überschrift", das in der Konfiguration verändert werden soll, wird hier erzeugt
        labelUeberschrift = new JLabel("Überschrift");

        JPanel jpLabel = new JPanel();
        jpLabel.add(labelUeberschrift);
        contentPane.add("North", jpLabel);
    }
}
 
Moin!
Hab mir den Code jetzt net großartig angeguckt, aber
eigentlich sollte es reichen, wenn du die Methode fireTableDataChanged() deines Models aufrufst, sobald du die Daten eingelesen hast...

*grüssle*
MeinerEiner
 
Hallo,

@MeinerEiner
Bist du sicher, dass er dann auch die TableHeader ändert? Ich war mir da nicht so sicher, deshalb hab ich es noch nicht gepostet.

MFG

zEriX
 
Moin!
Guter Einwand. Hast recht, falls sich die Spalten auch ändern, muss zusätzlich fireTableStructureChanged() aufgerufen werden...
Was meines Wissens aber auch gleichbedeutet ist mit table.setModel(Model)...


*grüssle*
MeinerEiner
 
Danke für eure Hilfe. Letztendlich habe ich die Methode fireTableStructureChanged() eingebaut und durch eine selbstgebaute Methode resetData() alle Arrays und hashMaps zurückgesetzt. Jetzt funktioniert es!
 
Zurück