JTable nicht komplett scroll bar

-Lenny-

Mitglied
Guten Tag,

ich habe ein Programm geschrieben, welches Einträge die aus einer ArrayList in ein DefaultTableModel geschrieben werden.
Das Model wird dann in ein JTable gefügt, welche sich in einem JScrollPane befindet.
Nun gibt es ein Problem. Sobald ich eine gewissen Anzahl von Einträgen habe, wird die JTable nicht mehr korrekt dargestellt, ich kann nämlich nur bis zu einer gewissen Anzahl von Einträgen scrollen. (siehe Bild).

hab es schon einmal mit JTable.setSize() und JScrollPane.setSize() in Abhängigkeit von der Anzahl der Einträge bzw. Zeilen.

Wisst ihr da was? kann natürlich sein, dass ich auch einfach mal komplett auf dem Schlauch stehe.
 

Anhänge

  • FehlerJTable.jpg
    FehlerJTable.jpg
    100,1 KB · Aufrufe: 31
Kannst du etwas Code zeigen? Wie wird JTable, JScrollPane gelayoutet? Sonst könnt ich mir noch denken, dass es etwas mit Aktualisierung zutun hat; Sprich wenn du Daten ins Modell steckst, dass die JTable (=View) das nicht korrekt mitbekommt.
 
Hier ein wie die JTable im frame erstellt wird.


Java:
/*************************************************************************************************************************************************************************/
                /***********************************************************************************Filmtabelle*******************************************************************************/
                /*************************************************************************************************************************************************************************/
                TabellenContainer = new JScrollPane();
                getContentPane().add(TabellenContainer);
                

                TabellenContainer.setBounds(275, 93, 609, 546);
                {

                    Filmtable = new JTable();
                    Filmtable.setModel(new javax.swing.table.DefaultTableModel(new Object[][]{{null, null}}, new String[]{
                                "Id", "Titel", "Genre", "Laenge", "Bewertung", "gesehen",}) {

                        public boolean isCellEditable(int rowIndex, int columnIndex) {

                            if (columnIndex == 0 || columnIndex == 1 || columnIndex == 2 || columnIndex == 3 || columnIndex == 4) {
                                return false;
                            }
                            return true;
                        }

                        public Class getColumnClass(int columnIndex) {
                            if (columnIndex == 5) {
                                return Boolean.class;
                            }

                            return String.class;
                        }
                    });

                     model = master.updateTable(Filmtable, Combobox.getSelectedItem().toString(), getRadio(), getSearchfield());
                    TabellenContainer.setViewportView(Filmtable);
                    Filmtable.setModel(model);
                    Filmtable.getTableHeader().setReorderingAllowed(false);
                    Filmtable.setSize(606,519+(model.getRowCount()*7));
                    Filmtable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

                    Filmtable.setPreferredSize(new java.awt.Dimension(606, (519 + (Filmtable.getRowCount() * 5))));
                    Filmtable.getColumnModel().getColumn(0).setMaxWidth(0);
                    Filmtable.getColumnModel().getColumn(0).setMinWidth(0);
                    Filmtable.getColumnModel().getColumn(0).setPreferredWidth(0);
                    Filmtable.getColumnModel().getColumn(0).setWidth(0);
                    Filmtable.getColumnModel().getColumn(1).setPreferredWidth(280);
                    Filmtable.getColumnModel().getColumn(2).setPreferredWidth(100);
                    Filmtable.getColumnModel().getColumn(3).setPreferredWidth(70);
                    Filmtable.getColumnModel().getColumn(4).setPreferredWidth(50);
                    Filmtable.getColumnModel().getColumn(5).setPreferredWidth(50);

jetzt hab ich noch mal rumgespielt und eine neue Methode im Controller geschrieben, die immer aufgerufen wird, wenn sich was ändert.

Java:
public void setSizeOfTable() {
        System.out.println("Anzahl Reihen: " + window.getModel().getRowCount());
        //window.getTabellenContainer().setMaximumSize(window.getFilmtable().getSize());
        window.getFilmtable().setSize(606, 519 + (window.getModel().getRowCount() * window.getModel().getRowCount()));
        //window.getTabellenContainer().setMaximumSize(new Dimension(606, 519 + (window.getModel().getRowCount() * window.getModel().getRowCount())));
        window.getFilmtable().setModel(window.getModel());
        //window.getTabellenContainer().setBounds(275, 93, 609, 519 + (window.getModel().getRowCount() * window.getModel().getRowCount()));
        window.getTabellenContainer().setMaximumSize(window.getTabellenContainer().getBounds().getSize());
        window.getFilmtable().setPreferredScrollableViewportSize(new Dimension(606, 519 + (window.getModel().getRowCount() * window.getModel().getRowCount())));
        System.out.println(window.getTabellenContainer().getLayout());
        window.getTabellenContainer().setViewportView(window.getFilmtable());
    }

Leider mit mäßigen erfolg 🙁
 
Ok, mir fällt auf, dass du offenbar ein Null-Layout verwendest ... ich tippe einfach mal dass hier der Hund begraben liegt. Ich bin mir zwar nicht 100%ig sicher, aber ich meine dass die ScrollPane auf die preferredSize ihres Viewports (also der Tabelle) achtet und dann entsprechend Scrollbalken anzeigt. Wenn du Einträge in die Tabelle (bzw. das Modell) steckst ändert die Tabelle ihre pref.Size und die ScrollPane wiederum passt sich ggfs an.
Da du diese Berechnungen alle selbst machst finde ich schwer nachvollziehbar wo hier der Fehler sein könnte. Zumal es viele Dinge wie Border/Spacing/... gibt die man alle noch beachten müsste.

Mein ernstgemeinter Rat ist also diese Sache den Layout-Managern zu überlassen. Vielleicht kannst du es zur Analyse mal auf einen einfachen JFrame (mit Layout-Mgr) stecken und schauen ob die Tabelle immernoch dieses Fehlverhalten an den Tag legt, ich meine so etwas:
Java:
final JFrame frame = new JFrame("Filmtable-Test");
frame.add(new JScrollPane(filmtable), BorderLayout.CENTER);
frame.pack();
SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
        frame.setVisible(true);
    }
});
Sprich anfänglich ohne das Ganze
Code:
setSize()
. Wenn es späterhin dann darum geht die Tabellengröße anzupassen (optimale Spaltenbreiten etc.), dann findet man dazu noch viele Hilfen in diesem Forum und im Internet.
 
Ich werde dir später mal ein Feedback geben, hab leider gerade keine Zeit es zu testen.
Vielen Dank schon mal!

Edit: Habe mal eben schnell die MovieListe in eine andere Tabelle in einem Dialog von meinem Programm eingefügt und es lief auf anhieb. Diese wird nämlich durch ein Layout gesteuert. ein Hoch auf den intern NetBeans Gui Bilder. Dieser hat es im Gegensatz zum Jigloo aus Eclipse vernünftig gemacht.
Naja aber am Ende ist ja eh immer der Programmierer gefragt.
Werd es später dann mal auf das Hauptframe übertragen.

Vielen Dank nochmal für dein Tipp bzw. Lösung!
 

Zurück
Oben