JScrollPane bricht am Ende der Anzeige nicht um

G@st

Mitglied
Hallo liebe Programmiererkollegen,

ich habe ein Problem bei der Programmierung einer Applikation und komme absolut nicht mehr voran. In einer größeren Anwendung mit vielen übergeordneten Panels soll ich eine JScrollPane einbinden. An sich kein Problem, allerdings tut sie nicht ganz was ich möchte. Ich habe das Problem isoliert in einer kleinen Klasse Test.java ausgelagert, hier dazu der Quellcode:

Java:
package de.zwf.test;

import java.awt.BorderLayout;
import java.awt.FlowLayout;

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

public class Test extends JFrame {

	public static void main(String[] args) {
		Test t = new Test();
	}

	public Test() {
		this.setLayout(new BorderLayout());
		this.setSize(500, 500);
		this.init();
		this.setVisible(true);
	}

	private void init() {
		JPanel contentPanel = new JPanel(new FlowLayout());

		for (int i = 0; i < 100; i++) {
			contentPanel.add(new JButton(String.valueOf(i)));
		}

		JScrollPane scrollPane = new JScrollPane(contentPanel);
		scrollPane.setLayout(new ScrollPaneLayout());
		scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

		this.add(scrollPane);
	}
}

Das Ergebnis ist leider nicht, dass die Buttons in mehreren Reihen im Fenster zu sehen sind, sondern, dass sie seitlich das Fenster verlassen und quasi bis ins unendliche in der einen Zeile weiter hinzugefügt werden.

Wie kann ich es bewerktstelligen, dass die ScrollPane die Elemente am Ende ihrer sichtbaren Anzeige umbricht und sie in die nächste Zeile schiebt? Was mache ich falsch?
 
Ich glaube, da ist eine JList in Verbindung mit einem JScrollPane und einem CellRenderer, basierend auf einem JButton sinnvoller.

Du tust eine JList in ein JScrollPane.
Den CellRenderer der JList schreibst du selber und lässt ihn JButton erweitern.



Oder habe ich dich falsch verstanden?
 
Normalerweise handelt es sich um ein weiteres Panel, dass in diesem JScrollpane beliebig oft hinzugefügt wird. Und immer dann, wenn der sichtbare Bereich voll ist, wollte ich, dass das Scrollpane von sich aus umbricht.

Mittlerweile hab ich eine etwas aufwendigere Lösung gefunden, die aber funktioniert:

Java:
package de.zwf.test;

import java.awt.BorderLayout;
import java.awt.FlowLayout;

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

import org.jdesktop.swingx.WrapLayout;

public class Test extends JFrame {

	public static void main(String[] args) {
		Test t = new Test();
	}

	public Test() {
		this.setLayout(new BorderLayout());
		this.setSize(500, 500);
		this.init();
		this.setVisible(true);
	}

	private void init() {

                // Here happens the magic
		WrapLayout wraplayout = new WrapLayout();
		wraplayout.setAlignment(FlowLayout.LEFT);
		JPanel contentPanel = new JPanel(wraplayout);

		for (int i = 0; i < 100; i++) {
			contentPanel.add(new JButton(String.valueOf(i)));
		}

		JScrollPane scrollPane = new JScrollPane(contentPanel);
		scrollPane.setLayout(new ScrollPaneLayout());
		scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

		this.add(scrollPane);
	}
}

WrapLayout ist eine, von FlowLayout, abgeleitete Klasse und tut genau das was ich möchte. Je nach Größe des Fensters bricht sie die Elemente um und schreibt sie in eine neue Zeile. Ich hoffe, dass alle, die dieses Problem möglicherweise auch haben, damit etwas anfangen können. Mir hat es sehr viel Aufwand erspart!

Hier findet ihr die Library, die ihr für Swingx braucht.
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben