8.4.5 | JLayeredPane |
Ein JLayeredPane dient dazu, in unterschiedlichen Ebenen verschiedene Komponenten darzustellen. Dazu gibt es folgende Ebenen-Konstanten (von unten nach oben; die in den Klammern dargestellte Nummer entspricht dem Konstantenwert; je kleiner, desto tiefer die Ebene):
Man verwendet ein JLayeredPane häufig für Drag-and-Drop. Hierzu werden verschiedene Komponenten im JLayeredPane auf unterschiedlichen Ebenen angeordnet:
- JLayeredPane.FRAME_CONTENT_LAYER (-3000)
Hier sind bei einem JRootPane sowohl das Content-Pane wie auch ggf. eine Menüleiste zu finden.- JLayeredPane.DEFAULT_LAYER (0)
Benutzt man ein JLayeredPane außerhalb eines JRootPane, so werden hier typischerweise die Komponenten integriert.- JLayeredPane.PALETTE_LAYER (100)
Eine Auswahl aus Paletten, z.B. aus Farbcodes, werden normalerweise in dieser Ebene angezeigt.- JLayeredPane.MODAL_LAYER (200)
Wenn modale Nachrichtenfenster aufgerufen werden, sollten sie in dieser Ebene angeordnet werden.- JLayeredPane.POPUP_LAYER (300)
Popup-Fenster kommen in diese Ebene.- JLayeredPane.DRAG_LAYER (400)
Komponenten, die per Drag-and-Drop verschoben werden, sollten während des Verschiebens in dieser Ebene dargestellt werden.// public DragableLabel(String name, Color farbe) layeredPane.add(new DragableLabel("red", Color.RED), JLayeredPane.DEFAULT_LAYER); layeredPane.add(new DragableLabel("green", Color.GREEN), new Integer ( JLayeredPane.DEFAULT_LAYER.intValue() +1)); layeredPane.add(new DragableLabel("blue", Color.BLUE), new Integer ( JLayeredPane.DEFAULT_LAYER.intValue() +2));
Material zum Beispiel
Das DragableLabel ist dabei eine von JLabel abgeleitete Klasse, die eine bestimmte Farbe sowie Text aufweist. Sie kümmert sich zudem um das korrekte Drag-and-Drop-Verhalten.
- Applet starten
- Quelltexte:
class DragableLabel extends JLabel { protected static int startPoint = 0; protected int originalLayer; protected Point offsetPoint = null; DragableLabel(String name, Color bgcolor) { super(name); // Zentrieren this.setHorizontalAlignment( SwingConstants.CENTER); // Auf deckend setzen und einfärben setOpaque(true); setBackground(bgcolor); // Jede neu erzeugte Komponente soll um // 20 Pixel verschoben sein (statische Variable) startPoint += 20; // Größe festlegen setBounds(startPoint, startPoint, 50, 50); // Dafür sorgen, dass MouseEvents // weitergeleitet werden // Man könnte das auch durch die Registrierung // eines MouseMotionListener und eines // MouseListener realisieren enableEvents(MouseEvent.MOUSE_EVENT_MASK | MouseEvent.MOUSE_MOTION_EVENT_MASK); } protected void processMouseMotionEvent( MouseEvent e) { // Wenn der offsetPoint != null ist (also das // Label per Drag bewegt wird), wird das Label // um die neue Differenz verschoben if (offsetPoint != null) setLocation ( getX () + (e.getX () - offsetPoint.x), getY () + (e.getY () - offsetPoint.y)); } protected void processMouseEvent (MouseEvent e) { if (e.getID() == MouseEvent.MOUSE_PRESSED) { // Wenn der Benutzer auf das Label klickt if (getParent() instanceof JLayeredPane) { originalLayer = ((JLayeredPane) getParent ()). getLayer(this); // Zum Verschieben (Drag) auf den // Drag-Layer verschieben ((JLayeredPane) getParent ()).setLayer (this, JLayeredPane.DRAG_LAYER.intValue ()); // offsetPoint innerhalb des Labels ermitteln // Wenn offsetPoint != null ist, wird das // Label bewegt offsetPoint = new Point (e.getPoint ().x, e.getPoint ().y); } } else if (e.getID () == MouseEvent.MOUSE_RELEASED) { // Wenn der Benutzer den Drag-Vorgang beendet if (getParent () instanceof JLayeredPane) { // Zurück auf die ursprüngliche Ebene ((JLayeredPane) getParent()).setLayer( this, originalLayer); // offsetPoint auf null setzen -> // Kein Dragging offsetPoint = null; } } } }
In einem JLayeredPane ist standardmäßig kein Layoutmanager eingestellt. Daher müssen alle integrierten Komponenten feste Positionsangaben und Größen haben. Dazu kann man beispielsweise die Methode setBounds(int x, int y, int width, int height) benutzen.
Wenn man einem JLayeredPane einen Layoutmanager zuordnet, so werden alle Komponenten gemäß den Richtlinien so angeordnet, als wären sie alle in einer Ebene.