mehrere JPanel in ein (vertikales) JScrollPane

g-a-s-t

Aktives Mitglied
Hallo,

ich habe ein JFrame mit unterschiedlichen Komponenten. Darunter ein JPanel (parent), welches weitere kleinere JPanel (child1,child2,..) beinhaltet.
Nun möchte ich jedoch mit Hilfe eines JScrollPane, dass sich die child's im parent nur vertikal scrollen lassen.

Durch die Festlegung der Größe des parent-Panels kann ich zwar den vertikalen Scrollbalken erzwingen, bei einer Größenänderung des JFrames ist jedoch diese Festlegung nur hinterlich. So dass zum Beispiel ein Scrollbalken angezeigt wird obwohl er nicht nötig wäre.
Java:
..
JPanel tab = new JPanel();
..
getContentPane().add(tab, BorderLayout.CENTER);
tab.setLayout(new GridBagLayout());

JPanel parent= new JPanel();
parent.setPreferredSize(new Dimension(215, 500));
parent.setLayout(new FlowLayout(FlowLayout.CENTER));
parent.add(getPanel(child1));
parent.add(getPanel(child2));
parent.add(getPanel(child3));
parent.add(getPanel(child4));
					
JScrollPane scroll = new JScrollPane(consPoints);			
					
tab.add(scroll,
	new GridBagConstraints(0, 0, 1, 2, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));

Ich bin über jeden Hinweis dankbar!
 
Zuletzt bearbeitet von einem Moderator:
was ist jetzt die Frage?
wenn die erzwungenen Scrollbalken hinderlich sind, dann erzwinge sie NICHT?!
 
was ist denn mit dieser Methode:
Java:
scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

oder halt für die VerticalenScrollBars entsprechend...
 
Hi!

Zunächst das Obligatorische: Javakod bitte in java tags, das fördert die Übersichtlichkeit.
In einem Beispiel sollten alle Variablen erklärt werden, was bei "consPoints" nicht der Fall ist, in deinem Bsp. wird weder parent, noch child einem JScrollPane hinzugefügt.

Nun möchte ich jedoch mit Hilfe eines JScrollPane, dass sich die child's im parent nur vertikal scrollen lassen.

Du willst scheinbar, dass sich das parent, in dem sich children befinden, vertikal scrollen lässt. Oder liegen die children in einem jeweils eigenen JScrollPane?

Kennst du die ScrollBarPolicy, mit der du festlegen kannst, wann ScrollBars angezeigt werden und wann nicht? Ruf' auf deinem JScrollPane z.B. setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER) auf.

Gruß!
 
Zunächst das Obligatorische: Javakod bitte in java tags, das fördert die Übersichtlichkeit.
In einem Beispiel sollten alle Variablen erklärt werden, was bei "consPoints" nicht der Fall ist, in deinem Bsp. wird weder parent, noch child einem JScrollPane hinzugefügt.
Oh sorry, consPoints == parent.

Du willst scheinbar, dass sich das parent, in dem sich children befinden, vertikal scrollen lässt.
Ganz genau das möchte ich.

Kennst du die ScrollBarPolicy, mit der du festlegen kannst, wann ScrollBars angezeigt werden und wann nicht? Ruf' auf deinem JScrollPane z.B. setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER) auf.
Leider befinden sich damit alle child-Panels in einer Reihe.

 
Das Problem, das sich nun ergibt, liegt beim LayoutManager des parent panels. Sofern deine child panels alle dieselbe Größe haben und du deren Anzahl vorher kennst, würde ich zum GridLayout raten, das du dann mit 2 Spalten und entsprechend vielen Reihen instantiierst. Anderenfalls müssten wir mal schauen, erzähl' wie es mit der Anzahl/Größe der child panels ist.
 
Das wäre natürlich eine gute Variante.
Doch möchte ich mich nicht auf nur zwei Spalten festlegen. Denn wenn das JFrame entsprechend vergrößert wird könnten auch drei oder vier Spalten entstehen.

Die child-Panels sind alle gleich groß nur die Anzahl kann variieren.
 
Weiss nicht, ob es dafür einen passenden LayoutManger gibt.
Hier mal ein möglicher Ansatz:
Java:
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.LayoutManager;
import java.util.ArrayList;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class TablePanelDemo extends JFrame {
	
	public TablePanelDemo() {
		TablePanel panel = new TablePanel();
		for (int i=0; i<10; i++) {
			JLabel label = new JLabel("COMP " +i, JLabel.CENTER);
			label.setBorder(BorderFactory.createEtchedBorder());
			panel.add(label);
		}
		this.getContentPane().add(new JScrollPane(panel));
	}
	
	class TablePanel extends JPanel implements LayoutManager { //, Scrollable {
		
		private List<Component> compList = new ArrayList<Component>();
		private Dimension minDimension = new Dimension(50, 50);
		private int gridWidth, gridHeight, hGap, vGap;
		
		public TablePanel() {
			this(100, 100);
		}
		
		public TablePanel(int gridWidth, int gridHeight) {
			this(gridWidth, gridHeight, 10, 10);
		}
		
		public TablePanel(int gridWidth, int gridHeight, int hGap, int vGap) {
			this.gridWidth = gridWidth;
			this.gridHeight = gridHeight;
			this.hGap = hGap;
			this.vGap = vGap;
			setLayout(this);
		}

		public Component add(Component comp) {
			this.addLayoutComponent("C" + comp.hashCode(), comp);
			return super.add(comp);
		}
		
		public void addLayoutComponent(String name, Component comp) {
			compList.add(comp);
		}
		
		public void layoutContainer(Container parent) {
			Container ct = parent.getParent();
			int col = ct.getWidth()/(gridWidth +hGap);
			if (col==0) col +=1;
			int row = compList.size()/col + ((compList.size()%col>0) ? 1 :0);
			int num=0;
			for (int r=0; r<row; r++) {
				for (int c=0; c<col; c++) {
					if (num<compList.size()) {
						compList.get(num++).setBounds(hGap + c * (gridWidth +hGap), vGap + r* (gridHeight +vGap), gridWidth, gridHeight);
					}
					else
						return;
				}
			}
		}
		
		public Dimension minimumLayoutSize(Container parent) {
			return minDimension;
		}
		
		public Dimension preferredLayoutSize(Container parent) {
			Container ct = parent.getParent();
			int col = ct.getWidth()/(gridWidth +hGap);
			if (col==0) col +=1;
			int row = compList.size()/col + ((compList.size()%col>0) ? 1 :0);
			return new Dimension(col * (gridWidth +hGap), row * (gridHeight +vGap) + vGap);
		}
		
		public void removeLayoutComponent(Component comp) {
			compList.remove(comp);
		}
	}
	
	public static void main(String[] s) {
		JFrame frame = new TablePanelDemo();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setBounds(0, 0, 200, 200);
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	}
}
 

Zurück
Oben