Scrollpane mit dynamisch erzeugten Komponenten

Pharadox

Mitglied
Hi,

ich habe ein Problem, auf das ich keine Lösung finde und auf euren kompetenten Rat hoffe.

Ich erzeuge hier 20 Panels, die von der Höhe her mehr Platz als das Fenster benötigen.
Deshalb brauche ich eine Scrollbar um alle Panels darzustellen.

Leider will die Scrollpane aber nicht ihre Funktion erfüllen und ich kann nicht sagen warum.
Ich weis auch nicht ob die Scrollpane richtig anwende.

Hier der komplette Sourcecode:
Java:
package pmtest;

import javax.swing.*;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class view {
	
	public static void main(String[] args){
		//Fenster erzeugen
		JFrame frame = new JFrame("Fenster");
		frame.setResizable(false);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setPreferredSize(new Dimension(800,400));
		//layout des frames
		frame.setLayout(new GridBagLayout());
		
		GridBagConstraints mainGBC = new GridBagConstraints();
		
		//
		JLabel lblFilter = new JLabel("Filter:");
		JTextField txtFilter = new JTextField();
		
		//--> Panel in welchem die dynamisch angelegten panels liegen
		JPanel mainPanel = new JPanel();
		
		//--> die Scrollpane -> das MAINPANEL wird als ziel angegeben
		JScrollPane scroll = new JScrollPane(mainPanel);
		scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
        scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        //setze Größe so groß wie die vom mainPanel
        scroll.setPreferredSize(new Dimension(25,100));
		/*            0                     1
		 *      ----------------------------------------
		 *   0  | lblFilter  |  + txtFilter +++++++++  |
		 *      |--------------------------------------|
		 *      |  -------------------------------  -- |
		 *      |  |        mainPanel            |  x  |
		 *   1  |  |           mit               |  || |
		 *      |  |  vielen dynamischen panels  |  || |
		 *      |  -------------------------------  -- |
		 *      ----------------------------------------
		 */
        //Zusammenbau der Komponenten auf dem Fenster
        mainGBC.gridx=0;
		mainGBC.gridy=0;
		mainGBC.gridwidth=1;
		mainGBC.gridheight=1;
		frame.add(lblFilter,mainGBC);
		mainGBC.gridx=1;
		mainGBC.gridy=0;
		mainGBC.gridwidth=1;
		mainGBC.gridheight=1;
		frame.add(txtFilter,mainGBC);
		
		mainPanel.setPreferredSize(new Dimension(200,100));
		mainPanel.setBackground(new Color(255,200,200));
		
		//dynamisch die Boxen erzeugen
		int anzahlBoxen = 20;
		
		JButton[] btnArray = new JButton[anzahlBoxen];
		JPanel[] containerArray = new JPanel[anzahlBoxen];
		for(int i=0;i<anzahlBoxen;i++)
		{
			btnArray[i] = new JButton("OK");
			btnArray[i].addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					System.out.println("Button gedrückt!");
				}
			});
			
			containerArray[i] = new JPanel();
			containerArray[i].setBackground(new Color(200,255,200));
			containerArray[i].setPreferredSize(new Dimension(60,35));
			//jedes Panel das als Container dient, eigenes Layout
			containerArray[i].setLayout(new GridBagLayout());
			GridBagConstraints panelGBC = new GridBagConstraints();
			
			//den Button in den Containerpanel integrieren
			panelGBC.gridx=0;
			panelGBC.gridy=0;
			panelGBC.gridwidth=1;
			panelGBC.gridheight=1;
			containerArray[i].add(btnArray[i],panelGBC);
			//den Containerpanel an das MAINPANEL anfügen
			int koord = 1+i;
			mainGBC.gridx=0;
			mainGBC.gridy=koord;
			mainGBC.gridwidth=1;
			mainGBC.gridheight=1;
			mainPanel.add(containerArray[i], mainGBC);
		}
		//layoutposition der SCROLLPANE
		mainGBC.gridx=1;
		mainGBC.gridy=1;
		mainGBC.gridwidth=1;
		mainGBC.gridheight=1;
		frame.add(scroll,mainGBC);
		
		mainGBC.gridx=0;
		mainGBC.gridy=1;
		mainGBC.gridwidth=1;
		mainGBC.gridheight=1;
		frame.add(mainPanel,mainGBC);
        
        
		frame.pack();
		frame.setLocation(
				(Toolkit.getDefaultToolkit().getScreenSize().width)/2,
				(Toolkit.getDefaultToolkit().getScreenSize().height)/2		
		);
		//fenster sichtbar machen
		frame.setVisible(true);
	}
}
 
Zuletzt bearbeitet von einem Moderator:
Zeile 107
> frame.add(mainPanel,mainGBC);
ist schlecht, damit fliegt mainPanel aus dem JScrollPane raus, kein Mehrfachverwenden von Komponenten!

und da die Kompenenten in mainPanel bisher alle nebeneinander liegen ist
> scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
äußerst kontraproduktiv.., von der geringen Size der JScrollPanel ganz abgesehen,

edit:
obwohl, mit
> mainPanel.setPreferredSize(new Dimension(200, 100));
zusammen gehts vielleicht auch wieder, das hatte ich rausgenommen,
Zeile 107 also vor allem


-------

Java:
frame.setLocation(
                (Toolkit.getDefaultToolkit().getScreenSize().width)/2,
                (Toolkit.getDefaultToolkit().getScreenSize().height)/2      
        );
geht kürzer so:
frame.setLocationRelativeTo(null);
 
Zuletzt bearbeitet von einem Moderator:

Zurück
Oben