Advanced Java Services | JViewport |
Ein JViewport ist ein Container, der genau eine Komponente aufnehmen kann. Die aufgenommene Komponente ist in der Regel größer als das JViewport selbst und JViewport stellt nur einen Ausschnitt dieser Komponente dar. Mit der Methode setViewPosition() kann man den Ausschnitt verschieben. Die Methode getExtentSize() liefert die Größe des Ausschnitts, also die Größe des Viewports. Die Methode getViewSize() liefert die Größe der Komponente. JViewport ist das Herzstück eines JScrollPane. Eon JScrollPane ist im wesentlichen ein JViewport mit zwei Scrollbalken. Dabei werden die Scrollbalken automatisch so eingestellt, daß man mit ihnen die ganze Komponente abfahren kann.
Konstruktoren | |
JViewport() | Creates a JViewport. |
Einige Methoden | |
Returntyp | Name der Methode |
void | addChangeListener(ChangeListener l) Adds a ChangeListener to the list that is notified each time the view's size, position, or the viewport's extent size has changed. |
void | removeChangeListener(ChangeListener l) Removes a ChangeListener from the list that's notified each time the views size, position, or the viewports extent size has changed. |
Dimension | getExtentSize() Returns the size of the visible part of the view in view coordinates. |
void | setExtentSize(Dimension newExtent) Sets the size of the visible part of the view using view coordinates. |
int | getScrollMode() Returns the current scrolling mode. |
void | setScrollMode(int mode) Used to control the method of scrolling the viewport contents. |
Component | getView() Returns the JViewport's one child or null. |
void | setView(Component view) Sets the JViewport's one lightweight child (view), which can be null. |
void | remove(Component child) Removes the Viewports one lightweight child. |
Point | getViewPosition() Returns the view coordinates that appear in the upper left hand corner of the viewport, or 0,0 if there's no view. |
void | setViewPosition(Point p) Sets the view coordinates that appear in the upper left hand corner of the viewport, does nothing if there's no view. |
Rectangle | getViewRect() Returns a rectangle whose origin is getViewPosition and size is getExtentSize. |
Dimension | getViewSize() If the view's size hasn't been explicitly set, return the preferred size, otherwise return the view's current size. |
void | setViewSize(Dimension newSize) Sets the size of the view. |
void | scrollRectToVisible(Rectangle contentRect) Scrolls the view so that Rectangle within the view becomes visible. |
Um mit JViewport richtig arbeiten zu können, muß man wissen, daß man es hier mit zwei Koordinatensytemen zu tun hat, die gegeneinander verschoben sind. Die nächste Graphik soll das verdeutlichen. Das JViewport ist blau umrandet und zeigt einen Ausschnitt aus dem Bild. Das Bild liegt auf einer Komponente, meist auf einem JLabel und das JLabel hat die Größe des Bildes. Die linke obere Ecke des JViewports (blau) ist der Nullpunkt des ersten Koordinatensystems (KS1), die linke obere Ecke der Komponente auf dem das Bild liegt ist das zweite Koordinatensystem (KS2). Die beiden Systeme seien in x-Richtung um 70 Pixel und in y-Richtung um 30 Pixel gegeneinander verschoben. Gemessen von KS1 aus hat der Nullpunkt von KS2 die Koordinaten (70,30). Gemessen von KS2 aus hat der Nullpunkt von KS1 die Koordinaten (-70,-30). Man muß tatsächlich beide Koordinatensystemen berücksichtigen. So liefert die Methode jviewport.getViewPosition() die Koordinaten (-70,-30) gemessen im System KS2, während mouseEvent.getPoint() für die gleiche Stelle (70,30) liefert und damit in KS1 mißt.
Eine Verschiebung des Ausschnitts erreicht man mit der Methode setViewPosition(). Da setViewPosition() als Nullpunkt die linke obere Ecke der zu verschiebenden Komponente nimmt, erreicht man eine Verschiebung nach rechts oder nach unten durch negative Koordinaten, eine Verschiebung nach links oder oben durch positive Koordinaten. Beim Verschieben nach links oder oben muß man zudem beachten, daß man nur so weit verschieben kann, bis der untere (rechte) Rand der Komponente den unteren (rechten) Rand des JViewports erreicht. Will man also den Effekt haben, daß man ein Bild auch nach oben oder links aus dem Viewport herausschieben kann, so muß man die Komponente größer als das Bild machen und das Bild in die linke obere Ecke legen. Wir werden das mit einem Applet demonstrieren.
Das folgende JApplet ist ein JViewport, das ein JLabel enthält. Das Label hat die Größe des Bildes und ist mit einem Rand versehen. Mit den vier Buttons kann man das das Label in alle vier Himmelsrichtungen schieben. man wird feststellen, daß man nach oben und nach links das Label nicht aus dem Sichtausschnitt herausschieben kann. Für das Verschieben ist ein Thread zuständig, der gestartet wird, sobald man auf einen Button drückt und der beendet wird, sobald man den Button loßläßt.
Das nächste Beispiel bringt eine Variation. Das JLabel läßt sich nun mit der Maus verschieben (drag) Das JLabel wurde stark vergrößert und das Bild liegt an der linken oberen Ecke des Labels. das Ende der Labelfläche ist durch den roten Rand verdeutlicht. Nun kann man das Bild nach oben und nach links fast vollständig aus dem Ausschnitt herausziehen, den JViewport anbietet. Aber auch hier kann man nur soweit schieben, bis der untere (rechte) Rand des Labels den unteren (rechten) Rand des Viewport erreicht hat.
Copyright Dipl.Math. H.M.Straub |