LayoutManager JScrollPane mit dynamischem Inhalt

DCircle

Mitglied
Hallo zusammen!

Ich habe jetzt schon eine Weile im Internet gesucht und leider nichts zu meinem Problem gefunden.

Ich programmiere derzeit eine GUI, die unter anderem Datenbankwerte ausliest und als Scrollbare Liste im Fenster ausgibt. Dazu habe ich einen Array aus JPanels erzeugt und jedes dieser JPanels enthält die entsprechenden ausgelesenen Werte. Diese Panels habe ich in ein großes Panel gesteckt, welches von mir ein GridLayout(0,1) bekommen hat. Dieses große Panel wird dann auf ein JScrollPane gesetzt und fertig 🙂

Das Problem: Wenn ich nur wenige Werte in der Datenbank habe, werden die einzelnen Panels so vergrößert, dass sie trotzdem das gesamte große Panel ausfüllen.

Ich vermute stark, dass es am GridLayout liegt. Allerdings weiß ich nicht, wie ich ohne das GridLayout die kleinen Panels als untereinander stehende Liste ausgeben kann.

Bin für alle Anregungen dankbar!

Hier ein Dummycode:

Java:
import java.awt.*;
import javax.swing.*;


@SuppressWarnings("serial")
public class ScrollFenster extends JFrame {
	
	public int size = 2;
	public JPanel box[] = new JPanel[size];
	public JLabel datenA[] = new JLabel[size];
	public JLabel datenB[] = new JLabel[size];
	public JLabel datenC[] = new JLabel[size];
	public JLabel datenD[] = new JLabel[size];
	
	public JPanel content = new JPanel();
	public JScrollPane contentScroll;
	
	public ScrollFenster(){
		
		super("Testfenster");
    	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	setSize(400,300);
    	setLocation(100,100);
    	setLayout(new BorderLayout(10,30));
		
		for(int i=0;i<size;i++){
    		box[i] = new JPanel();
    		datenA[i] = new JLabel("Dummytext: "+i);
    		datenB[i] = new JLabel("Dummylabel: "+i);
    		datenC[i] = new JLabel("Dummybeschreibung: "+i);
    		datenD[i] = new JLabel("Dummyirgendwas: "+i);

    		box[i].setLayout(new GridLayout(0,2,10,10));
    		
    		box[i].add(datenA[i]);
    		box[i].add(datenB[i]);
    		box[i].add(datenC[i]);
    		box[i].add(datenD[i]);

    		box[i].setBackground(new Color(250,250,250));

    		content.add(box[i]);
    		content.setLayout(new GridLayout(0,1,0,5));
    	}
		contentScroll = new JScrollPane(content);
		add(contentScroll);
	}
	
	public static void main(String[] args){
		ScrollFenster scroll = new ScrollFenster();
		scroll.setVisible(true);
	}
}

Verändert man in diesem Beispiel size auf einen höheren wert (z.B. 20), so wird eine schöne scrollbare
Liste angezeigt. Ich hätte eine ähnliche Darstellung gerne auch für kleine Werte. In der Form, dass der ungenutzte Teil des großen Panels einfach leer bleibt.
 
Wow das ging schnell 😉

Also so wie ich dich verstehe meinst du, dass ich die Daten in eine große Tabelle schreiben soll?
Würde das ganze dann nicht etwas...merkwürdig aussehen?

Ich lese an einigen Stellen 6 bis 8 verschiedene Werte aus und würde sie gerne der Übersicht halber nicht nur horizontal nebeneinander auflisten, sondern auch untereinander. Daher ja die Idee mit den
kleinen Panels. Wenn möglich würde ich gerne auf eine horizontale Scrollbar verzichten.🙁
 
Kommt ein bisschen auf die Werte drauf an. Vielleicht kannst du mal genauer beschreiben, was das für Werte sind. Und man kann bei JTable auch die Zeilen, Spalten und Zellen anpassen und gestalten. Es gibt z.B. die Möglichkeit, mit einem CellRenderer die Zellen entsprechend zu gestalten. Der Vorteil bei der JTable gegenüber deiner Lösung mit den Panels ist halt, dass du die Daten in ein TableModel stecken kannst, und sich dann die JTable aktualisieren kann, wenn sich die Daten ändern.
 
Die Werte sind in den meisten Fällen Namen, Adressen und Datumsangaben.

Der Grund wieso ich so an den Panels festhalte ist, dass ich bereits in Stundenlanger Arbeit update-Funktionen für das JScrollPane geschrieben habe 😛 Ich bin allerdings noch ziemlich unerfahren mit Java und es würde mich nicht wundern, wenn meine bisherige Lösung unnötig viel Rechenzeit beansprucht 😳

Naja jedenfalls gehört der ganze Mist zu so ner Art Routenplaner. Und daher wollte ich ganz gerne die Ortsangaben für Start und Ziel nebeneinander anzeigen lassen und dann direkt darunter die Startzeit und die Ankunftszeit.

In meinem momentanen Programm ist das ganze via GridLayout in den kleinen Panels gelöst und sieht - zumindest für genügend viele Elemente - genauso aus wie ichs haben wollte. Nur halt nicht für wenige Elemente...🙁
 
Das geht bestimmt auch elegant mit JTable. Ich hatte das nämlich auch mal versucht, mit JScrollPane und einer dynamisch sich ändernden Anzahl an JPanels, weil ich das speziell gestalten wollte. Ist aber garnicht so einfach. Mit der JTable, einem Model für die Daten und Gestaltung der Tabelle und CellRenderern ging es dann aber viel einfacher und besser.
Mit dem CellRenderer hast du nämlich deine Zelle als ein JLabel und kannst das entsprechend gestalten. So lassen sich auch Werte untereinander anzeigen (JLabel mit HTML).
 
Und zur Gestaltung der Tabelle gibt es direkt für JTable so tolle Methoden wie: setRowHeight, setBackground, setShowGrid, setIntercellSpacing, setShowHorizontalLines, setGridColor...
 

Neue Themen


Zurück
Oben