LayoutManager GridBagLayout und JScrollPane

bene2808

Aktives Mitglied
Hallo Forum,

wie praktisch jedes Mal beim Arbeiten mit einem GridBagLayout bin ich auf ein Problem gestoßen, das ich selbst nach stundenlangem Herumprobieren nicht lösen konnte. Ich habe den Code auf folgendes Beispiel vereinfacht:

Code:
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class LayoutTest {
    public static void main(String[] args) {
        JFrame fFrame = new JFrame("LayoutTest");
        final Container cContent = fFrame.getContentPane();
        cContent.setLayout(new GridBagLayout());
        //Testkomponente mit JScrollPane
        final TestComponent tcTop = new TestComponent();
        tcTop.setPreferredSize(new Dimension(100, 50));
        Insets insets = new Insets(4, 4, 4, 4);
        JScrollPane spPanel = new JScrollPane(tcTop, JScrollPane.VERTICAL_SCROLLBAR_NEVER, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        cContent.add(spPanel, new GridBagConstraints(0, 0, 2, 1, 1.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, insets, 0, 0));

        JPanel pLeft = new JPanel();
        pLeft.setBackground(Color.RED);
        cContent.add(pLeft, new GridBagConstraints(0, 1, 1, 2, 0.6, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, insets, 0, 0));
        JPanel pRight1 = new JPanel();
        pRight1.setBackground(Color.BLUE);
        cContent.add(pRight1, new GridBagConstraints(1, 1, 1, 1, 0.4, 0.8, GridBagConstraints.CENTER, GridBagConstraints.BOTH, insets, 0, 0));
        JPanel pRight2 = new JPanel();
        pRight2.setBackground(Color.GREEN);
        cContent.add(pRight2, new GridBagConstraints(1, 2, 1, 1, 0.4, 0.2, GridBagConstraints.CENTER, GridBagConstraints.BOTH, insets, 0, 0));
        fFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        fFrame.setVisible(true);
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException ex) {
                       
                    }
                    Dimension oldSize = tcTop.getPreferredSize();
                    tcTop.setPreferredSize(new Dimension(oldSize.width + 200, oldSize.height + 10));
                    tcTop.revalidate();
                    cContent.revalidate();
                    cContent.repaint();
                }
            }
        }).start();
    }
   
   
    private static class TestComponent extends JComponent {
        @Override
        public void paint(Graphics graphics) {
            Dimension size = getPreferredSize();
            graphics.setColor(Color.BLACK);
            graphics.drawRect(0, 0, size.width - 1, size.height - 1);
        }
    }
}

Generell habe ich in der JScrollPane eine dynamische Komponente, die im Laufe der Anwendung ihre bevorzugte Größe ändert. Da sich die Höhe nur minimal vergrößert, will ich hier nicht extra eine vertikale ScrollBar. Stattdessen rufe ich auf der ContentPane revalidate() auf, damit vom GridBagLayout mehr vertikaler Platz für die ScrollPane freigeräumt wird, sodass wieder der gesamte Y-Bereich der darin enthaltenen Komponente sichtbar ist. Das funktioniert auch gut, bis zu dem Punkt, wo die horizontale ScrollBar tatsächlich benötigt wird, also die Breite der enthaltenen Komponente zu groß.
Aus irgendeinem Grund wird dabei die JScrollPane vertikal zusammengepresst, sodass kaum mehr als die horizontale Scrollbar zu sehen ist.

Warum bloß???:mad::confused::eek:

Dankeschön für jeden Hinweis:)
 

Enceladus271

Bekanntes Mitglied
Dieses "Zusammenklappen" beim GridBagLayout passiert immer wenn nicht genug Platz vorhanden ist um alle Komponenten zu platzieren.

Wenn man deinen Code ausführt sieht man ja das auch die ScrollPane selbst ihre Größe ändert sobald sich die Größe der Testkomponente ändert. Sobald die Testkomponente und somit die ScrollPane zu breit wird, fällt die ScrollPane zusammen.

Du könntest bei der ScrollPane setPreferredSize mit genügend kleinen Werten aufrufen um das zu verhindern.
 

bene2808

Aktives Mitglied
Ok danke schonmal:)

Aber warum klappt die Y-Achse zusammen, wenn auf der X-Achse kein Platz mehr ist? Die sollten doch eigentlich unabhängig voneinander sein, oder?
Und was meinst du mit genügend kleinen Werten für setPreferredSize in der ScrollPane? Mir würde jetzt einfallen, manuell die Höhe der ScrollPane so einzustellen, das alles reinpasst. Aber das wäre erstens wieder nervig, weil ich dann alle Inhalte (Viewport mit TestKomponente, Scrollbar, evtl. Ränder etc.) aufsummieren müsste. Und zweitens sollte das doch eigentlich nicht nötig sein... Ich dachte die Layouts wären dafür da, diese Aufgaben zu übernehmen. Außerdem: Ich habe mir nach jedem Mal vergrößern die Größen der ScrollPane ausgeben lassen (Minimum, Bevorzugt, Maximum) und die haben immer gepasst, auch wenn die Breite zu groß wurde.

Das heißt, der Fehler muss doch eigentlich am GridBagLayout liegen. Aber wo???:confused: Außer... er stellt, wie du vielleicht eigentlich gemeint hast, auf die Minimalgröße um, wenn die Breite nicht mehr reinpasst: 22px Höhe könnten hinkommen, für das, was man dann nur noch sieht. Aber ist das dann nicht trotzdem ein Fehler im Layout?

Sorry für so viel Text:D:cool:
 

Enceladus271

Bekanntes Mitglied
Beim Layout kann ich keinen Fehler entdecken, und aus Erfahrung weiß ich das es daran liegt das der Platz nicht ausreicht um überall die bevorzugte Größe zu nehmen. Wenn ich deinen Code laufen lassse und in der run Methode die bevorzugte Größe der ScrollPane ausgeben lasse kann ich sehen dass die bevorzugte Breite jedesmal 200 Pixel größer wird.

Wenn du nur die bevorzugte Breite festsetzen willst und die Höhe weiterhin automatisch berechnen lassen willst, könntest du getPreferredSize der ScrollPane überschreiben und dort z.B. new Dimension(500, super.getPreferredSize().height) zurückgeben.

Edit: ich habs so ausprobiert und es die ScrollPane fällt dann nicht mehr zusammen.
 

bene2808

Aktives Mitglied
Arrrgh grummel, ja ok, so geht's, aber schön ist es nicht...:eek:

Hab noch ein anderes Problem mit einer ähnlichen Konstellation: Eine JScrollPane mit einem JTextField, die bei jedem mal revalidate mehr horizontalen Platz nachfragt... Da muss ich aber noch ein bisschen rumprobieren...
 

bene2808

Aktives Mitglied
OK, habe das Problem jetzt wieder auf ein einfaches Beispiel reduziert und dabei herausgefunden, dass es am automatischen Zeilenumbruch einer JTextArea liegt:

Code:
JFrame fFrame = new JFrame("LayoutTest");
Container cContent = fFrame.getContentPane();
cContent.setLayout(new GridBagLayout());
Insets insets = new Insets(4, 4, 4, 4);
cContent.add(new JPanel(), new GridBagConstraints(0, 0, 1, 1, 0.6, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, insets, 0, 0));
JTextArea taText = new JTextArea();
taText.setLineWrap(true);
cContent.add(new JScrollPane(taText, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER), new GridBagConstraints(1, 0, 1, 1, 0.4, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, insets, 0, 0));
fFrame.pack();
fFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fFrame.setSize(800, 500);
fFrame.setVisible(true);

Erstens stellt sich gleich zu Anfang kein 60:40 Verhältnis ein, wie in den GridBagConstraints angegeben. Zweitens beansprucht die JTextArea jedes Mal mehr Platz, wenn man das Fenster minimiert und danach wieder aufploppen lässt.

Bin echt ratlos mit diesen Layouts...:confused:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N gridbaglayout und jscrollpane AWT, Swing, JavaFX & SWT 2
P [Layout] GridbagLayout: JScrollPane in JPane AWT, Swing, JavaFX & SWT 2
N Layout-Problem (JScrollPane, GridBagLayout) AWT, Swing, JavaFX & SWT 3
B JTextArea in GridBagLayout mit JScrollPane AWT, Swing, JavaFX & SWT 5
B JTextArea mit GridBagLayout und JScrollPane. AWT, Swing, JavaFX & SWT 4
G JScrollPane in JList unter GridBagLayout einfügen AWT, Swing, JavaFX & SWT 2
N JScrollPane in GridBagLayout AWT, Swing, JavaFX & SWT 6
S GridBagLayout Felder formatieren AWT, Swing, JavaFX & SWT 1
S GridBagLayout - Probleme mit Bilderanzeige AWT, Swing, JavaFX & SWT 3
C GridbagLayout verstehen lernen AWT, Swing, JavaFX & SWT 1
H GridBagLayout macht mich wahnsinnig :-( AWT, Swing, JavaFX & SWT 5
BabySuna darstellungsprobleme mit JTabbedPane und GridBagLayout AWT, Swing, JavaFX & SWT 8
CptK Positionieren von Elementen in GridBagLayout AWT, Swing, JavaFX & SWT 4
A Probleme mit gridheight (GridBagLayout) AWT, Swing, JavaFX & SWT 6
Mario1409 AWT GridBagLayout AWT, Swing, JavaFX & SWT 5
J LayoutManager GridBagLayout, probleme mit Anordnung von Objekten AWT, Swing, JavaFX & SWT 6
DaCrazyJavaExpert Swing Komponenten in GridBagLayout werden Falsch angeordnet AWT, Swing, JavaFX & SWT 1
T LayoutManager Anordnen der Elemente im GridBagLayout AWT, Swing, JavaFX & SWT 11
K GridBagLayout mit reponsive Design AWT, Swing, JavaFX & SWT 2
K GridBagLayout verändert die größe? AWT, Swing, JavaFX & SWT 1
D Swing Größe einer JComboBox im GridBagLayout aufgrund der maximalen Länge der enthaltenen Daten AWT, Swing, JavaFX & SWT 7
T GridBagLayout Anfängerprobleme AWT, Swing, JavaFX & SWT 3
Sin137 LayoutManager GridBagLayout Probleme AWT, Swing, JavaFX & SWT 6
L GridBagLayout Anordnung AWT, Swing, JavaFX & SWT 3
M Gridbaglayout Spaltenbreite AWT, Swing, JavaFX & SWT 3
M LayoutManager GridBagLayout passt seine größe nicht an AWT, Swing, JavaFX & SWT 3
V GridBagLayout AWT, Swing, JavaFX & SWT 4
N LayoutManager GridBagLayout - Grundlagen AWT, Swing, JavaFX & SWT 6
Neumi5694 Swing Gridbaglayout - automatische Anpassung verhindern AWT, Swing, JavaFX & SWT 1
P AWT Problem mit Platzierung (GridBagLayout) AWT, Swing, JavaFX & SWT 2
F Breite beim GridBagLayout festlegen AWT, Swing, JavaFX & SWT 2
M Swing GridBagLayout Komponentengröße festsetzen AWT, Swing, JavaFX & SWT 1
J GridBagLayout mit Hilfe einer For-Schleife befüllen AWT, Swing, JavaFX & SWT 1
W GridBagLayout Größe geben AWT, Swing, JavaFX & SWT 1
HarleyDavidson Swing Seltsames Verhalten GridBagLayout AWT, Swing, JavaFX & SWT 11
W GridBagLayout mit fester Zellgrösse AWT, Swing, JavaFX & SWT 2
N Swing GridBagLayout: Ein Pixel Versatz AWT, Swing, JavaFX & SWT 2
B Swing Gridbaglayout unterschiedliche Zeilenhöhe AWT, Swing, JavaFX & SWT 6
H LayoutManager GridBagLayout AWT, Swing, JavaFX & SWT 1
N GridBagLayout - was fehlt? AWT, Swing, JavaFX & SWT 8
S Swing rowHeight und rowWeight im GridBagLayout AWT, Swing, JavaFX & SWT 1
N Swing GUI mit GridBagLayout AWT, Swing, JavaFX & SWT 4
A jpanel mit gridbaglayout auf hintergrundbild AWT, Swing, JavaFX & SWT 7
S GridBagLayout-Frage AWT, Swing, JavaFX & SWT 1
G GridBagLayout AWT, Swing, JavaFX & SWT 6
S GridBagLayout "links-rechts-layouten" AWT, Swing, JavaFX & SWT 7
T LayoutManager GridBagLayout / erwartetes Raster fehlt AWT, Swing, JavaFX & SWT 3
X Gridbaglayout gridx + gridy auslesen? AWT, Swing, JavaFX & SWT 7
H GridBagLayout macht Probleme... AWT, Swing, JavaFX & SWT 4
N GridBagLayout - Zeitplan AWT, Swing, JavaFX & SWT 13
N Swing GridbagLayout AWT, Swing, JavaFX & SWT 4
S Swing gridbaglayout AWT, Swing, JavaFX & SWT 8
G GridBagLayout Problem AWT, Swing, JavaFX & SWT 4
Java-Insel LayoutManager Ein GridBagLayout-Objekt für mehrere Panels? AWT, Swing, JavaFX & SWT 2
X LayoutManager gridBagLayout wird nicht richtig Dargestellt AWT, Swing, JavaFX & SWT 5
das-mo Probleme mit GridBagLayout AWT, Swing, JavaFX & SWT 6
T LayoutManager GridBagLayout - zwei jTable mit unterschiedlicher Höhe AWT, Swing, JavaFX & SWT 2
N LayoutManager GridBagLayout schummeln erlaubt ? AWT, Swing, JavaFX & SWT 2
D GridBagLayout AWT, Swing, JavaFX & SWT 9
A Swing GridBagLayout - constraints.anchor scheint nicht korrekt zu funktionieren? AWT, Swing, JavaFX & SWT 7
J Swing Terminkalender Wochenansicht mit Gridbaglayout oder JTable AWT, Swing, JavaFX & SWT 16
C LayoutManager GridBagLayout - Anfängerfrage AWT, Swing, JavaFX & SWT 5
Asamandra LayoutManager GridBagLayout - Komponenten (mit fill?) vergrößern aber Proportionen dabei erhalten? AWT, Swing, JavaFX & SWT 3
R GridBagLayout in GridBagLayout AWT, Swing, JavaFX & SWT 2
H Positionierungsprobleme beim GridBagLayout AWT, Swing, JavaFX & SWT 16
Furtano AWT GridBagLayout macht mir Sorgen AWT, Swing, JavaFX & SWT 3
A GridbagLayout positionierungsproblem AWT, Swing, JavaFX & SWT 4
earlgrey_tea GridBagLayout Componenten proportional vergößern AWT, Swing, JavaFX & SWT 12
D JTable im GridBagLayout -> gridwidth AWT, Swing, JavaFX & SWT 6
T GridBagLayout Problem AWT, Swing, JavaFX & SWT 3
D Probleme mit GridBagLayout AWT, Swing, JavaFX & SWT 8
J Swing GridBagLayout: Links-nach-rechts Orientierung statt zentriert AWT, Swing, JavaFX & SWT 12
R Größe eines Labels bei GridBagLayout festlegen AWT, Swing, JavaFX & SWT 9
B GridBagLayout Problem AWT, Swing, JavaFX & SWT 3
M LayoutManager GridBagLayout AWT, Swing, JavaFX & SWT 11
E LayoutManager GridBagLayout in BorderLayout - Abstand bei Resizing AWT, Swing, JavaFX & SWT 2
Y LayoutManager Keine vollständige Darstellung der Tabelle mit GridBagLayout AWT, Swing, JavaFX & SWT 3
L LayoutManager GridBagLayout leere Zeilen AWT, Swing, JavaFX & SWT 4
H LayoutManager Layout mit GridBagLayout machbar? AWT, Swing, JavaFX & SWT 6
N GridBagLayout Problem AWT, Swing, JavaFX & SWT 6
C Swing JTable "zerstört" GridBagLayout AWT, Swing, JavaFX & SWT 9
N LayoutManager GridBagLayout Größe fixieren AWT, Swing, JavaFX & SWT 3
M GridBagLayout AWT, Swing, JavaFX & SWT 7
V Swing Gridbaglayout Leeres Fenster AWT, Swing, JavaFX & SWT 2
R LayoutManager GridBagLayout Fragen AWT, Swing, JavaFX & SWT 10
P LayoutManager Verständnis-Frage GridBagLayout AWT, Swing, JavaFX & SWT 7
M LayoutManager Einige Fragen zum GridBagLayout AWT, Swing, JavaFX & SWT 13
N GridBagLayout AWT, Swing, JavaFX & SWT 11
D Swing Problem mit Gridbaglayout bzw. Größenanpassung JPanels AWT, Swing, JavaFX & SWT 7
Y Swing GridbagLayout JTextfield zu klein AWT, Swing, JavaFX & SWT 5
L LayoutManager GridBagLayout spielt verrückt AWT, Swing, JavaFX & SWT 9
T LayoutManager GridBagLayout an Fenstergröße anpassen AWT, Swing, JavaFX & SWT 2
J Java GUI mit GridBagLayout AWT, Swing, JavaFX & SWT 3
Y LayoutManager Problem mit Gridbaglayout AWT, Swing, JavaFX & SWT 8
hdi LayoutManager GridBagLayout AWT, Swing, JavaFX & SWT 9
W GridBagLayout Falsche Größenanpassung AWT, Swing, JavaFX & SWT 6
R Swing Button-Größe in JPanel mit GridBagLayout nicht änderbar AWT, Swing, JavaFX & SWT 3
E Problem mit meiner GUI/GridbagLayout AWT, Swing, JavaFX & SWT 2
M LayoutManager GradientPaint auf GridBagLayout AWT, Swing, JavaFX & SWT 5
D LayoutManager GridBagLayout, Änderung zur Laufzeit AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben