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

Selbstdefinierte Layout-Manager



Falls sich wirklich keiner der vordefinierten Layout-Manager für bestimmte Anforderungen eignet, kann man auch einen eigenen Layout-Manager programmieren. Ein selbst definierter Layout-Manager muss das Interface LayoutManager oder LayoutManager2 implementieren. Darüber hinaus ist in der Regel die Implementierung eines Konstruktors erforderlich.

Ein Beispiel: TreeLayout

Als Beispiel für eine eigene Implementierung diene ein TreeLayout-Manager, der die Komponenten (in der Regel Label-Objekte) in einer Baumhierarchie ähnlich wie im Windows Explorer anzeigt. Die Ebene einer Komponente wird über eine entsprechende Einrückung angezeigt. Hierzu muss jede Komponente unter Angabe der Einrückungsebene in den Container eingefügt werden. Abbildung 8.66 zeigt ein Navigationsfenster, in dem ein TreeLayout verwendet wurde, um Hyperlinks darzustellen.

Abbildung 8.66: Hyperlink-Navigationsfenster mit TreeLayout
Abbildung 8.66


Material zum Beispiel

Die Komponenten und die Einrückungsebene werden in der Methode addLayoutComponent() in internen Vector-Objekten gespeichert, um später darauf zugreifen zu können.
  public void addLayoutComponent(String level,
                                        Component comp) {
    Integer i;
    try {
      i = new Integer(level);
    }
    catch(NumberFormatException e) {
      throw new IllegalArgumentException("Illegal level");
    }
    levels.addElement(i);
    comps.addElement(comp);
  }

Bei diesem Layout sind der normale und der Mindestplatzbedarf identisch. Die Abmessungen ergeben sich aus der Summe der Höhen aller enthaltenen Komponenten sowie aus der maximalen Breite unter Berücksichtigung der jeweiligen Einrückung.
  public Dimension preferredLayoutSize(Container parent) {
    return minimumLayoutSize(parent);
  }

  public Dimension minimumLayoutSize(Container parent) {
    Component c;
    int indent;
    Dimension d = new Dimension();
    Dimension componentDim;

    for(int i=0; i < parent.getComponentCount(); i++) {
      c = parent.getComponent(i);
      componentDim = c.getMinimumSize();
      indent = getIndentFor(c);
      d.width = Math.max(d.width, componentDim.width+indent);
      d.height += componentDim.height;
    }
    return d;
  }

In der Methode layoutContainer() werden die Komponenten sequentiell untereinander angeordnet. Die x-Koordinate wird in der Methode getIndentFor() berechnet, sie ergibt sich aus der Einrückungsebene der Komponente und der Einrückung pro Ebene. Die Komponenten werden in ihrer normalen Größe angezeigt.
  public void layoutContainer(Container parent) {
    Component c;
    int y = 0;
    for(int i=0; i < parent.getComponentCount(); i++) {
      c = parent.getComponent(i);
      c.setBounds(getIndentFor(c), y,
		   c.getPreferredSize().width,
		   c.getPreferredSize().height);
      y += c.getPreferredSize().height;
    }
  }


 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.