# JScrollPane auf JPanel - Resizing - Größe verändern



## m!k3 (20. Okt 2006)

Hallo zusammen,

also erstmal zu meinem Problem:

Ich habe ein JPanel mit FlowLayout, dass einige Buttons anzeigt. Da auf dem kompletten JFrame noch andere Panels liegen und der Frame in der Größe veränderbar sein soll, möchte ich, dass das Panel mit den Buttons Scrollbalken bekommt.


```
/* Set Content Pane */
contentPanel = new JPanel();
northPanel   = new JPanel(new FlowLayout());
southPanel   = new JPanel(new FlowLayout(FlowLayout.LEFT)){

contentPanel.setLayout(new BorderLayout());
label = new JLabel("");
spane = new JScrollPane(southPanel, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
spane.setViewportView(southPanel);

northPanel.add(label);
contentPanel.add(northPanel, BorderLayout.NORTH);
contentPanel.add(spane, BorderLayout.CENTER);

// so hier werden Buttons gesetzt auf das spane, sowie ein Label aufs northPanel (habs mal weggelassen)
// ....
// .... 

super.setContentPane( contentPanel );
        
/* Set GUI */
super.pack();
super.setSize(505,560);
super.setVisible(true);
```

So aktuell gibt es einen Scrollbalken unten, wenn die Buttons nicht im Bereich von 505px angezeigt werden können.

Nun möchte ich jedoch, dass das JPanel mit den Buttons auf die Breite des JFrames gesetzt wird, sodass die Knöpfe nicht mehr alle nebeneinander sondern auch untereinander dargestellt werden.

Hierzu verwende ich folgendes:


```
southPanel   = new JPanel(new FlowLayout(FlowLayout.LEFT)){
    public void setSize(Dimension d){
        d.width = getParent().getSize().width; 
        super.setSize(d);
        super.setPreferredSize(d); 
    }
};
```

Nun klappt zwar das Resizing, wenn der Frame größer gezogen wird, allerdings wenn der Frame kleiner gezogen wird, ändert sich die Breite des Panels nicht. Ich bin echt am verzweifeln und bekomme es nicht hin.

Ich hoffe ihr könnt mir da weiterhelfen, habe schon im Forum gesucht, aber nichts passendes gefunden. Das mit der Methode überschreiben setSize hab ich hier ausm Forum.

Ich danke euch wie immer Recht herzlich für eure Hilfe.

m!k3


----------



## André Uhres (21. Okt 2006)

```
southPanel   = new JPanel(new FlowLayout(FlowLayout.LEFT)){
            public Dimension getPreferredSize(){
                Dimension d = new Dimension(10,10);
                d.width = getParent().getSize().width;
                return d;
            }
        };
```


----------



## m!k3 (22. Okt 2006)

Danke.

Das Handling ist soweit perfekt, nur das Scrollen klappt nicht. Es erscheinen keine Scrollbalken, auch nicht wenn ich sie fest einschalte.

Sorry für die späte Rückantwort. War das ganze WE unterwegs.


----------



## m!k3 (22. Okt 2006)

Ich komme einfach nicht auf die richtige Höhe die ich brauche. Das müsste ja die Höhe des Panels sein, oder nicht?

Wie komme ich an diese ran?

getParent() liefert mir den Viewport
getParent().getParent() liefert mir das JScrollPane

Hab mir schon sämtliche Höhenkombinationen zurückgeben lassen.


----------



## André Uhres (22. Okt 2006)

Du könntest erstmal die minimale Breite und Höhe des Panels festlegen (minW, minH).
Wenn d.width/d.height den entsprechenden minimalen Wert unterschreitet,
dann setzt du ihn gleich diesem minimalen Wert. Die Scrollbalken werden dann aktiviert,
damit die minimale Panelgrösse stets einsehbar bleibt. Alle Buttons müssen natürlich 
bei minimaler Panelgrösse noch darin Platz haben.

```
public Dimension getPreferredSize(){
                int minH=100, minW=400;
                Dimension d = new Dimension(minW,minH);
                d.width  = getParent().getSize().width;
                d.height = getParent().getSize().height;
                if(d.height < minH){
                    d.height = minH;
                }
                if(d.width < minW){
                    d.width = minW;
                }
                return d;
            }
```


----------



## m!k3 (22. Okt 2006)

naja die Buttonanzahl kann ja variieren, d.h. ich müsste mir ständig an der Panelbreite und Buttonanzahl errechnen wie hoch das ganze mindestens sein darf, oder wie?

Das wäre ja mehr als umständlich.


----------



## André Uhres (22. Okt 2006)

m!k3 hat gesagt.:
			
		

> ..Das wäre ja mehr als umständlich.


Das ist doch eigentlich nur eine gute Gelengheit um die Mathematik endlich mal praktisch anwenden zu können


----------



## m!k3 (22. Okt 2006)

Naja ich kann mir nicht vorstellen, dass man das Rad neu erfinden muss um diese Problematik zu lösen. ;-)


----------



## m!k3 (23. Okt 2006)

So... also ich hab das Rad neu erfunden und mir die Höhe selber zusammengerechnet.
Das ist vielleicht eine Aktion.

Hier beschrieben, für die die es interessiert:


```
private int picture_count;
private static final int button_size = 130;
private static final int space_size  = 10;
```


```
southPanel   = new JPanel(new FlowLayout(FlowLayout.LEFT)){
    public Dimension getPreferredSize(){ 
        Dimension d = new Dimension(10,10); 
                
        if (getParent().getSize().width > 0){            
            d.width = getParent().getSize().width;

            int rows   = (int)(float)(Math.ceil((double)(float)(picture_count) / (float)(d.width / button_size)));
            int space  = rows * space_size;
            int height = (int)(button_size * rows + space);
                    
            d.height = height;
        }
                
        return d; 
    } 
};
```


Also was machen diese Zeilen:
1. Habe die Bilderanzahl, eine feste Höhe und Breite des Buttons (130), sowie einen Spacebereich (10), den es zwischenden Buttons gibt.

2. Ist nun ein Breitenwert da (bei Erstausführung noch 0, deswegen die if Abfrage) dann wird die Breite vom Viewport geholt. Außerdem errechne ich mir die Höhe, indem ich mir erstmal die Anzahl der Zeilen (Rows) zurückgeben lasse.
Diese errechne ich mit Anzahl der Bilder / (Viewport Breite / Buttongröße). Das ganze muss natürlich aufgerundet werden.
Nun setzt sich die Höhe zusammen aus dem Row-Wert * Buttongröße + (Row-Wert * Spacebereich).

3. Rechenbeispiel
    Anzahl der Bilder = 11
    Viewport-Breite   = 440
    Buttongröße        = 130
    Space                 = 10

    Rows = 4 (aufgerundet)
    Space = 40
    Höhe = 130 * 4 + 40 = 560

    So werden genau 4 Bilder nebeneinander und untereinander dargestellt.

So ist immer optimales scrollen garantiert.

Hoffe ich konnte es richtig erklären - falls euch noch was auffällt sagts mir einfach.

PS. Es gibt bestimmt Wege, das ganze einfacher auszurechnen, ohne groß zu konvertieren. Bin nur auf diese Lösung jetzt gekommen. Vielleicht hat ja jemand einen besseren bzw. leichteren Weg.


----------



## André Uhres (25. Okt 2006)

Guck mal hier:

http://forum.java.sun.com/thread.jspa?forumID=57&threadID=713702


----------



## André Uhres (1. Nov 2006)

Guck auch mal hier:

http://forum.java.sun.com/thread.jspa?forumID=57&threadID=701797&start=2


----------

