Titel | Inhalt | Suchen | Index | DOC | Handbuch der Java-Programmierung, 7. Auflage |
<< | < | > | >> | API | Kapitel 32 - AWT-Dialogelemente |
Ein sehr nützliches Dialogelement ist ScrollPane, ein Container für automatisches horizontales und vertikales Scrolling. Ein ScrollPane ist von der Funktion her einem Panel ähnlich und kann wie jedes andere Dialogelement innerhalb eines Fensters verwendet werden. ScrollPane unterscheidet sich allerdings durch zwei wichtige Eigenschaften von einem gewöhnlichen Panel:
Die innerhalb von ScrollPane angezeigte Komponente arbeitet dabei immer mit der virtuellen Ausgabefläche und merkt nichts von eventuellen Größenbeschränkungen auf dem Bildschirm. Falls die benötigte Ausgabefläche größer ist als die anzeigbare, blendet ScrollPane automatisch die erforderlichen Schieberegler ein, um das Dialogelement horizontal und vertikal verschieben zu können.
Zur Instanzierung eines ScrollPane stehen zwei Konstruktoren zur Verfügung:
public ScrollPane() public ScrollPane(int scrollbarDisplayPolicy) |
java.awt.ScrollPane |
Der Parameter scrollbarDisplayPolicy definiert die Strategie zur Anzeige der Schieberegler entsprechend den in Tabelle 32.2 aufgelisteten Konstanten.
Konstante | Bedeutung |
ScrollPane.SCROLLBARS_AS_NEEDED | Die Schieberegler werden genau dann angezeigt, wenn es erforderlich ist, wenn also mehr Platz benötigt wird, als zur Anzeige zur Verfügung steht. |
ScrollPane.SCROLLBARS_ALWAYS | Die Schieberegler werden immer angezeigt. |
ScrollPane.SCROLLBARS_NEVER | Die Schieberegler werden nie angezeigt und der Bildschirmausschnitt kann nur vom Programm aus verschoben werden. |
Tabelle 32.2: Konstanten zur Anzeige der Schieberegler in ScrollPane
Nach der Konstruktion des ScrollPane wird die aus Container geerbte Methode add aufgerufen, um eine Komponente hinzuzufügen. Im Gegensatz zu anderen Containern sollte add hier lediglich einmal aufgerufen werden, denn ScrollPane kann nur ein einziges Element aufnehmen. Soll ein komplexer Dialog mit vielen Elementen dargestellt werden, so müssen diese in ein Panel verpackt und dann gemeinsam an add übergeben werden.
Nach dem Einfügen einer Komponente kann die Methode setSize aufgerufen werden, um die sichtbare Größe des ScrollPane festzulegen. Die sichtbare Größe ist die Größe, in der das ScrollPane dem Fenster erscheint, in das es eingebettet wurde. Der dadurch definierte Ausschnitt aus dem virtuellen Ausgabebereich wird als Viewport bezeichnet.
Die Größe des virtuellen Ausgabebereichs wird dagegen durch das mit add eingefügte Element selbst festgelegt. Es überlagert dazu getPreferredSize und gibt so die gewünschten Abmessungen an den Aufrufer zurück. Die Methode getPreferredSize spielt eine wichtige Rolle bei der automatischen Anordnung von Dialogelementen mit Hilfe eines Layoutmanagers. Sie wird aufgerufen, wenn ein Container wissen will, wie viel Platz eine Komponente innerhalb eines Bildschirmlayouts belegt. Wir werden in Kapitel 33 noch einmal auf getPreferredSize zurückkommen. Abbildung 32.11 fasst die bisherigen Ausführungen zusammen.
Abbildung 32.11: ViewPort und virtueller Ausgabebereich beim ScrollPane
Die Klasse ScrollPane stellt einige Methoden zur Verfügung, mit denen die Darstellung und Reaktion der Schieberegler beeinflusst werden kann:
public Adjustable getHAdjustable() public Adjustable getVAdjustable() |
java.awt.ScrollPane |
Mit getHAdjustable wird ein Objekt beschafft, das den Zugriff auf den horizontalen Schieberegler ermöglicht, und mit getVAdjustable eines für den vertikalen Schieberegler. Das Interface Adjustable wurde bereits beim Scrollbar vorgestellt, es abstrahiert den Zugriff auf einen Schieberegler. Da die meisten Eigenschaften der Schieberegler bereits von ScrollPane voreingestellt werden, sollte sich das eigene Programm darauf beschränken, durch Aufruf von setUnitIncrement die Schrittweite der Schieberegler einzustellen.
Des Weiteren gibt es einige Methoden für den Zugriff auf den Viewport und seine Position innerhalb des virtuellen Ausgabebereichs:
public Dimension getViewportSize() public void setScrollPosition(int x, int y) public Point getScrollPosition() |
java.awt.ScrollPane |
getViewportSize liefert die aktuelle Größe des Viewports. Mit getScrollPosition kann die Position desjenigen Punkts der virtuellen Ausgabefläche ermittelt werden, der gerade in der linken oberen Ecke des Viewports angezeigt wird. Mit setScrollPosition kann der Viewport vom Programm verschoben werden. Die übergebenen Werte müssen dabei zwischen 0,0 und der jeweils maximalen Größe des virtuellen Ausgabebereichs minus der Größe des Viewports liegen.
Wir wollen ein einfaches Beispiel konstruieren, das die Anwendung von ScrollPane demonstriert. Dazu soll ein Programm geschrieben werden, das eine Liste aller Systemfarben mit ihrer Bezeichnung und einer Farbprobe auf dem Bildschirm ausgibt. Da es insgesamt 26 verschiedene Systemfarben gibt, soll das Programm jeweils nur einen kleinen Ausschnitt darstellen, der vom Anwender verschoben werden kann.
Zur Erstellung des Programms gehen wir in drei Schritten vor:
Der nachfolgende Quellcode enthält alle drei Klassen und zeigt, wie sie zusammenarbeiten:
001 /* Listing3216.java */ 002 003 import java.awt.*; 004 import java.awt.event.*; 005 006 class NamedSystemColors 007 { 008 String[] names; 009 SystemColor[] colors; 010 011 public NamedSystemColors() 012 { 013 names = new String[SystemColor.NUM_COLORS]; 014 colors = new SystemColor[SystemColor.NUM_COLORS]; 015 names [ 0] = "desktop"; 016 colors[ 0] = SystemColor.desktop; 017 names [ 1]= "activeCaption"; 018 colors[ 1] = SystemColor.activeCaption; 019 names [ 2] = "activeCaptionText"; 020 colors[ 2] = SystemColor.activeCaptionText; 021 names [ 3] = "activeCaptionBorder"; 022 colors[ 3] = SystemColor.activeCaptionBorder; 023 names [ 4] = "inactiveCaption"; 024 colors[ 4] = SystemColor.inactiveCaption; 025 names [ 5] = "inactiveCaptionText"; 026 colors[ 5] = SystemColor.inactiveCaptionText; 027 names [ 6] = "inactiveCaptionBorder"; 028 colors[ 6] = SystemColor.inactiveCaptionBorder; 029 names [ 7] = "window"; 030 colors[ 7] = SystemColor.window; 031 names [ 8] = "windowBorder"; 032 colors[ 8] = SystemColor.windowBorder; 033 names [ 9] = "windowText"; 034 colors[ 9] = SystemColor.windowText; 035 names [10] = "menu"; 036 colors[10] = SystemColor.menu; 037 names [11] = "menuText"; 038 colors[11] = SystemColor.menuText; 039 names [12] = "text"; 040 colors[12] = SystemColor.text; 041 names [13] = "textText"; 042 colors[13] = SystemColor.textText; 043 names [14] = "textHighlight"; 044 colors[14] = SystemColor.textHighlight; 045 names [15] = "textHighlightText"; 046 colors[15] = SystemColor.textHighlightText; 047 names [16] = "textInactiveText"; 048 colors[16] = SystemColor.textInactiveText; 049 names [17] = "control"; 050 colors[17] = SystemColor.control; 051 names [18] = "controlText"; 052 colors[18] = SystemColor.controlText; 053 names [19] = "controlHighlight"; 054 colors[19] = SystemColor.controlHighlight; 055 names [20] = "controlLtHighlight"; 056 colors[20] = SystemColor.controlLtHighlight; 057 names [21] = "controlShadow"; 058 colors[21] = SystemColor.controlShadow; 059 names [22] = "controlDkShadow"; 060 colors[22] = SystemColor.controlDkShadow; 061 names [23] = "scrollbar"; 062 colors[23] = SystemColor.scrollbar; 063 names [24] = "info"; 064 colors[24] = SystemColor.info; 065 names [25] = "infoText"; 066 colors[25] = SystemColor.infoText; 067 } 068 069 public int getSize() 070 { 071 return SystemColor.NUM_COLORS; 072 } 073 074 public String getName(int i) 075 { 076 return names[i]; 077 } 078 079 public SystemColor getColor(int i) 080 { 081 return colors[i]; 082 } 083 } 084 085 class SystemColorViewer 086 extends Canvas 087 { 088 NamedSystemColors colors; 089 090 public SystemColorViewer() 091 { 092 colors = new NamedSystemColors(); 093 } 094 095 public Dimension getPreferredSize() 096 { 097 return new Dimension(150,16 + colors.getSize() * 20); 098 } 099 100 public void paint(Graphics g) 101 { 102 for (int i = 0; i < colors.getSize(); ++i) { 103 //Rahmen für Farbbox 104 g.setColor(Color.black); 105 g.drawRect(10,16+20*i,16,16); 106 //Farbbox 107 g.setColor(colors.getColor(i)); 108 g.fillRect(11,17+20*i,15,15); 109 //Bezeichnung 110 g.setColor(Color.black); 111 g.drawString(colors.getName(i),30,30+20*i); 112 } 113 } 114 } 115 116 public class Listing3216 117 extends Frame 118 { 119 public static void main(String[] args) 120 { 121 Listing3216 wnd = new Listing3216(); 122 wnd.setLocation(200,100); 123 wnd.setVisible(true); 124 } 125 126 public Listing3216() 127 { 128 super("ScrollPane"); 129 setBackground(Color.lightGray); 130 //ScrollPane 131 ScrollPane sc = new ScrollPane( 132 ScrollPane.SCROLLBARS_AS_NEEDED 133 ); 134 sc.add(new SystemColorViewer()); 135 sc.getVAdjustable().setUnitIncrement(1); 136 sc.getHAdjustable().setUnitIncrement(1); 137 sc.setSize(200,200); 138 add(sc); 139 //Window-Listener 140 addWindowListener(new WindowClosingAdapter(true)); 141 //Dialogelement anordnen 142 pack(); 143 } 144 } |
Listing3216.java |
Die paint-Methode von SystemColorViewer ist etwas ineffizient, denn sie gibt bei jedem Aufruf den gesamten Inhalt der virtuellen Ausgabefläche komplett aus. Eine bessere Implementierung würde zuvor die Position und Größe der Clipping-Region abfragen und nur diesen Bereich aktualisieren. Die Clipping-Region enthält dabei einen Bereich, dessen Größe und Lage exakt dem aktuellen Viewport entspricht. |
|
Ein Probelauf des Programms ergibt folgende Ausgabe:
Abbildung 32.12: Verwendung von ScrollPane
Titel | Inhalt | Suchen | Index | DOC | Handbuch der Java-Programmierung, 7. Auflage, Addison Wesley, Version 7.0 |
<< | < | > | >> | API | © 1998, 2011 Guido Krüger & Heiko Hansen, http://www.javabuch.de |