JPanel mit FlowLayout in JScrollPane - keinen Scrollbalken

carolin

Mitglied
Hallo,

das, was ich gerade mit Swing versuche, klingt eigentlich einfach, funktioniert aber trotzdem nicht. Ich habe folgendes Problem:
Ich habe ein JPanel mit GridBagLayout auf dem neben drei Button auch ein weiteres JPanel (NodeHome) liegt. Dieses JPanel soll in ein JScrollPane eingebettet sein und die Größe Dimension(90,160) haben. Es hat ein FlowLayout und bekommt als Inhalt weitere JPanel von der Größe (30,30) als Inhalt.
Das Problem ist, dass ich keinen Scrollbalken bekomme, auch wenn mehr JPanel platziert sind als das NodeHome groß ist.
Ich habe es auch mit einer Idee aus dem Forum versucht (http://www.java-forum.org/awt-swing-swt/22451-problem-jscrollpane-jpane-flowlayout.html) in der über die Anzahl der enthaltenen Elemente die Größe meines JPanels berechne. Allerdings hat das nur dazu geführt, dass mein NodeHome immer größer wird und keinen Scrollbalken bekommt (bis irgendwann kein Platz mehr auf dem äußeren JPanel ist, dann sehe ich nur noch ein kleines Rechteck).

Hier sind einige Codeausschnitte:
Mein NodeHome, das den Scrollbalken bekommen soll
[JAVA=42]public class NodeHomePanel extends JPanel {

public NodeHomePanel() {

this.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
this.setVisible(true);
setAllNodes();
this.setPreferredSize(new Dimension(90,150));
}

private void setAllNodes() {
ArrayList<String> nodes = NodeNames.getAllNodes();
for (int i = 0; i <nodes.size(); i++) {
NodePanel help = new NodePanel(nodes.get(i));
this.add(help);
}
}[/code]

Dieses JPanel hat ein GridBagLayout und enthält mein NodeHome
Java:
private NodeHomePanel nodeHome;
public TopologyView() {
JPanel leftSide = new JPanel();
GridBagConstraints t1 = new GridBagConstraints();
		t1.gridy = 1;
		nodeHome = new NodeHomePanel();
		JScrollPane scrollNodeHome = new JScrollPane();
		scrollNodeHome.getViewport().add(nodeHome);
		leftSide.add(scrollNodeHome, t1);
		allLevels.add(nodeHome);
}

Ich denke, dass es tatsächlich mit dem FlowLayout zusammenhängt. Hat jemand eine Idee für eine Lösung?
Danke schonmal.
Gruß,
Carolin
 
also meine Erfahrungen sagen mir, dass es mit der JScrollPane am besten klappt, wenn du nur eine Komponente direkt im Konstruktor übergibst.

wobei ich mir ziemlich sicher bin, dass du nur falsch die Komponenten addest (falscher Zeitpunkt, falscher Parent)
Da ich aber aus deinem Code nicht 100% schlau werde...(Bsp. was ist allLevels) hier mal ein Kleines kompilierbares Bsp:

Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;

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

public class ScrollPane {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new ScrollPane();

	}

	public ScrollPane() {
		//das typische BlaBla
		JFrame jFrame = new JFrame();
		jFrame.setSize(new Dimension(150, 280));
		jFrame.setLocationRelativeTo(null);
		jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		// wird eh als Default-Layout gewählt...der Übersichtshalber
		jFrame.setLayout(new FlowLayout());

		JPanel p1, p2, p3, p4;
		p1 = new JPanel();
		p2 = new JPanel();
		p3 = new JPanel();
		p4 = new JPanel();

		p1.setPreferredSize(new Dimension(30, 30));
		p2.setPreferredSize(new Dimension(30, 30));
		p3.setPreferredSize(new Dimension(30, 30));
		p4.setPreferredSize(new Dimension(30, 30));

		p1.setBackground(Color.red);
		p2.setBackground(Color.blue);
		p3.setBackground(Color.green);
		p4.setBackground(Color.gray);
		
		JPanel panelWelchesDieAnderenAufnimmt = new JPanel();
		panelWelchesDieAnderenAufnimmt.add(p1);
		panelWelchesDieAnderenAufnimmt.add(p2);
		panelWelchesDieAnderenAufnimmt.add(p3);
		panelWelchesDieAnderenAufnimmt.add(p4);
		
		//halt hier beim initialisieren der Scrollpane die Komponente mitgeben
		JScrollPane jsp = new JScrollPane(panelWelchesDieAnderenAufnimmt);
		jsp.setPreferredSize(new Dimension(70,140));
		jFrame.add(jsp);

                // und dann noch deine 3 Buttons, zwar nicht im GridBaglayout
		jFrame.add(new JButton("Button 1"));
		jFrame.add(new JButton("Button 2"));
		jFrame.add(new JButton("Button 3"));
		
		// sollte immer mit das Letzte sein, was aufgerufen wird
		jFrame.setVisible(true);
	}

}
 
Ich habe, mit Hilfe deines Testprogramms, meinen Fehler gefunden: Mein JScrollPane benötigt auch noch setPreferredSize und dann funktioniert es.
Danke für deine Hilfe!

Gruß
 

Zurück
Oben