Swing JScrollPane in JScrollPane - Problem

Dumdidum

Mitglied
Hallo ihr Lieben,

ich habe das Problem, dass ich außen eine JScrollPane habe, die in sich mehrere JScrollPanes hat.
Bei der Äußersten soll nur Vertikal gescrollt werden. Bei den Inneren darf beides.

Daher hab ich

Java:
.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
benutzt. jetzt kann ich zwar nicht horizontal Scrollern. Aber dafür wird mir auch nicht alles angezeigt, wenn die JPanels in den inneren JScrollPanes größer werden.

Hier ein Beispiel:
Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class JScrollPaneTest extends JPanel {

	private static final long serialVersionUID = 1L;

	public JScrollPaneTest() {
		this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

		Box scrollyBoxes = Box.createVerticalBox();
		final JPanel testPanel1 = new JPanel();
		testPanel1.setBackground(Color.RED);
		testPanel1.setPreferredSize(new Dimension(100,100));
		final JScrollPane testScrolly1 = new JScrollPane(testPanel1);
		testScrolly1
				.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
		testScrolly1
				.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		scrollyBoxes.add(testScrolly1);
		
		JPanel testPanel2 = new JPanel();
		testPanel2.setPreferredSize(new Dimension(100,100));
		testPanel2.setBackground(Color.GREEN);
		JScrollPane testScrolly2 = new JScrollPane(testPanel2);
		testScrolly2
				.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
		testScrolly2
				.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		scrollyBoxes.add(testScrolly2);

		JScrollPane lastJScrollPane = new JScrollPane(scrollyBoxes);
		lastJScrollPane
				.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
		lastJScrollPane
				.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		
		JButton resizeButton = new JButton("RESIZE");
		resizeButton.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				Dimension d = new Dimension(250,250);
				testPanel1.setPreferredSize(d);
				testPanel1.revalidate();
			}
		});
		Box buttonBox = Box.createHorizontalBox();
		buttonBox.add(resizeButton);
		
		this.add(lastJScrollPane);
		this.add(buttonBox);

	}

	public static void main(String[] args) {
		JFrame testFrame = new JFrame();
		testFrame.add(new JScrollPaneTest());
		testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		testFrame.setSize(200, 200);
		testFrame.setVisible(true);
	}

}

Das ist natürlich nicht meine eigentliche Klasse 😉 Aber sie spiegelt von den JScrollPanes, Boxen und Panels ca das wieder, was ich habe!

Und ehrlich gesagt trifft hier das Problem auch nur "verzögert" auf. Wenn man hier auf den "Resize-Button" klickt passiert alles so, wie es soll. Wenn man jetzt aber die Größe des JFrame's leicht verändert oder runter scrollt, dann bekommt man auch hier beim Beispiel das Problem.

Wie schaffe ich es also, dass die äußere JScrollPane nicht nur den horizontalen Scroller ausblendet, sondern auch das ganze was gescrollt werden soll an die innere weitergibt?

Schonmal Danke für eure Mühe =)
 
Das Kann man auch über die preferred size beeinflussen.
Java:
scrollyBoxes.setPreferredSize(new Dimension(0, 200));
Das ist nur ein Beispiel. Wäre sicher hübscher, wenn die preferred size durch den Inhalt (Komponenten und LayoutManager) definiert wird.
 
In dem Beispiel hilft es aus. Im eigentlich Code hat es allerdings kein Effekt.
Vllt weil die Komponenten nochmal ein bisschen verschachtelter sind...

Halte aber die Methode mit der X = 0 auch ned für sonderlich elegant..
muss da mal noch bissle dran rum spielen.

Ich frag mich aber eigentlich auch ob es ned einfach ned Methode gibt, die ned das Scrollen wie ich es mache "ausblendet und verbietet" sondern eben auch quasi alle Kinderkomponenten in Kenntnis darüber setzt, dass sie sich darum kümmern müssen 🙁
 
OK, was ich geschrieben habe war nicht ganz richtig. Ich hätte von size und preferred size schreiben sollen oder noch besser von sämtlichen sizes.

So eine Methode, wie Du sie willst, kenne ich nicht. Sie ist auch nicht nötig. Die Bounds werden vom LayoutManger gesetzt und der kann sich beim Layouten an sämtlichen Größen (preffered und andere) von (Parent-) Container und Children orientieren. Beispiel mit FormLayout:

Java:
JPanel panel = new JPanel(new FormLayout("m:g", "d,d"));
panel.add(testScrolly1, new CellConstraints(1, 1));
panel.add(testScrolly2, new CellConstraints(1, 2));

JScrollPane lastJScrollPane = new JScrollPane(panel);
 

Zurück
Oben