# Bild auf Panel vergrößern und verschieben



## chamaken (23. Mai 2012)

Hi Leute,

ich habe folgende Idee, bzw. folgendes Problem:

Ein kleines von mir erstelltes Programm hat folgende Funktion:
Mittels eines Dialogs kann ich ein Bild auswählen, welches dann in meiner GUI auf einem jPanel angezeigt wird. Klicke ich nun auf dieses Bild, öffnet sich ein neues Fenster. Dort habe ich zwei Buttons (vergrößern, verkleinern) und ein jScrollPane in einem BorderLayout angelegt. Auf diesem JScrollPane wiederum liegt ein jPanel, auf welchem ich ein jLabel platziert habe, um mittels eines Icons mein Bild anzeigen zu lassen, auf welches ich in vorigem Fenster geklickt habe. Das funktioniert soweit wunderbar.
Nun möchte ich, dass bei Klicken der Buttons in das Bild, bzw. aus dem Bild herausgezoomt wird, je nachdem. Das Fenster und auch das jScrollPane sollen die Größe beibehalten, lediglich der Bildausschnitt soll gezoomt werden. Dabei soll nicht nur der Ausschnitt angezeigt werden können, sondern ich will mittels der Scrollbalken auch das Bild verschieben können, so wie man es vom Zoomen kennt.

Wie kriege ich das hin?
Ich hab schon einiges versucht, allerdings bekomme ich nur einen einzigen Ausschnitt gezoomt, welchen ich dann nicht verschieben kann. Liegt es daran, dass ich das Bild mittels eines Icons darstellen lasse?
Ich hoffe, ich hab mich verständlich ausgedrückt und wäre für Antworten sehr dankbar!


----------



## Michael... (23. Mai 2012)

Eine Möglichkeit die funktionieren könnte wäre das Bild als BufferedImage zu halten. BufferedImage bietet mit der Methode getScaledInstance(int, int, int) ein skaliertes Image zu erzeugen aus dem man wiederum ein ImageIcon erzeugen kann, mit dem man das Icon auf dem JLabel ersetzt.

Besser wäre meiner Meinung das Bild selbst und direkt auf z.B ein JPanel zu zeichnen - erfordert entsprechende Programmierkenntnisse.


----------



## chamaken (25. Mai 2012)

Danke für die Antwort!
Ich hab es heute morgen nach längerem Testen selbst hinbekommen. 
Leider hatte ich das ScrollPane nur über .setSize() dimensioniert, man muss aber .preferredSize() nehmen, was ich schlichtweg nicht wusste.
Nun klappt es wunderbar, nur dass das Label nicht zentriert angezeigt wird. Wie ist dies zu realisieren?
Ich hab nämlich gelesen, dass man keinen Layoutmanager für ScrollPanes nutzen soll.


----------



## Michael... (25. Mai 2012)

hätte gedacht, dass die PreferredSize des JLabels entsprechend der Größe des Icons automatisch gesetzt wird - aber grundsätzlich ist richtig, dass die JScrollPane sich an der PreferredSize der View Komponente orientiert.

Zum Label zentrieren, hier eine q&d Lösung: Einfach das JLabel auf eine JPanel mit GridBagLayout platzieren und das JPanel als View Komponente der JScrollPane setzen

```
JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JPanel panel = new JPanel(new GridBagLayout());
		JLabel label = new JLabel("TestLabel");
		label.setOpaque(true);
		label.setBackground(Color.BLUE);
		panel.add(label);
		
		frame.add(new JScrollPane(panel));
		frame.setBounds(0, 0, 200, 200);
		frame.setVisible(true);
```


----------



## chamaken (25. Mai 2012)

Das hab ich soweit auch. Ich glaube, ich hab mich auch falsch ausgedrückt.
Das Panel, welches auf dem ScrollPane liegt, wird nicht zentriert angezeigt, da ich ja beim ScrollPane keinen LayoutManager verwenden kann.

Ich würde vorschlagen dieses Problem in mein neu erstelltes Thema zu verlagern und dieses als erledigt anzusehen, wenn das geht? Bin ja noch ganz neu hier ???:L

Trotzdem vielen Dank!


----------

