JScrollPane

4by4

Mitglied
Hey,

Brauche Hilfe bei einem Problem.

Ich habe ein JPanel, JScrollPane, ein JButton und mehrere JLabels.
Wenn ich den Butten drücke kommt ein Label auf dem Panel welches auf dem Scrollpane liegt dazu.
Das Problem:

Das Label wird rechts hinzugefügt. Ich möchte aber das Panel nur nach unten Scrollable machen.
Die Labels haben zudem eine feste Größe.

Java:
		f.setVisible(true);
		initCategoryPanel((categoryPanel.getWidth() - 6 * fl.getHgap()) / 5,
				categoryPanel.getHeight() - 2 * fl.getVgap(), fl);
		tillPanel = buildTillPanel(fl);
		scrollPane = new JScrollPane(tillPanel);
		scrollPane.setPreferredSize(new Dimension(
				c.getWidth() - 4 * c.getWidth() / 5 - 3 * fl.getHgap(),
				c.getHeight() - 2 * fl.getVgap())
				);
		scrollPane.setPreferredSize(scrollPane.getSize());
		c.add(scrollPane);

mit

Java:
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
hat es nicht funktioniert.

Cheers
 

HonniCilest

Erfahrenes Mitglied
Wieso fügst du ein Label an einer Stelle an, die nicht dargestellt werden kann?
Was hat bei setHorizontalScrollBarPolicy() nicht funktioniert?
 

4by4

Mitglied
nun ja, setHorizontalScrollBarPolicy() hat die scrollbar nach links/rechts entfernt.
Die Labels wurden aber trotzdem nach rechts hinzugefügt, obwohl sie untereinander angezeigt werden sollten.
 

4by4

Mitglied
hab nochmal bisl rumprobiert. komme aber nicht auf die lösung.
hab schnell den teil des problems meines Projekts in ein neues gepackt.

Java:
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.border.LineBorder;

@SuppressWarnings("serial")
public class ScrollPaneTest extends JFrame {
	
	TestComponents[] components = {
			new TestComponents("Com1"),
			new TestComponents("Com2"),
			new TestComponents("Com3"),
			new TestComponents("Com4"),
			new TestComponents("Com5"),
			new TestComponents("Com6"),
	};
	
	JPanel panel;
	
	JScrollPane scrollPane;
	
	JButton button;
	
	FlowLayout fl;
	
	int index = 0;
	
	public ScrollPaneTest() {
		setVisible(true);
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		fl = new FlowLayout(FlowLayout.CENTER, 5, 5);
		
		Container c = getContentPane();
		c.setLayout(fl);
		c.setPreferredSize(new Dimension(
				(int) 
				(Toolkit.getDefaultToolkit().getScreenSize().getWidth() / 5),
				(int) 
				(Toolkit.getDefaultToolkit().getScreenSize().getHeight() - 100)
				));
		
		pack();
		
		panel = new JPanel();
		panel.setLayout(fl);
		
		scrollPane = new JScrollPane(panel);
		scrollPane.setHorizontalScrollBarPolicy(
				JScrollPane.HORIZONTAL_SCROLLBAR_NEVER
				);
		scrollPane.setPreferredSize(new Dimension(
				c.getWidth() - fl.getHgap() * 2,
				c.getHeight() - 100				
				));
		
		
		button = new JButton("Add Component");
		button.setPreferredSize(new Dimension(
				c.getWidth() - fl.getHgap() * 2,
				(int) (c.getHeight() - scrollPane.getPreferredSize().getHeight() 
						- fl.getVgap() * 3)				
				));
		button.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				if(index == components.length)
					index = 0;
				if(components[index].getAmount() == 0) {
					panel.add(components[index]);
					components[index].increase();
				}
				else
					components[index].increase();
				index++;
			}
		});
		
		
		for (int i = 0; i < components.length; i++) {
			components[i].setPreferredSize(new Dimension(
					(int) (scrollPane.getPreferredSize().getWidth()
							- 2 * fl.getHgap()), 50
					));
		}
		c.add(scrollPane);
		c.add(button);
		
	}
	
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {

			@Override
			public void run() {
				new ScrollPaneTest();
			}
		});
	}

}

@SuppressWarnings("serial")
class TestComponents extends JLabel {

	private int amount;
	private String text;
	
	public TestComponents(String string) {
		super(string, JLabel.CENTER);
		this.text = string;
		setAmount(0);
		setBorder(new LineBorder(Color.BLACK));
	}

	public int getAmount() {
		return amount;
	}

	public void setAmount(int amount) {
		this.amount = amount;
	}
	
	public void increase() {
		this.amount++;
		this.setText(text + " amount#" + this.amount);
	}
}

Danke
 
Zuletzt bearbeitet:

zerix

Hausmeister
Moderator
Hallo,

HonniCilest hat dir doch schon gesagt, was du machen musst. Du musst bei deinem JPanel ein anderes Layout setzen.
Standard-Layout bei JPanel ist das FlowLayout und da wird immer rechts angefügt, bis die Reihe voll ist. Du musst dir ein Layout suchen, bei dem du die Labels untereinander anordnen kannst. Da gibt es ein paar. Du musst nur schauen, ob das restliche Verhalten bei dem Layout deinen Erwartungen entspricht.

Gruß

Sascha
 

4by4

Mitglied
Falls es jmd interessiert. Ich habe nun das Problem doch mit FlowLayout gelöst.

Ich gebe dem Panel auf der ScrollPane eine feste Größe, die sich in der Höhe nach dem hinzufügen eines neuen Elements um die höhe des Elements (+ FlowLayout Vertikaler Abstand) vergrößert.

Cheers