ich habe ein JPanel mit NullLayout auf dem ich JLabels platziere und diese Labels mittels selbstgezeichneten Linien verbinde (die Linien werden in paintComponent des JPanels gezeichnet).
Nun will ich eine Zoomfunktion realisieren. Der Benutzer klickt einen Button und es wird rein- oder rausgezoomt.
Eine Google-Recherche brachte mich auf JViewport, mit dem sowas leicht zu relasieren sein sollte.
Allerdings fand ich kein passendes Beispiel das mich weiterbrachte. Bin mir auch nicht sicher mit welchen Methoden ich den Viewport richtig verändere
scrollpane ist ein JScrollPane auf dem sich das JPanel befindet in das hinein/herausgezoomt werden soll. Der obige Code steht im Konstruktor meiner JPanel-Klasse.
Nach der Initialisierung des JPanels führe ich
Sollen die Labels unabhängig vom Zoomfaktor immer gleich groß sein? Wenn nein, würde ich diese Labels durch eigenen Objekte ersetzen und selbst zeichnen.
Der Viewport ist doch nur ein Ausschnitt / eine Sicht auf eine Komponente vgl. mit dem Sucher einer Kamera, wenn man dessen Größe ändert, ändert man höchstens den sichtbaren Ausschnitt auf die Komponente.
Wenn dann muss man die Größe der Komponente im Viewport ändern. Das alleine reicht aber nicht aus. (Ist wie bei einem Teller auf einem Tisch, wenn man den Tisch auszieht, wird der Teller deswegen ja auch nicht größer…) Du musst zusätzlich noch die Postion und die Größe der angezeigten Objekte (egal ob Label oder selbst gezeichnet) neu berechnen - im Falle einer Komponente auf NullLayout müssen deren Attribute manipuliert werden, beim selbst zeichnen reicht es aus beim Zeichnen die Lage und Dimension anzupassen.
Was meinst du damit genau? Dass ich anstatt Labels auf dem JPanel zu halten, die Labels bzw. deren Inhalt „von Hand“ in der paintComponent() zeichne?
Ich dachte mir, dass ich mittels des Viewports das selber zeichnen sparen könnte und so die „native“ Möglichkeit zu zoomen nutze.
Mein bisheriger Ansatz war so wie das @_Michael angesprochen hat: Beim Zoomen die Bounds der Labels verändern und anschließend die Linien die die Labels verbinden neu berechnen und auch neu zeichnen. Was mir an der Stelle aber nicht klar ist, wie beim Reinzoomen dann das JScrollPane greift, also die Scrollbalken am rechten und unteren Rand erscheinen. Da muss ich doch dann wieder am Viewport rumspielen oder nicht?
Vllt sollte ich noch dazu sagen, dass die JPanels als einzige (center-) Komponente auf InternalFrames liegen.
*** Edit ***
Ich hab das jetzt mal so durchgezogen, also beim Reinzoomen Labels größer zeichnen, neu zeichnen, Start-/Endpunkte der Verbindungen neu berechnen, und auch diese neu zeichnen.
Dazu vergrößere ich auch die Size des JPanels damit das JScrollpane „anspringt“ und mir die Scrollbalken zur Verfügung stellt.
Schaut bisher alles ganz gut aus.
2 Dinge muss ich aber noch ändern. Meine Buttons über die gezoomt wird befinden sich auch auf dem JPanel (mit nullLayout). Scrolle ich im reingezoomten JPanel sind die Buttons nicht mehr im Viewport
und
Position des Viewports beim Reinzoomen noch anpassen, im Moment zeigt der Viewport immer auf die Ecke links oben, da ja das JPanel nach rechts und nach unten ausgedehnt wird.