Weitere aktuelle Java-Titel finden Sie bei dpunkt.
 Inhaltsverzeichnis   Auf Ebene Zurück   Seite Zurück   Seite Vor   Auf Ebene Vor   Eine Ebene höher   Index


8.4.5

JLayeredPane


Abbildung 8.12: JLayeredPane
Abbildung 8.12

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:
  // 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));

Abbildung 8.13: Ein JLayeredPane mit Drag-and-Drop-Unterstützung
Abbildung 8.13


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.
  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.


 Inhaltsverzeichnis   Auf Ebene Zurück   Seite Zurück   Seite Vor   Auf Ebene Vor   Eine Ebene höher   Index

Copyright © 2002 dpunkt.Verlag, Heidelberg. Alle Rechte vorbehalten.