# Buttons einer JScrollPane hinzufügen



## Perplex (26. Nov 2005)

Hallo,

kann mir Jemand sagen wieso ich keine JButtons einer JScrollPane hinzufügen kann? Ich will eine Leiste mit Vorschaubildern in meine GUI integrieren, dazu packe ich Icons auf JButtons und will dann diese Buttons der ScrollPAne hinzufügen, aber es geht nicht! Es klappt nur wenn ich ein JPanel nehme statt einer ScrollPane. Aber dann kann ich nur ein paar Buttons mit Vorschaubilern in die GUI laden weil sonst der Platz zu groß wird. Also muss ich die Button-Leiste scrollen können. Also wie kann man JButtons mit Icons einer JScrollPane hinzufügen? Irgendwie muss das doch gehen. Bin dankbar für jede Hilfe


----------



## Beni (26. Nov 2005)

Pack die Buttons auf ein Panel, und dann das Panel in die JScrollPane. Achte darauf, dass du entweder einen LayoutManager verwendest, oder beim Panel die "setPreferredSize" aufrufst, um eine Angabe zu machen, wie gross das Panel überhaupt sein soll.

Das ScrollPane kann nur eine einzige Kind-Komponente verwalten.


----------



## Perplex (26. Nov 2005)

erstmal Danke für die Antwort! Ich habe das schon versucht, der ScrollPane ein Panel zuzufügen und dann die Buttons da drauf zu packen, aber es hat nicht funktioniert! auch mit LayoutManager nicht! Hier ist mal ein code-Ausschnitt:

```
treepan = new JScrollPane();

        chooseFiles = new JScrollPane();
        pan2 = new JPanel();
        c.add(chooseFiles, BorderLayout.WEST);
        treepan.add(pan2);
        c.add(treepan, BorderLayout.SOUTH);
```

Die Buttons werden in dieser Methode zugefügt:

```
public void addIcon(String path) {
		ic=new ImageIcon(path);
		ic.setImage(ic.getImage().getScaledInstance(32,32,java.awt.Image.SCALE_SMOOTH));
		but=new JButton(ic);
		pan2.add(but);
}
```


----------



## Beni (26. Nov 2005)

Benutz "setViewportView" anstelle von "add". "Add & co" funktionieren nicht bei einer JScrollPane.


----------



## Perplex (26. Nov 2005)

vielen Dank! hat funktioniert! Noch ne andere Frage: ich muss immer an meinem Hauptfenster ziehen wenn ich ein geladenes Bild angezeigt haben will. Ich denke, man muß irgendwo repaint() aufrufen, aber es klappt einfach nicht! Ich hab keine Ahnung wie man sonst noch dafür sorgen kann daß das Panel automatisch neugezeichnet wird. Hast Du da vielleicht ne Idee?


----------



## lin (26. Nov 2005)

versuchs mal mit validate();


----------



## Perplex (26. Nov 2005)

Danke, hat funktioniert! Ich hab's zuerst mit revalidate() probiert, das hat auch geklappt. Wo ist denn der Unterschied zwischen revalidate() und validate()?


----------



## Beni (26. Nov 2005)

revalidate ruft zuerst noch invalidate auf, damit auch alle Parent-Componenten wissen, dass ihr Kind möglicherweise seine Grösse verändert. Validate berechnet nur lokal die Grössen neu.

Im Zweifellsfalle würde ich revalidate nehmen, obwohl validate oft reicht.


----------

