Swing Spaltenköpfe verschieben sich nicht mit, wenn man an horizontaler Scrollbar zieht

Status
Nicht offen für weitere Antworten.

darkwall

Aktives Mitglied
Hallo,

ich habe ein nerviges Problem mit einem JTable in einer JScrollPane. Ich weiß, es gibt schon hunderte Postings dazu, aber keines hat mir bisher weitergeholen.

Folgendes Problem:
Ich habe den Spalten eines JTables Spaltennamen zugewiesen. Diese werden auch schön angezeigt, der JScrollPane sei Dank.
Die Spaltenbreite ist fix, d. h. unter Umständen sind einige Spalten nicht sofort sichtbar.
Verschiebe ich nun die Tabelle mittels der horizontalen Scrollbar, werden die Spaltennamen nicht neu gezeichnet.

Ich habe schon verschiedene Möglichkeiten ausprobiert (repaint, validate, usw.), das Einzige, was ich erreicht habe, ist, dass nach dem Verschieben der Tabelle zwar der Header neu angezeigt wurde, jedoch passten die Spaltennamen nicht zur Spalte darunter, sondern finden wieder am Anfang an.

Kann mir jemand bitte helfen? Das kann doch nicht so schwer sein. ???:L

Viele Grüße und herzlichen Dank
darkwall
 

HoaX

Top Contributor
Du musst uns schon den betreffenden Code zeigen, alles andere wäre reine Spekulation ...
 

Ebenius

Top Contributor
Ich kenne solche Probleme nicht. Also ist Quelltext nötig. Mach doch mal ein KSKB mit dem sich das Problem nachvollziehen lässt. Am besten ohne alle Behebungsversuche des Problems; so nackig wie möglich.

Ebenius
 

darkwall

Aktives Mitglied
Hi, vielen Dank für die schnellen Antworten! :toll:
Hier ist ein Teil des Codes, den Netbeans automatisch erzeugt hat. Der Table, den ich meine hat den Namen "planer".

Java:
private void initComponents() {

         planerSP = new javax.swing.JScrollPane();
        planer = new javax.swing.JTable();
        jScrollPane1 = new javax.swing.JScrollPane();
        pruefungen = new javax.swing.JList();
        jScrollPane2 = new javax.swing.JScrollPane();
        infos = new javax.swing.JTextArea();
        jPanel1 = new javax.swing.JPanel();
    
        planerSP.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        planerSP.setViewportBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        planerSP.setMinimumSize(new java.awt.Dimension(220, 220));
        planerSP.setPreferredSize(new java.awt.Dimension(10000, 10000));
        planerSP.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent evt) {
                planerSPMouseDragged(evt);
            }
            public void mouseMoved(java.awt.event.MouseEvent evt) {
                planerSPMouseMoved(evt);
            }
        });
        planerSP.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
            public void propertyChange(java.beans.PropertyChangeEvent evt) {
                planerSPPropertyChange(evt);
            }
        });

        planer.setFont(new java.awt.Font("Arial", 0, 10)); // NOI18N
        planer.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
        planer.setCellSelectionEnabled(true);
        planer.setFillsViewportHeight(true);
        planer.setMinimumSize(new java.awt.Dimension(500, 500));
        planer.setPreferredSize(new java.awt.Dimension(1000, 1000));
        planer.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_INTERVAL_SELECTION);
        planer.getTableHeader().setResizingAllowed(false);
        planer.getTableHeader().setReorderingAllowed(false);
        planer.setUpdateSelectionOnSort(false);
        planer.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                planerMouseClicked(evt);
            }
            public void mouseExited(java.awt.event.MouseEvent evt) {
                planerMouseExited(evt);
            }
        });
        planer.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseMoved(java.awt.event.MouseEvent evt) {
                planerMouseMoved(evt);
            }
        });
        planerSP.setViewportView(planer);
        planer.getColumnModel().getSelectionModel().setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);

        pruefungen.setModel(new javax.swing.AbstractListModel() {
            String[] strings = { "BRÄ M 5 AF3 123", "BRÄ M 3 AF3 124", "HOG G 2 AF2 125", "HOG Rev 5 AF2 126", " " };
            public int getSize() { return strings.length; }
            public Object getElementAt(int i) { return strings[i]; }
        });
        pruefungen.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                pruefungenMouseClicked(evt);
            }
        });
        jScrollPane1.setViewportView(pruefungen);

        infos.setColumns(20);
        infos.setLineWrap(true);
        infos.setRows(5);
        infos.setToolTipText("\"Infos zur gewählten Prüfungsgruppe\"");
        infos.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
            public void propertyChange(java.beans.PropertyChangeEvent evt) {
                infosPropertyChange(evt);
            }
        });
        jScrollPane2.setViewportView(infos);

        af1.setText("AF 1");
        af1.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                af1StateChanged(evt);
            }
        });

        af2.setText("AF 2");
        af2.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                af2StateChanged(evt);
            }
        });

        af3.setText("AF 3");
        af3.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                af3StateChanged(evt);
            }
        });

        afSport.setText("Sport");
        afSport.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                afSportStateChanged(evt);
            }
        });

In einer anderen Methode fülle ich dann die Kopfzeile und den Inhalt:
Java:
private void aktualisierePlaner() {

        // alle gesetzten Prüfungen holen
        ArrayList allePr = db.getAlleGesetztenPruefungen();
        // prNr, pruefling, fk, lpruefer.name AS pruefer, lvorsitz.name AS vorsitz, lprotokoll.name AS protokoll, zeit, raum, tag, pgruppe

        // Zellen mit entsprechender Prüfung belegen
        // -----------------------------------------
        int spaltenAnzahl = db.getAnzahlSpaltenInPlaner();


        // PLANER TABLE ERSTELLEN

        ArrayList tageRaeume = db.getTageRaeume();

        String[] tr = new String[spaltenAnzahl];


        String[] temp = new String[2];
        // KOPFZEILE SETZEN
        for (int t = 0; t < spaltenAnzahl; t++) {
            temp = Hilfsfunktionen.trenneString(tageRaeume.get(t).toString(), "#");

            tr[t] = temp[0] + " (" + temp[1] + ")";
        }

        // INHALTE SETZEN

        Pruefung p = null;
        DefaultTableModel deft = new DefaultTableModel(null, tr);

        for (int row = 1; row <= db.getZeiten().size(); row++) {
            String[] zeile = new String[spaltenAnzahl];
            for (int col = 0; col < spaltenAnzahl; col++) {
                if ((p = existsPruefung(allePr, row, col)) != null) {
                    zeile[col] = p.pruefung2string();
                } else {
                    zeile[col] = "";
                }
            }
            deft.addRow(zeile);
        }


        config.setHoeheZelle(planer.getFont().getSize() * 3);

        planer.setRowHeight(config.getHoeheZelle());


        deft.fireTableDataChanged();
        deft.fireTableStructureChanged();
        planer.setModel(deft);
    }

@EBENIUS: Ich versuche, heute am späten Nachmittag das von dir geforderte nackige Programm zu erstellen...

Viele Grüße
darkwall
 

Ebenius

Top Contributor
Außer Zeile 50 und 51 (die sollten ersatzlos gestrichen werden) im zweiten Block sehe ich ad hoc keine Fehler. Kommentier mal noch die Zeilen 13 und 14 aus und probier's damit nochmal. Die Lieblingsgröße einer JTable im JScrollPane setzt man mit [c]setPreferredScrollableViewportSize(Dimension)[/c].

Wenn Du versuchst, das Beispiel zu bauen, dann wirst Du vielleicht den Fehler nicht nachvollziehen können. Normaler Weise funktioniert das scrollen der Spalten im JTableHeader ja problemlos. Machst Du böse Dinge in den MouseListeners? Bau einfach mal so viele Zusatzsachen aus dem Code, bis er entweder klein und schnuckelig ist, oder das Problem unterwegs verschwindet.

Ebenius
 

darkwall

Aktives Mitglied
Hallo, ich habe jetzt mal ein extra Projekt erstellt, bei dem der Code, der den Table erstellt, ziemlich ähnlich aber überschaubar ist. Es treten aber immer noch komische Fehler auf.
Ich habe das Netbeans-Projekt (NB-Version 6.7) mal angehängt.
Ich habe dort mal mehrere Zeilen erstellen lassen, die nicht in den Viewport passen, komischerweise wird zwar die Scrollbar angezeigt, jedoch kann man nicht scrollen (vertikal).
Das gleiche Problem, was ich bisher hatte, lässt sich mit dem Beispiel rekonstruieren. Wenn Ihr mit dem Scrollbalken mal nach recht fahrt und wieder nach links, wird der Header tw. verwischt oder ist gar nicht mehr da.
Hier ein Bild davon:
screenshot.png


Ich bin total ratlos! Ich hoffe, dass Ihr es nicht seid! :(

Vielen Dank schon mal für Eure Hilfe!
darkwall
 

Ebenius

Top Contributor
Ich schrieb es schonmal: Schmeiß [c]setPreferredSize(...)[/c] raus, dann geht alles. Erklärung: Die Tabelle hat immer die PreferredSize ihres gesamten Inhaltes. Wenn sie eine Million Zeilen hat, wird sie eine Lieblingshöhe von ungefähr 22 Million Pixel (je nach Font und L&F unterschiedlich) haben. Auch wenn Du nur 400 Pixel in der Höhe sehen willst, so hat das nichts mit der Größe der Tabelle zu tun. Du willst halt nur einen kleineren Ausschnitt; deswegen PreferredScrollableViewportSize(...) ohne PreferredSize verändern.

Ebenius
 
Zuletzt bearbeitet:

darkwall

Aktives Mitglied
Hi Ebenius,
danke für Deinen Hinweis. Ja, das löst zwar das Problem, doch nicht richtig. Ich benötige nämlich genau eine Spaltenbreite von 280 Pixel. Ohne die setPreferredSize() ist es mir noch nicht gelungen, diese Größe genau so einzustellen. Ich habe schon in verschiedenen Kombinationen setSize(), setMaximumSize() und setMinimumSize() (alle mit der geleichen Dimension) gesetzt, jedoch ohne Erfolg.
Auch ein
Java:
        for(int i = 0; i < 6; i++){
            planer.getColumnModel().getColumn(i).setWidth(280);
        }
hat nichts bewirkt.
Woran kann das liegen oder gehe ich das flasch an?

Viele Grüße
darkwall
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
L sortiere spaltenköpfe von JTable AWT, Swing, JavaFX & SWT 3
K JTable und Spaltenköpfe AWT, Swing, JavaFX & SWT 5
V JTable Spaltenköpfe haben andere Namen wie in der DB AWT, Swing, JavaFX & SWT 2
Redeason Objekte in meiner GUI verschieben AWT, Swing, JavaFX & SWT 1
H JavaFX Timeline II: Verschieben einer ImageView AWT, Swing, JavaFX & SWT 16
frager2345 JTextLabel im Flowlayout verschieben AWT, Swing, JavaFX & SWT 4
U JavaFX CheckBoxen in GUI verschieben AWT, Swing, JavaFX & SWT 20
M Polygon per Drag&Drop verschieben AWT, Swing, JavaFX & SWT 26
F Popup Menu etwas verschieben AWT, Swing, JavaFX & SWT 2
K JavaFX Element in HBOX nach rechts verschieben AWT, Swing, JavaFX & SWT 2
J Button lässt sich nicht auf dem JPanel verschieben AWT, Swing, JavaFX & SWT 5
M Swing JPanel flüssig verschieben AWT, Swing, JavaFX & SWT 5
T AWT Grafik"Array" einzelne Elemente verschieben AWT, Swing, JavaFX & SWT 1
N JLabel in JTabbedPane verschieben AWT, Swing, JavaFX & SWT 2
B JavaFX Viewport verschieben AWT, Swing, JavaFX & SWT 3
C LayoutManager Bei verkleinern des Fensters, verschieben sich JPanels übereinander. AWT, Swing, JavaFX & SWT 7
C Swing Geschachteltes GUI mit BorderLayout - Vertikal & horizontal Verschieben AWT, Swing, JavaFX & SWT 1
M Swing JPanel innerhalb eines Frames verschieben AWT, Swing, JavaFX & SWT 3
Y Titel Verschieben AWT, Swing, JavaFX & SWT 11
Z Bildervorschau, MouseDragged das Bild verschieben AWT, Swing, JavaFX & SWT 1
M label mit icon verschieben. AWT, Swing, JavaFX & SWT 1
R Swing Elemente verschieben sich im GBL beim Ein/Ausblenden AWT, Swing, JavaFX & SWT 0
W Buttons verschieben AWT, Swing, JavaFX & SWT 3
Z Plot nach links verschieben!! AWT, Swing, JavaFX & SWT 1
M 3D-Grafik Denkfehler bei Verschieben von Shapes AWT, Swing, JavaFX & SWT 0
T JLabel Nullpunkt verschieben AWT, Swing, JavaFX & SWT 6
K JavaFX Spalten der Tabellen verschieben AWT, Swing, JavaFX & SWT 2
P JList/JScroolPane Text verschieben und text wrappen AWT, Swing, JavaFX & SWT 3
L JFrame von der Taskleiste zu den ausgeblendeten Symbolen verschieben AWT, Swing, JavaFX & SWT 2
O Swing Spalten-Position nach verschieben AWT, Swing, JavaFX & SWT 6
T Swing JButton per Drag&Drop verschieben AWT, Swing, JavaFX & SWT 5
L Componenten im JFrame an genaue stelle verschieben. AWT, Swing, JavaFX & SWT 2
D JSplitPane lässt sich nicht verschieben AWT, Swing, JavaFX & SWT 3
A JLabel verschieben AWT, Swing, JavaFX & SWT 9
bluerob JComponenten verschieben sich bei Fenster wechseln AWT, Swing, JavaFX & SWT 3
J jFrame verschieben verhindern AWT, Swing, JavaFX & SWT 4
H Bild mit KeyListener verschieben AWT, Swing, JavaFX & SWT 2
R JTextField Eingabefeld innerhalb verschieben AWT, Swing, JavaFX & SWT 2
P Rectangle verschieben AWT, Swing, JavaFX & SWT 11
C Bild auf Panel vergrößern und verschieben AWT, Swing, JavaFX & SWT 4
P Objekte anzeigen und verschieben - wie? AWT, Swing, JavaFX & SWT 6
H LayoutManager Panel verschieben sich AWT, Swing, JavaFX & SWT 5
B Element schrittweise verschieben AWT, Swing, JavaFX & SWT 2
G Swing JPanel per Maus verschieben AWT, Swing, JavaFX & SWT 5
K Button verschieben AWT, Swing, JavaFX & SWT 4
T 2D-Grafik gezeichnetes Bild verschieben - rand bleibt sichtbar AWT, Swing, JavaFX & SWT 2
propra Mehrere Objekte gleichzeitig verschieben AWT, Swing, JavaFX & SWT 7
V Swing JScrollPane Viewport verschieben AWT, Swing, JavaFX & SWT 2
propra Objekte auf Zeichenfläche verschieben AWT, Swing, JavaFX & SWT 2
P Swing JTable null values an das Ende verschieben AWT, Swing, JavaFX & SWT 2
M verschieben der Objekte in JPanel nur stückchenweise möglich AWT, Swing, JavaFX & SWT 14
B FlowLayout Buttons verschieben? AWT, Swing, JavaFX & SWT 13
K JButtons innerhalb eines JPanels verschieben (DRAG&DROP) AWT, Swing, JavaFX & SWT 5
R Swing Verschieben eines jButtons mittels MouseDragged AWT, Swing, JavaFX & SWT 4
Z 2D-Grafik Bild auf JPanel verschieben AWT, Swing, JavaFX & SWT 4
D Grafik über JPanels hinweg verschieben AWT, Swing, JavaFX & SWT 2
D Swing Swing Komponenten verschieben AWT, Swing, JavaFX & SWT 7
B Swing AbstractTableModel rows verschieben AWT, Swing, JavaFX & SWT 2
S 2D-Grafik Shapes auf Zeichenfläche gleichmäßig verschieben AWT, Swing, JavaFX & SWT 5
Burny91 Swing Vertical JSplitPane lässt sich nicht nach rechts verschieben AWT, Swing, JavaFX & SWT 2
E Swing Rechteck und Kreise verschieben AWT, Swing, JavaFX & SWT 3
N verschieben von Dateien auf der Festplatte über TreePaths funktioniert nicht AWT, Swing, JavaFX & SWT 10
F Swing Objekte mit Maus verschieben AWT, Swing, JavaFX & SWT 8
E Swing Drag n Drop Verschieben von Labels o.ä. AWT, Swing, JavaFX & SWT 10
K Swing Elemente auf Zeichenfeld verschieben AWT, Swing, JavaFX & SWT 8
C Drag and Drop JPanel auf JPanel nach drop erneut verschieben? AWT, Swing, JavaFX & SWT 3
B JLabel mittels Timer und setLocation verschieben AWT, Swing, JavaFX & SWT 3
M Buttons per Drag & Drop im GridBagLayout verschieben AWT, Swing, JavaFX & SWT 6
C paintComponent mit Maus verschieben - wie? AWT, Swing, JavaFX & SWT 2
T Swing JComboBox: Listeneinträge mit der Maus verschieben AWT, Swing, JavaFX & SWT 5
J showMessageDialog nicht über frame verschieben AWT, Swing, JavaFX & SWT 6
R Bereiche auf Panel verschieben AWT, Swing, JavaFX & SWT 2
U SWT Linien verschwinden nach Verschieben AWT, Swing, JavaFX & SWT 3
R Swing Frame verschieben AWT, Swing, JavaFX & SWT 3
C JTable mit RowSorter und Drag & Drop: Zeile verschieben AWT, Swing, JavaFX & SWT 4
D Swing Buttons verschieben sich bei umbennenung! AWT, Swing, JavaFX & SWT 3
R Rows und Columns in JTable verschieben? AWT, Swing, JavaFX & SWT 8
N RCP/SWT View durch Programm auf 2. Bildschirm verschieben AWT, Swing, JavaFX & SWT 2
O JTable Zeilen "nach oben" verschieben AWT, Swing, JavaFX & SWT 3
G Listenelemente mit der Maus verschieben AWT, Swing, JavaFX & SWT 4
K JTable Spalten nicht verschieben AWT, Swing, JavaFX & SWT 2
F Verschieben einer Messnadel auf einem Bild AWT, Swing, JavaFX & SWT 2
S Buttons verschieben mit Swing AWT, Swing, JavaFX & SWT 5
R JPanel durch "klicken und ziehen" verschieben AWT, Swing, JavaFX & SWT 8
H Tabelle: Spaltenüberschriften verschieben sich AWT, Swing, JavaFX & SWT 2
T Fenster verschieben => Wann fertig? AWT, Swing, JavaFX & SWT 8
T Synchrones Window-verschieben AWT, Swing, JavaFX & SWT 4
K JFrame verschieben / Inhalt ändern AWT, Swing, JavaFX & SWT 5
E Komponenten auf Zeichenfläche gruppieren u. verschieben AWT, Swing, JavaFX & SWT 3
Tom299 JTable - Spalten verschieben deaktivieren? AWT, Swing, JavaFX & SWT 3
F "Verschieben" des paint-Bereichs AWT, Swing, JavaFX & SWT 4
vogella JPanel Größe verschieben AWT, Swing, JavaFX & SWT 2
B Objekte auf Fenster verschieben. Bewegliche jPanels. AWT, Swing, JavaFX & SWT 5
J Nochmal Drag&Drop, ABER: Object verschieben AWT, Swing, JavaFX & SWT 2
D Rechtecke verschieben? AWT, Swing, JavaFX & SWT 2
S drag&drop bild verschieben AWT, Swing, JavaFX & SWT 14
M gezeichnete Punkte dynamisch verschieben mit mousedragged AWT, Swing, JavaFX & SWT 4
B Verschieben einer Komponente unterbinden AWT, Swing, JavaFX & SWT 6
TheJavaKid Kreis, Rechteck, Linie. verschieben AWT, Swing, JavaFX & SWT 5
P Bild verschieben AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben