# Anfängerfrage zu Swing (JPanel und JScrollPane)



## babuschka (10. Dez 2008)

Hallo,
ich bin gerade dabei mir eine simple GUI, bestehen aus einem Panel und einem Button zu erstellen. Ich habe mir dazu eine Klasse GraphicsPanel geschrieben, die mir meine gewünschten Grafiken darstellt. Lediglich beim Layout habe ich Verständnisprobleme:



> public GUI(int rows, int cols) {
> 
> JButton button = new JButton("OK");
> JPanel panel = new JPanel();
> ...



Zum Verständnis:
Ich erstelle mir erstmal einen Button und ein Panel. In das Panel packe ich mein JScrollPane. Nun habe ich wie gesagt bei der Anordnung der einzelnen Elemente Probleme. Brauche in mein "panel", wenn ich mein "graphicspanel" habe?
Wie sage ich ihm, dass sobald meine Grafik nicht mehr komplett in das Fenster passt, er die Scollbalken einfügen soll?


----------



## noisebreath (10. Dez 2008)

ähm.. also sicher bin ich mir nicht aber auf den ersten blick seh ich nur dass du 3 elemente in dein frame packst. du packst nichts in dein scrollpane. dementsprechend kann sich das scrollpane auch an nichts anpassen. in dein frame kannst n panel packen in welches du wieder ein scrollpane packst (je nachdem wie deine oberste eben ausschauen soll) und in das scrollpane packst dann ein element rein oder mehrere und wenns das dann sprengt kannst scrollen..


----------



## babuschka (10. Dez 2008)

Könntest Du mir evtl. zeigen wie Du das meinst? Mit



> JScrollPane scroll = new JScrollPane(panel);



packe ich doch das ScollPane in mein Panel, oder?


----------



## Ebenius (10. Dez 2008)

Hier hast Du Dich verhaspelt. Wahrscheinlich möchtest Du das?

```
JButton button = new JButton("OK"); 
// JPanel panel = new JPanel(); 
GraphicsPanel graphicspanel = new GraphicsPanel(); 
JScrollPane scroll = new JScrollPane(graphicspanel); 

// panel.setLayout(new GridLayout(rows, cols)); 
this.add(button, BorderLayout.SOUTH); 
// this.add(panel, BorderLayout.CENTER); 
this.add(scroll, BorderLayout.CENTER);
```

So erzeugt man ein scroll pane, das die scroll bars nur anzeigt, wenn diese benötigt werden:

```
new JScrollPane(view, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
            JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
```

Hope that helps, Ebenius


----------



## Ebenius (10. Dez 2008)

PaddyW hat gesagt.:
			
		

> Könntest Du mir evtl. zeigen wie Du das meinst? Mit
> 
> 
> ```
> ...



Nö. Das panel auf den viewport des scroll pane.  Am besten, Du liest Dich hier mal ein.

Grüße, Ebenius


----------



## SlaterB (10. Dez 2008)

> Nö. Das panel auf den viewport des scroll pane. 

klar geht das mit dem Konstruktor


weiherhin sei noch anzumerken, dass GUI wohl ein JPanel ist?
standardmäßig hat ein JPanel KEIN BorderLayout,
dann bringen Befehle wie 
> this.add(button, BorderLayout.SOUTH); 
eher Probleme als dass sie weiterhelfen, könnte aber noch funktioniert, SOUTH wird einfach ignoriert

-------


```
public class Test
{

    public static void main(String[] args)
        throws Exception
    {
        JButton button1 = new JButton("OK1");
        JButton button2 = new JButton("OK2");
        JPanel panel = new JPanel();
        panel.add(button1);
        JScrollPane scroll = new JScrollPane(panel);


        JPanel gui = new JPanel();
        gui.setLayout(new BorderLayout());
        gui.add(button2, BorderLayout.SOUTH);
        gui.add(scroll, BorderLayout.CENTER);


        JFrame jFrame = new JFrame("Swing");
        jFrame.setContentPane(gui);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrame.setLocation(512, 384);
        jFrame.setSize(320, 240);
        jFrame.pack();
        jFrame.setVisible(true);
        jFrame.setResizable(false);

    }
}
```


----------



## Ebenius (10. Dez 2008)

SlaterB hat gesagt.:
			
		

> > Nö. Das panel auf den viewport des scroll pane.
> 
> klar geht das mit dem Konstruktor



 :?:


----------



## SlaterB (10. Dez 2008)

die Frage war ursprünglich, ob im JScrollPane was drin ist oder nicht,
mit dem Konstruktor wird erfolgreich das JPanel in das JScrollPane eingefügt,

du bezogst dich nur auf den Wortdreher wie ich gerade sehe


----------



## babuschka (10. Dez 2008)

Okay, also ich habe nun folgendes:



> public GUI(int rows, int cols) {
> 
> JButton button = new JButton("OK");
> graphicspanel = new GraphicsPanel();
> ...



Aber es scorllt immer noch nichts. Ich erstelle ja die GUI mit zwei Parametern für die Reihe und Spalte.


----------



## SlaterB (10. Dez 2008)

du kannst nicht nur Bruchstücke posten, es muss ein vollständiges Programm sein, siehe z.B. mein Posting

falls in graphicspanel nur die JLabels drin sind, dann muss es ja keine eigene Klasse sein,


----------



## babuschka (10. Dez 2008)

Okay sorry. Hier der gewünschte Auszug:


```
public class GUITest extends JPanel{
	
	private GraphicsPanel graphicspanel;

    public GUITest(int rows, int cols) {
    	
        JButton nextButton = new JButton("OK");

        graphicspanel = new GraphicsPanel();
        this.add(nextButton);
        
        JScrollPane scroll = new JScrollPane(graphicspanel);
        graphicspanel.setLayout(new GridLayout(rows, cols));
        this.add(scroll);
                // DIENT ZUM TESTEN. test.jpg = 10x10 Pixel
		for (int i=1;i<=(rows*cols);i++) {
			graphicspanel.add(new JLabel(new ImageIcon("test.jpg"))); }
    }
    
    public static void main(String[] args) {
    	
        JFrame jFrame = new JFrame("Swing");
        
        jFrame.setContentPane(new GUI(10,10));
        
        jFrame.setLocation(512,384);
        
        jFrame.pack();
        
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        
        jFrame.setSize(320,240);
        
        jFrame.setVisible(true);
        
        jFrame.setResizable(false);
    	
    }
    
   class GraphicsPanel extends JPanel implements MouseListener {
        ....
        
        public GraphicsPanel() {
            this.setPreferredSize(new Dimension(CELL * ROWS, CELL * COLUMNS));
            this.addMouseListener(this);
        }

		@Override
		public void mouseClicked(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void mouseEntered(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void mouseExited(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void mousePressed(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void mouseReleased(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}

}}
```


----------



## SlaterB (10. Dez 2008)

wieso gleich ImageIcon?..

versuche erstmal 
graphicspanel.add(new JLabel("a"));

damit gehts bei mir


----------



## babuschka (10. Dez 2008)

Also bei mir ist der Button direkt links vom Panel. Wie kann ich die untereinander anordnen? Und die Scrollbalken sind auch nicht da?!

Ich wollte das so machen:

Ein Fenster. Darin ganz unten ein Button "OK". Darüber mein Panel, was die gesamte Fenstergröße ausfüllt. Wenn der Inhalt des Panels zu groß wird, sollen Scollbalken eingeblendet werden.


----------



## SlaterB (10. Dez 2008)

du stellst für meinen Geschmack zu viele
'wie macht man xy? - ich will dafür keine Tutorials lesen'
-Fragen

Layout ist ne komplizierte Sache..


hier noch eine Version zum Ausprobieren,
ansonsten von mir keine weiteren Antworten



```
public GUITest(int rows, int cols)
    {

        JButton nextButton = new JButton("Next step");

        graphicspanel = new GraphicsPanel();
        this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
        this.add(nextButton);

        graphicspanel.setLayout(new GridLayout(rows, cols));
        graphicspanel.setPreferredSize(new Dimension(300, 300));
        // DIENT ZUM TESTEN. test.jpg = 10x10 Pixel
        for (int i = 1; i <= (rows * cols); i++)
        {
            graphicspanel.add(new JLabel("aaaaa"));
        }
        JScrollPane scroll = new JScrollPane(graphicspanel);
        scroll.setPreferredSize(new Dimension(100, 100));
        this.add(scroll);

    }
```


----------



## babuschka (10. Dez 2008)

Ich hatte einfach das Gefühl, dass wir aneinander vorbeigeredet haben.
Natürlich musst Du mir nicht helfen, wenn Du nicht willst. Ich danke Dir trotzdem ganz herzlich für deine Mühe.

Das Layouten eine komplizierte Sache ist, habe ich heute die letzten 5 Stunden, nur zu genüge gespürt.
Irgendwann kommt man zu dem Punkt wo man im Forum um Hilfe sucht. Das hat nichts mit Faulheit, oder wie Du es sagst "Ich will nichts Lesen" zu tun, sondern einfach weil man irgendwann überfordert ist und ab und zu mal ein Erfolgserlebnis haben möchte. Man kann schließlich auch von Lösungen lernen.


----------



## Tankwart (10. Dez 2008)

Hi, ich glaube du machst es dir alles in allem umständlicher als es nötig ist. Ich hab deinen Code mal ein bischen umgeschrieben und hoffe dass es auch das ist was du haben willst.

Grundsätzlich solltest du dich nochmal über das Thema LayoutManager belesen. Diese kann man quasi in einander "schachteln" um komplexere Layouts zu bekommen.

Hier jetzt mal der Code

```
public class MySimpleGUI extends JFrame{ 
    
   private GraphicsPanel graphicspanel;
   

    public MySimpleGUI() { 
        super("Simple Swing GUI")
		Container cp = getContentPane();
		cp.setLayout(new BorderLayout());
				
        JButton nextButton = new JButton("OK"); 
		nextButton.addActionListener(this);
		cp.add(nextButton, "South");
		
		int cols = 10;
		int rows = 10;
		
        graphicspanel = new GraphicsPanel(); 
		graphicspanel.setLayout(new GridLayout(rows, cols)); 
        
		
		// DIENT ZUM TESTEN. test.jpg = 10x10 Pixel 
		for (int i=1;i<=(rows*cols);i++) {
			graphicspanel.add(new JLabel(new ImageIcon("test.jpg")));
		}
		
		cp.add(new JScrollPane(graphicspanel), "Center");
    } 
    
    public static void main(String[] args) { 
        
		MySimpleGui frame = new MySimpleGUI();       
        frame.setLocation(512,384); 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        frame.setSize(320,240); 
        frame.setResizable(false);
        frame.setVisible(true); 
    } 
    
   class GraphicsPanel extends JPanel implements MouseListener { 
        
	   /*
		   What ever
		*/

	}
}
```

Ich habs jetzt nicht ausprobiert. Ich hoffe ich habe nicht zu viel Mist gemacht (bin auch kein wirklicher Profi) und das es weiterhilft.


----------



## babuschka (10. Dez 2008)

Ich werde mir es gleich anschauen! Aber vielen herzlichen Dank für deine Hilfe!!!


----------

