Class Box

java.lang.Object
pi.graphics.boxes_ng.Box
All Implemented Interfaces:
Iterable<Box>
Direct Known Subclasses:
ChildBox, ChildsBox, LeafBox

public abstract class Box extends Object implements Iterable<Box>
Eine Box beschreibt eine rechteckige grafische Fläche, die weitere Kinder-Boxen enthalten kann.

Eine Box hat ihren Anker im linken unteren Eck wie die Figuren der Engine Pi. Anderes als bei Figuren ist die grundlegende Einheit Pixel. Jedoch können die Positionen und Abmessungen auch als Meter gesetzt werden.

Since:
0.38.0
Author:
Josef Friedrich
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    protected List<Box>
    Alle Kinder-Boxen, die diese Box enthält.
    protected double
    Die gesetzte Höhe in Pixel.
    protected double
    Die gesetzte Breite in Pixel.
    protected boolean
    Die Box wird nicht gezeichnet, wenn sie deaktiviert ist.
    protected double
    Die Höhe der Box in Pixel.
    protected boolean
    Ist dieses Attribut wahr, so wird die calculateDimension()-Methode zweimal hintereinander rekursive aufgerufen.
    protected @Nullable Box
    Die übergeordnete Box, in der diese Box enthalten ist.
    protected double
     
    protected boolean
    Gibt an, ob bei dieser Box die Abmessungen gesetzt werden können oder ob die Abmessungen nur automatisch bestimmt werden können.
    protected double
    Die Breite der Box in Pixel.
    protected double
    Die x-Koordinate der linken unteren Ecke in Pixel.
    protected double
    Die y-Koordinate der linken unteren Ecke in Pixel.
  • Constructor Summary

    Constructors
    Constructor
    Description
    Box()
     
  • Method Summary

    Modifier and Type
    Method
    Description
    anchor(double x, double y)
    Setzt die x- und y-Koordinate der linken unteren Ecke in Pixel.
    anchorMeter(double x, double y)
    Setzt die x- und y-Koordinaten der linken unteren Ecke in Metern.
    protected abstract void
    Berechnet rekursiv alle Ankerpunkte (linkes unteres Eck) der untergeordneten Kinder-Boxen.
    protected abstract void
    Berechnet rekursiv die Abmessung (die Höhe und Breite) der eigenen Box.
     
    Deaktiviert die Box.
    disabled(boolean disabled)
    Setzt den Deaktiviert-Status.
    Aktiviert die Box.
    boolean
    Prüft, ob für diese Box mindestens eine Abmessung explizit gesetzt wurde.
    boolean
    Prüft, ob nur die Höhe explizit gesetzt wurde.
    boolean
    Prüft, ob nur die Breite explizit gesetzt wurde.
    int
    Gibt die Höhe der Box in Pixel zurück.
    height(double height)
    Setzt die Höhe der Box in Pixel.
    double
    Gibt die Höhe der Box in Metern zurück.
    heightMeter(double heightMeter)
    Setzt die Höhe der Box in Metern.
    Liefert einen Iterator über die direkten Kinder dieser Box.
    void
    Misst alle Kind-Boxen aus.
    protected void
    Aktualisiert die Ankerpunkte dieser Box und ihrer untergeordneten Boxen.
    protected void
    Berechnet rekursiv die Abmessung (die Höhe und Breite) aller Kind-Boxen und dann die Abmessung eigenen Box.
    abstract int
    Gibt die Anzahl an Kinder-Boxen zurück.
    double
    Gibt den aktuellen Umrechnungsfaktor von Metern in Pixel zurück.
    pixelPerMeter(double pixelPerMeter)
    Setzt den Umrechnungsfaktor für die Darstellung von Metern in Pixel.
    Setzt den Messstatus dieser Box auf „nicht gemessen“ zurück.
    Berechnet die Abmessungen und Ankerpunkte und zeichnet die Box.
    render(Graphics2D g, double pixelPerMeter)
    Berechnet die Box bei Bedarf neu und zeichnet sie mit dem angegebenen Pixel-pro-Meter-Faktor.
    Schaltet zwischen dem Status deaktiviert und aktiviert hin- und her.
    toString(boolean clean)
    Bietet die Möglichkeit, die toString()-Ausgabe der Box-Objekte zu bereinigen.
    Gibt einen vorkonfigurierten ToStringFormatter aus.
    protected double
    updateValue(double value, double newPixelPerMeter)
    Rechnet einen Wert anhand des aktuellen und eines neuen Pixel-pro-Meter-Faktors um.
    int
    Gibt die Breite der Box in Pixel zurück.
    width(double width)
    Setzt die Breite der Box in Pixel.
    double
    Gibt die Breite der Box in Metern zurück.
    widthMeter(double widthMeter)
    Setzt die Breite der Box in Metern.
    int
    x()
    Gibt die x-Koordinate der linken unteren Ecke in Pixel zurück.
    x(double x)
    Setzt die x-Koordinate der linken unteren Ecke in Pixel.
    double
    Gibt die x-Koordinate der linken unteren Ecke in Metern zurück.
    xMeter(double xMeter)
    Setzt die x-Koordinate der linken unteren Ecke in Metern.
    int
    y()
    Gibt die y-Koordinate der linken unteren Ecke in Pixel zurück.
    y(double y)
    Setzt die y-Koordinate der linken unteren Ecke in Pixel.
    double
    Gibt die y-Koordinate der linken unteren Ecke in Metern zurück.
    yMeter(double yMeter)
    Setzt die y-Koordinate der linken unteren Ecke in Metern.
    int
    Gibt die y-Koordinate der linken oberen Ecke in Pixel zurück.

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

    Methods inherited from interface java.lang.Iterable

    forEach, spliterator
  • Field Details

    • childs

      protected List<Box> childs
      Alle Kinder-Boxen, die diese Box enthält.
      Since:
      0.41.0
    • parent

      protected @Nullable Box parent
      Die übergeordnete Box, in der diese Box enthalten ist. Dieses Attribut kann null sein, wenn keine Elternbox vorhanden ist.
      Since:
      0.38.0
    • supportsDefinedDimension

      protected boolean supportsDefinedDimension
      Gibt an, ob bei dieser Box die Abmessungen gesetzt werden können oder ob die Abmessungen nur automatisch bestimmt werden können.
    • measureDimensionTwice

      protected boolean measureDimensionTwice
      Ist dieses Attribut wahr, so wird die calculateDimension()-Methode zweimal hintereinander rekursive aufgerufen.

      Falls in der calculateDimension()-Methode die Abmessungen von Kinder-Boxen verändert werden, ist ein zweiter Messdurchgang nötig.

      See Also:
    • width

      protected double width
      Die Breite der Box in Pixel.
      Since:
      0.40.0
    • definedWidth

      protected double definedWidth
      Die gesetzte Breite in Pixel. Im Gegensatz zu width wird dieses Attribut gesetzt und nicht durch calculateDimension() berechnet.
    • height

      protected double height
      Die Höhe der Box in Pixel.
      Since:
      0.40.0
    • definedHeight

      protected double definedHeight
      Die gesetzte Höhe in Pixel. Im Gegensatz zu height wird dieses Attribut gesetzt und nicht durch calculateDimension() berechnet.
    • x

      protected double x
      Die x-Koordinate der linken unteren Ecke in Pixel.
      Since:
      0.38.0
    • y

      protected double y
      Die y-Koordinate der linken unteren Ecke in Pixel.
      Since:
      0.38.0
    • pixelPerMeter

      protected double pixelPerMeter
    • disabled

      protected boolean disabled
      Die Box wird nicht gezeichnet, wenn sie deaktiviert ist.
  • Constructor Details

    • Box

      public Box()
  • Method Details

    • iterator

      public Iterator<Box> iterator()
      Liefert einen Iterator über die direkten Kinder dieser Box.

      Standardmäßig sind Boxen ohne Kinder definiert — Container-Subklassen sollten diese Methode überschreiben, um tatsächliche Kinder zu liefern.

      Specified by:
      iterator in interface Iterable<Box>
      Returns:
      Ein Iterator über die direkten Kind-Boxen (leer wenn keine).
      Since:
      0.40.0
    • width

      @API @Getter public int width()
      Gibt die Breite der Box in Pixel zurück.
      Returns:
      Die Breite der Box in Pixel.
    • widthMeter

      @API @Getter public double widthMeter()
      Gibt die Breite der Box in Metern zurück.
      Returns:
      Die Breite der Box in Metern.
      Since:
      0.53.0
    • width

      @API @Setter @ChainableMethod public Box width(double width)
      Setzt die Breite der Box in Pixel.
      Parameters:
      width - Die Breite der Box in Pixel.
      Returns:
      Eine Referenz auf die eigene Instanz der Box, damit nach dem Erbauer/Builder-Entwurfsmuster die Eigenschaften der Box durch aneinander gekettete Setter festgelegt werden können, z.B. box.x(..).y(..).
    • widthMeter

      @API @Setter @ChainableMethod public Box widthMeter(double widthMeter)
      Setzt die Breite der Box in Metern.
      Parameters:
      widthMeter - Die Breite der Box in Metern.
      Returns:
      Eine Referenz auf die eigene Instanz der Box, damit nach dem Erbauer/Builder-Entwurfsmuster die Eigenschaften der Box durch() aneinander gekettete Setter festgelegt werden können, z.B. box.x(..).y(..).
      Since:
      0.53.0
    • height

      @API @Getter public int height()
      Gibt die Höhe der Box in Pixel zurück.
      Returns:
      Die Höhe der Box in Pixel.
    • heightMeter

      @API @Getter public double heightMeter()
      Gibt die Höhe der Box in Metern zurück.
      Returns:
      Die Höhe der Box in Metern.
      Since:
      0.53.0
    • height

      @API @Setter @ChainableMethod public Box height(double height)
      Setzt die Höhe der Box in Pixel.
      Parameters:
      height - Die Höhe der Box in Pixel.
      Returns:
      Eine Referenz auf die eigene Instanz der Box, damit nach dem Erbauer/Builder-Entwurfsmuster die Eigenschaften der Box durch aneinander gekettete Setter festgelegt werden können, z.B. box.x(..).y(..).
    • heightMeter

      @API @Setter @ChainableMethod public Box heightMeter(double heightMeter)
      Setzt die Höhe der Box in Metern.
      Parameters:
      heightMeter - Die Höhe der Box in Metern.
      Returns:
      Eine Referenz auf die eigene Instanz der Box, damit nach dem Erbauer/Builder-Entwurfsmuster die Eigenschaften der Box durch() aneinander gekettete Setter festgelegt werden können, z.B. box.x(..).y(..).
      Since:
      0.53.0
    • hasDefiniedDimension

      public boolean hasDefiniedDimension()
      Prüft, ob für diese Box mindestens eine Abmessung explizit gesetzt wurde.
      Returns:
      true, wenn eine definierte Breite oder Höhe vorhanden ist, sonst false.
      Since:
      0.46.0
    • hasOnlyDefiniedWidth

      public boolean hasOnlyDefiniedWidth()
      Prüft, ob nur die Breite explizit gesetzt wurde.
      Returns:
      true, wenn eine definierte Breite und keine definierte Höhe vorhanden ist, sonst false.
      Since:
      0.46.0
    • hasOnlyDefiniedHeight

      public boolean hasOnlyDefiniedHeight()
      Prüft, ob nur die Höhe explizit gesetzt wurde.
      Returns:
      true, wenn eine definierte Höhe und keine definierte Breite vorhanden ist, sonst false.
      Since:
      0.46.0
    • x

      @API @Getter public int x()
      Gibt die x-Koordinate der linken unteren Ecke in Pixel zurück.
      Returns:
      Die x-Koordinate der linken unteren Ecke in Pixel.
      Since:
      0.42.0
    • xMeter

      @API @Getter public double xMeter()
      Gibt die x-Koordinate der linken unteren Ecke in Metern zurück.
      Returns:
      Die x-Koordinate der linken unteren Ecke in Metern.
      Since:
      0.53.0
    • x

      @API @Setter @ChainableMethod public Box x(double x)
      Setzt die x-Koordinate der linken unteren Ecke in Pixel.
      Parameters:
      x - Die x-Koordinate der linken unteren Ecke in Pixel.
      Returns:
      Eine Referenz auf die eigene Instanz der Box, damit nach dem Erbauer/Builder-Entwurfsmuster die Eigenschaften der Box durch aneinander gekettete Setter festgelegt werden können, z.B. box.x(..).y(..).
      Since:
      0.38.0
    • xMeter

      @Setter @ChainableMethod public Box xMeter(double xMeter)
      Setzt die x-Koordinate der linken unteren Ecke in Metern.
      Parameters:
      xMeter - Die x-Koordinate der linken unteren Ecke in Metern.
      Returns:
      Eine Referenz auf die eigene Instanz der Box, damit nach dem Erbauer/Builder-Entwurfsmuster die Eigenschaften der Box durch() aneinander gekettete Setter festgelegt werden können, z.B. box.x(..).y(..).
      Since:
      0.53.0
    • y

      @Getter public int y()
      Gibt die y-Koordinate der linken unteren Ecke in Pixel zurück.
      Returns:
      Die y-Koordinate der linken unteren Ecke in Pixel.
      Since:
      0.42.0
    • yTop

      @API @Getter public int yTop()
      Gibt die y-Koordinate der linken oberen Ecke in Pixel zurück.
      Returns:
      Die y-Koordinate der linken oberen Ecke in Pixel.
      Since:
      0.53.0
    • yMeter

      @API @Getter public double yMeter()
      Gibt die y-Koordinate der linken unteren Ecke in Metern zurück.
      Returns:
      Die y-Koordinate der linken unteren Ecke in Metern.
      Since:
      0.53.0
    • y

      @Setter @ChainableMethod public Box y(double y)
      Setzt die y-Koordinate der linken unteren Ecke in Pixel.
      Parameters:
      y - Die y-Koordinate der linken unteren Ecke in Pixel.
      Returns:
      Eine Referenz auf die eigene Instanz der Box, damit nach dem Erbauer/Builder-Entwurfsmuster die Eigenschaften der Box durch aneinander gekettete Setter festgelegt werden können, z.B. box.x(..).y(..).
      Since:
      0.38.0
    • yMeter

      @Setter @ChainableMethod public Box yMeter(double yMeter)
      Setzt die y-Koordinate der linken unteren Ecke in Metern.
      Parameters:
      yMeter - Die y-Koordinate der linken unteren Ecke in Metern.
      Returns:
      Eine Referenz auf die eigene Instanz der Box, damit nach dem Erbauer/Builder-Entwurfsmuster die Eigenschaften der Box durch() aneinander gekettete Setter festgelegt werden können, z.B. box.x(..).y(..).
      Since:
      0.53.0
    • anchor

      @Setter @ChainableMethod public Box anchor(double x, double y)
      Setzt die x- und y-Koordinate der linken unteren Ecke in Pixel.
      Parameters:
      x - Die x-Koordinate der linken unteren Ecke in Pixel.
      y - Die y-Koordinate der linken unteren Ecke in Pixel.
      Returns:
      Eine Referenz auf die eigene Instanz der Box, damit nach dem Erbauer/Builder-Entwurfsmuster die Eigenschaften der Box durch aneinander gekettete Setter festgelegt werden können, z.B. box.x(..).y(..).
      Since:
      0.38.0
    • anchorMeter

      @Setter @ChainableMethod public Box anchorMeter(double x, double y)
      Setzt die x- und y-Koordinaten der linken unteren Ecke in Metern.
      Parameters:
      x - Die x-Koordinate der linken unteren Ecke in Metern.
      y - Die y-Koordinate der linken unteren Ecke in Metern.
      Returns:
      Eine Referenz auf die eigene Instanz der Box, damit nach dem Erbauer/Builder-Entwurfsmuster die Eigenschaften der Box durch() aneinander gekettete Setter festgelegt werden können, z.B. box.x(..).y(..).
      Since:
      0.53.0
    • updateValue

      protected double updateValue(double value, double newPixelPerMeter)
      Rechnet einen Wert anhand des aktuellen und eines neuen Pixel-pro-Meter-Faktors um.
      Parameters:
      value - Der Wert in der aktuellen Pixel-pro-Meter-Skalierung.
      newPixelPerMeter - Der neue Pixel-pro-Meter-Faktor.
      Returns:
      Der umgerechnete Wert für die neue Skalierung.
      Since:
      0.53.0
    • pixelPerMeter

      @Setter @ChainableMethod public Box pixelPerMeter(double pixelPerMeter)
      Setzt den Umrechnungsfaktor für die Darstellung von Metern in Pixel. Dabei werden die Abmessungen und Koordinaten der Box sowie ihrer Kinder an den neuen Faktor angepasst.
      Parameters:
      pixelPerMeter - Die Anzahl der Pixel pro Meter. Der Wert muss größer als 0 sein.
      Returns:
      Eine Referenz auf die eigene Instanz der Box, damit nach dem Erbauer/Builder-Entwurfsmuster die Eigenschaften der Box durch() aneinander gekettete Setter festgelegt werden können, z.B. box.x(..).y(..).
      Since:
      0.53.0
    • pixelPerMeter

      @Getter public double pixelPerMeter()
      Gibt den aktuellen Umrechnungsfaktor von Metern in Pixel zurück.
      Returns:
      Die Anzahl der Pixel pro Meter.
      Since:
      0.53.0
    • disabled

      @Setter @ChainableMethod public Box disabled(boolean disabled)
      Setzt den Deaktiviert-Status.
      Returns:
      Eine Referenz auf die eigene Instanz der Box, damit nach dem Erbauer/Builder-Entwurfsmuster die Eigenschaften der Box durch aneinander gekettete Setter festgelegt werden können, z.B. box.x(..).y(..).
      Since:
      0.42.0
    • disable

      @ChainableMethod public Box disable()
      Deaktiviert die Box.
      Returns:
      Eine Referenz auf die eigene Instanz der Box, damit nach dem Erbauer/Builder-Entwurfsmuster die Eigenschaften der Box durch aneinander gekettete Setter festgelegt werden können, z.B. box.x(..).y(..).
      Since:
      0.42.0
    • enable

      @ChainableMethod public Box enable()
      Aktiviert die Box.
      Returns:
      Eine Referenz auf die eigene Instanz der Box, damit nach dem Erbauer/Builder-Entwurfsmuster die Eigenschaften der Box durch aneinander gekettete Setter festgelegt werden können, z.B. box.x(..).y(..).
      Since:
      0.42.0
    • toggle

      @ChainableMethod public Box toggle()
      Schaltet zwischen dem Status deaktiviert und aktiviert hin- und her.
      Returns:
      Eine Referenz auf die eigene Instanz der Box, damit nach dem Erbauer/Builder-Entwurfsmuster die Eigenschaften der Box durch aneinander gekettete Setter festgelegt werden können, z.B. box.x(..).y(..).
      Since:
      0.42.0
    • numberOfChilds

      public abstract int numberOfChilds()
      Gibt die Anzahl an Kinder-Boxen zurück.
      Returns:
      Die Anzahl an Kinder-Boxen.
    • calculateDimension

      protected abstract void calculateDimension()
      Berechnet rekursiv die Abmessung (die Höhe und Breite) der eigenen Box.

      Single-Child-Code-Beispiel

       
       protected void calculateDimension()
       {
           width = child.width + 2 * margin;
           height = child.height + 2 * margin;
       }
        

      Multiple-Child-Code-Beispiel

       
       protected void calculateDimension()
       {
           int maxWidth = 0;
           for (Box child : childs)
           {
               if (child.width > maxWidth)
               {
                   maxWidth = child.width;
               }
               height += child.height;
           }
           width = maxWidth;
       }
        
    • measureDimension

      protected void measureDimension()
      Berechnet rekursiv die Abmessung (die Höhe und Breite) aller Kind-Boxen und dann die Abmessung eigenen Box.

      Falls das Flag measureDimensionTwice gesetzt ist, werden diese Berechnungen zweimal durchgeführt.

    • calculateAnchors

      protected abstract void calculateAnchors()
      Berechnet rekursiv alle Ankerpunkte (linkes unteres Eck) der untergeordneten Kinder-Boxen. Die inneren Blattboxen brauchen diese Methode nicht zu implementieren.

      Single-Child-Code-Beispiel

       
       protected void calculateAnchors()
       {
           child.x = x + margin;
           child.y = y + margin;
       }
        

      Multiple-Child-Code-Beispiel

       
       protected void calculateAnchors()
       {
           int yCursor = y;
           for (Box child : childs)
           {
               child.x = x;
               child.y = yCursor;
               yCursor += child.height;
           }
       }
        
      Since:
      0.38.0
    • measureAnchors

      protected void measureAnchors()
      Aktualisiert die Ankerpunkte dieser Box und ihrer untergeordneten Boxen.
    • measure

      public void measure()
      Misst alle Kind-Boxen aus.

      Bestimmt rekursiv zuerst die Abmessungen (Höhe und Breite) und anschließend die Ankerpunkte (x, y) der Kind-Boxen.

    • remeasure

      @ChainableMethod public Box remeasure()
      Setzt den Messstatus dieser Box auf „nicht gemessen“ zurück.

      Dies zwingt die Box, ihre Dimensionen bei der nächsten Messung neu zu berechnen.

      Returns:
      Eine Referenz auf die eigene Instanz der Box, damit nach dem Erbauer/Builder-Entwurfsmuster die Eigenschaften der Box durch aneinander gekettete Setter festgelegt werden können, z.B. box.x(..).y(..).
    • render

      @ChainableMethod public Box render(Graphics2D g)
      Berechnet die Abmessungen und Ankerpunkte und zeichnet die Box.
      Parameters:
      g - Das Graphics2D-Objekt, in das gezeichnet werden soll.
      Returns:
      Eine Referenz auf die eigene Instanz der Box, damit nach dem Erbauer/Builder-Entwurfsmuster die Eigenschaften der Box durch() aneinander gekettete Setter festgelegt werden können, z.B. box.x(..).y(..).
      Since:
      0.38.0
    • render

      @ChainableMethod public Box render(Graphics2D g, double pixelPerMeter)
      Berechnet die Box bei Bedarf neu und zeichnet sie mit dem angegebenen Pixel-pro-Meter-Faktor.
      Parameters:
      g - Das Graphics2D-Objekt, in das gezeichnet werden soll.
      pixelPerMeter - Die Anzahl der Pixel pro Meter.
      Returns:
      Eine Referenz auf die eigene Instanz der Box, damit nach dem Erbauer/Builder-Entwurfsmuster die Eigenschaften der Box durch() aneinander gekettete Setter festgelegt werden können, z.B. box.x(..).y(..).
      Since:
      0.53.0
    • toStringFormatter

      protected ToStringFormatter toStringFormatter()
      Gibt einen vorkonfigurierten ToStringFormatter aus.
      Since:
      0.42.0
    • debug

      @ChainableMethod public Box debug()
      Returns:
      Eine Referenz auf die eigene Instanz der Box, damit nach dem Erbauer/Builder-Entwurfsmuster die Eigenschaften der Box durch aneinander gekettete Setter festgelegt werden können, z.B. box.x(..).y(..).
      Since:
      0.42.0
    • toString

      public String toString(boolean clean)
      Bietet die Möglichkeit, die toString()-Ausgabe der Box-Objekte zu bereinigen.

      Ist die Bereinigung aktiv, so werden die ANSI-Farbcodes und die Hashcodes von der Zeichenkette entfernt. Diese Methode ist vor allem für den Einsatz in den Tests gedacht.

      Parameters:
      clean - Wenn true, dann wird die Ausgabe bereinigt.
      Returns:
      Die String-Darstellung des Objekts, entweder bereinigt oder im ursprünglichen Format.
      Since:
      0.42.0