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:
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ß???
Dankeschön für jeden Hinweis
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ß???
Dankeschön für jeden Hinweis