Swing JTable - Konflikt DefaultTableModel+DefaultTableColumnModel

Status
Nicht offen für weitere Antworten.

JanvW

Mitglied
Hallo,

Problem: Konflikt zwischen DefaultTableModel und DefaultTableColumnModel

Wenn die 5 Zeilen (siehe Zeile 79-83) auskommentiert bleiben, wird die Tabelle mit den formatierten Spaltenüberschriften angezeigt.
Wenn diese Zeilen auskommentiert werden, sollen zusätzlich zwei Zeilen mit Daten angezeigt werden.
Statt dessen wird die komplette Tabelle nicht mehr aufgebaut.

Nach Tagen des Suchens und Rumprobierens bin ich nun mit meinem Latein am Ende und bitte um Unterstürtzung vom Forum.
Bitte keine allgemeine Beschreibung, sondern einen konkreten Verbesserungsvorschlag im Code.

Vielen Dank im voraus

Jan


Nachfolgender Code kann komplett rauskopiert werden uns ist eigenständig lauffähig.


Java:
package Tabelle;

import java.awt.Color;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;

public class Tabelle extends javax.swing.JFrame {
    //TabellenModel
    DefaultTableModel grdKontenrahmenModel = new DefaultTableModel();
    DefaultTableColumnModel grdKontenrahmenSpaltenModel = new DefaultTableColumnModel();

    //TabellenRenderer
    DefaultTableCellRenderer TabellenRendererTitelLinks = new DefaultTableCellRenderer();
    DefaultTableCellRenderer TabellenRendererTitelMitte = new DefaultTableCellRenderer();
    DefaultTableCellRenderer TabellenRendererTitelRechts = new DefaultTableCellRenderer();

    //TabellenIndizes
    private static final int IndexSpalte1 = 0;
    private static final int IndexSpalte2 = 1;
    private static final int IndexSpalte3 = 2;

    /** Creates new form NewJFrame */
    public Tabelle()
    {
        initComponents();

        //Zuweisung Model
        tabelleTest.setModel(grdKontenrahmenModel);
        tabelleTest.setColumnModel(grdKontenrahmenSpaltenModel);

        //Renderer
        TabellenRendererTitelLinks.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
        TabellenRendererTitelLinks.setBackground(Color.WHITE);
        TabellenRendererTitelMitte.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        TabellenRendererTitelMitte.setBackground(Color.WHITE);
        TabellenRendererTitelRechts.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        TabellenRendererTitelRechts.setBackground(Color.WHITE);

        //Spaltenüberschriften
        TableColumn Spalte1 = new TableColumn();
        Spalte1.setHeaderValue("Spalte 1");
        Spalte1.setModelIndex(IndexSpalte1);
        grdKontenrahmenSpaltenModel.addColumn(Spalte1);
        TableColumn Spalte2 = new TableColumn();
        Spalte2.setHeaderValue("Spalte 2");
        Spalte2.setModelIndex(IndexSpalte2);
        Spalte2.setResizable(false);
        grdKontenrahmenSpaltenModel.addColumn(Spalte2);
        TableColumn Spalte3 = new TableColumn();
        Spalte3.setHeaderValue("Spalte 3");
        Spalte3.setModelIndex(IndexSpalte3);
        Spalte3.setCellRenderer(TabellenRendererTitelLinks);
        grdKontenrahmenSpaltenModel.addColumn(Spalte3);

        //Spaltenbreiten
        grdKontenrahmenSpaltenModel.getColumn(IndexSpalte1).setMinWidth(100);
        grdKontenrahmenSpaltenModel.getColumn(IndexSpalte1).setMaxWidth(200);
        grdKontenrahmenSpaltenModel.getColumn(IndexSpalte1).setPreferredWidth(100);
        grdKontenrahmenSpaltenModel.getColumn(IndexSpalte2).setMinWidth(100);
        grdKontenrahmenSpaltenModel.getColumn(IndexSpalte2).setMaxWidth(100);
        grdKontenrahmenSpaltenModel.getColumn(IndexSpalte2).setPreferredWidth(50);
        grdKontenrahmenSpaltenModel.getColumn(IndexSpalte3).setMinWidth(600);
        grdKontenrahmenSpaltenModel.getColumn(IndexSpalte3).setMaxWidth(600);
        grdKontenrahmenSpaltenModel.getColumn(IndexSpalte3).setPreferredWidth(600);

        //Spaltenformatierung
        grdKontenrahmenSpaltenModel.getColumn(IndexSpalte1).setHeaderRenderer(TabellenRendererTitelRechts);
        grdKontenrahmenSpaltenModel.getColumn(IndexSpalte1).setCellRenderer(TabellenRendererTitelRechts);
        grdKontenrahmenSpaltenModel.getColumn(IndexSpalte2).setHeaderRenderer(TabellenRendererTitelMitte);
        grdKontenrahmenSpaltenModel.getColumn(IndexSpalte2).setCellRenderer(TabellenRendererTitelMitte);
        grdKontenrahmenSpaltenModel.getColumn(IndexSpalte3).setHeaderRenderer(TabellenRendererTitelLinks);
        grdKontenrahmenSpaltenModel.getColumn(IndexSpalte3).setCellRenderer(TabellenRendererTitelLinks);


        //Hier beginnt das Problem !!!
        //Daten (wenn die nachfolgenden 5 Zeilen einkommentiert werden, wird die Tabelle NICHT aufgebaut)
        //grdKontenrahmenModel.setColumnCount(0);
        //String[] datensatz1 = {"a","b","c"};
        //grdKontenrahmenModel.addRow(datensatz1);
        //String[] datensatz2 = {"d","e","f"};
        //grdKontenrahmenModel.addRow(datensatz2);

    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        tabelleTest = new javax.swing.JTable();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        tabelleTest.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {

            }
        ));
        tabelleTest.getTableHeader().setResizingAllowed(false);
        tabelleTest.getTableHeader().setReorderingAllowed(false);
        jScrollPane1.setViewportView(tabelleTest);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 459, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(59, 59, 59)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 151, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(90, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Tabelle().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable tabelleTest;
    // End of variables declaration//GEN-END:variables
}
 
Zuletzt bearbeitet:
Java:
grdKontenrahmenModel.setColumnCount(0);

Damit sagst du dass die Tabelle 0 Spalten hat. Also was soll er da groß aufbauen, eine Tabelle mit 0 Spalten kann man nun mal nicht zeichnen.

Und mal ein genereller Tip: Lass das GUI designen mit Tools, da kommt immer so ein Müll raus wie man ihn in deinem Code sieht. Der Code verstösst gegen jede erdenkliche Coding-Convention und es macht einfach keinen Spaß das anzuschauen 😉 Lies in unserer FAQ die JTable Tutorials, und schreib das dann nochmal per Hand. Du wirst sehen dass der Code dann auch wesentlich kürzer und übersichtlicher wird.
 
Zuletzt bearbeitet:
Hallo hdi,

danke für die schnelle Antwort.

In Zeile 79 habe ich Row mit Column verwechselt und nun wie folgt geändert:
grdKontenrahmenModel.setRowCount(0);

Das Problem besteht aber weiterhin, denn das gesamte Frame wird nicht aufgebaut.

Jan
 
Das gesamte Frame wird nicht aufgebaut? Dann muss ja irgendwo eine Exception geflogen sein..

Aber warum willst du eig. die Rows auf 0 setzen? Das ist doch das gleiche wie mit Spalten: Eine Tabelle ohne Zeilen kann man nicht zeichnen. Was ist da dein Gedanke dahinter? Du willst 2 Zeilen adden, damit sind Zeilen = 2, und wieso wilslt du das dann auf 0 haben? Lass das doch komplett weg & mach nur 2x addRow, fertig.
 
Ok, habe die Zeile 79 komplett gelöscht.
Ich wollte damit nur die Inhalte löschen, wie ich es später im Programm noch benötigen werde.


Du hast Recht, folgende Exception wird geworfen, mit der ich allerdings nichts anfangen kann:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0
at java.util.Vector.elementAt(Vector.java:427)
at javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:633)
at javax.swing.JTable.getValueAt(JTable.java:2695)
at javax.swing.JTable.prepareRenderer(JTable.java:5712)
at javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:2075)
at javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:1977)
at javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1773)
at javax.swing.plaf.ComponentUI.update(ComponentUI.java:143)
at javax.swing.JComponent.paintComponent(JComponent.java:763)
at javax.swing.JComponent.paint(JComponent.java:1029)
at javax.swing.JComponent.paintChildren(JComponent.java:864)
at javax.swing.JComponent.paint(JComponent.java:1038)
at javax.swing.JViewport.paint(JViewport.java:747)
at javax.swing.JComponent.paintChildren(JComponent.java:864)
at javax.swing.JComponent.paint(JComponent.java:1038)
at javax.swing.JComponent.paintChildren(JComponent.java:864)
at javax.swing.JComponent.paint(JComponent.java:1038)
at javax.swing.JComponent.paintChildren(JComponent.java:864)
at javax.swing.JComponent.paint(JComponent.java:1038)
at javax.swing.JLayeredPane.paint(JLayeredPane.java:567)
at javax.swing.JComponent.paintChildren(JComponent.java:864)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5131)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1475)
at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1406)
at javax.swing.RepaintManager.paint(RepaintManager.java:1220)
at javax.swing.JComponent.paint(JComponent.java:1015)
at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:21)
at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:60)
at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97)
at java.awt.Container.paint(Container.java:1780)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:714)
at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:694)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:128)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
 
Ja also es gibt hier Unstimmigkeiten zwischen deinem Datenbestand und dem, was der Table gerade für den aktuellen Datenbestand hält. Irgendwo werden wohl einige Events nicht gefeuert oder was weiss ich was. Ich muss ganz ehrlich sagen dass ich grad weder Zeit noch Lust habe darüber nachzudenken, woher das jetzt genau kommt :bae:

Auf jeden Fall ist das einer der Effekte beim Erstellen von GUI's mit Tools, der Code ist der letzte Müll 😉 Das Problem hättest du sicherlich nicht wenn du das ganze korrekt aufziehst, und da lege ich dir jetzt nochmal die FAQ nahe:

http://www.java-forum.org/java-faq-beitraege/4841-jtable-ubersicht-teil-1-teil-8-a.html

oder du wartest auf die Antwort von jmd anderem, ich hab jetzt eben grad keine Zeit mehr. Aber ich würd dir nicht raten bei diesem Code zu bleiben, mach das neu...
 
Das Problem liegt daran, dass Dein TableModel null Spalten hat. Auch wenn Du Zeilen hinzufügst, die drei Elemente haben, das TableModel selbst sagt Dir: "keine Spalten". Dein ColumnModel sieht das aber ganz anders, und deshalb gibt's ein Problem.

Initialisier mal das Modell so:
[java=12] DefaultTableModel grdKontenrahmenModel = new DefaultTableModel(0, 3);[/code]
... oder sag später, wie die Anzahl der Spalten im Modell ist:
[java=80] grdKontenrahmenModel.setColumnCount(3);[/code]
... und schon geht's.

Ansonsten hat hdi nicht unrecht. Außerdem: Packages schreibt man immer klein; also "tabelle" statt "Tabelle".

PS: hdi, was macht der SCJP?

Ebenius
 
Zuletzt bearbeitet:
PS: hdi, was macht der SCJP?

Wird dieses Jahr nichts mehr 😉 Ich hatte gut die Hälfte durch, aber dann wollte ich mir ne Pause gönnen. Nach der Zeit hat mich der Guide aufgeregt, weil er so doppeldeutig geschrieben ist dass man das nie wirklich glauben konnte.

...hab jetzt neulich erst die letzten Kapitel überflogen. In den Wintersemester-Ferien werde ich dann mal die Quizzes, die ich hab, zweihundert mal durchmachen, und wenn meine Quote bei 98-99% liegt, werd ich da mal hingehen.

Mal ne Frage: Sind das eig. nur Multiple Choice? Im Guide steht auch was von wegen GUI basteln usw. Also wie genau sieht das denn aus, ich dachte bisher eig. das is nur n elektronischer Multiple-Choice Test mit ca 70 Fragen oder sowas. Kommt da noch mehr?

bitte PN damit wir diesen Thread nicht noch mehr vergewaltigen 😉
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben