DragLayout: Unterschied zwischen den Versionen

Aus Byte-Welt Wiki
Zur Navigation springenZur Suche springen
K
K
 
(10 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
 +
[[NullLayout]] is evil. Sieht man sich aber in der Situation, an dem man Komponenten hat, die sich wirklich kreuz und quer bewegen sollen, kann man schon versucht sein, den LayoutManager eben mal auf null zu setzen.
 +
 +
Das dumme daran ist aber, die Größe des "genullten" Containers muss jetzt entweder auf einen fixen Wert gesetzt oder laufend neu berechnet werden. Aus dem Grund habe ich das DragLayout geschrieben.
 +
 
Das DragLayout zielt darauf ab, verschiebbare Komponenten in einem {{JAPI|JScrollpane}} zu haben. Schiebt man eine Komponente über den Rand, vergrößert sich automatisch der Container und die Scrollbalken erscheinen.
 
Das DragLayout zielt darauf ab, verschiebbare Komponenten in einem {{JAPI|JScrollpane}} zu haben. Schiebt man eine Komponente über den Rand, vergrößert sich automatisch der Container und die Scrollbalken erscheinen.
  
 
Dabei spielt sich alles in 3 Methoden ab:
 
Dabei spielt sich alles in 3 Methoden ab:
  
<code=java>
+
<syntaxhighlight lang="java">
 
     //geht alle Komponenten durch und findet die Extreme in allen Richtungen heraus, berechnet daraus dann die erforderliche Größe
 
     //geht alle Komponenten durch und findet die Extreme in allen Richtungen heraus, berechnet daraus dann die erforderliche Größe
 
     @Override
 
     @Override
Zeile 32: Zeile 36:
 
         return new Dimension(right+(left*-1),bot+(top*-1));
 
         return new Dimension(right+(left*-1),bot+(top*-1));
 
     }
 
     }
</code=java>
+
</syntaxhighlight>
  
<code=java>
+
<syntaxhighlight lang="java">
 
     //Falls Komponenten über den Rand nach oben/links geschoben werden, werden deren Koordinaten negativ.
 
     //Falls Komponenten über den Rand nach oben/links geschoben werden, werden deren Koordinaten negativ.
 
     //Nachdem der Container dann erweitert wurde und diese Komponenten voll zu erfassen ist es notwendig alle Komponenten nach unten rechts zu verschieben
 
     //Nachdem der Container dann erweitert wurde und diese Komponenten voll zu erfassen ist es notwendig alle Komponenten nach unten rechts zu verschieben
Zeile 53: Zeile 57:
 
         }
 
         }
 
     }
 
     }
</code=java>
+
</syntaxhighlight>
  
<code=java>
+
<syntaxhighlight lang="java">
 
     //Bewegt alle Komponenten
 
     //Bewegt alle Komponenten
 
     private void moveAllBy(int dx,int dy,Component[] components)
 
     private void moveAllBy(int dx,int dy,Component[] components)
Zeile 66: Zeile 70:
 
         }
 
         }
 
     }
 
     }
</code=java>
+
</syntaxhighlight>
 +
 
 +
Das DragLayout verhält sich genau wie das NullLayout, man muss alle Komponenten von Hand ihre Position und Größe zuweisen. Es hat allerdings den Vorteil, dass es automatisch die preferredSize des Containers ausrechnet und dadurch die Verwendung in Kombination mit {{JAPI|JScrollPane}}s und anderen LayoutManagern ermöglicht.
  
Download eines vollständigen Beispiels: [url="http://forum.byte-welt.net/attachment.php?attachmentid=1369&d=1398530518"]DragLayout.jar[/url]
+
Download eines vollständigen Beispiels: [[Datei:DragLayout.zip]]
  
[[Kategorie:Java]]
+
[[Kategorie:LayoutManager]]
 
[[Kategorie:Swing]]
 
[[Kategorie:Swing]]
  
 
--[[Benutzer:bERt0r|bERt0r]] (26.04.2014 23:57 Uhr)
 
--[[Benutzer:bERt0r|bERt0r]] (26.04.2014 23:57 Uhr)

Aktuelle Version vom 2. April 2018, 16:02 Uhr

NullLayout is evil. Sieht man sich aber in der Situation, an dem man Komponenten hat, die sich wirklich kreuz und quer bewegen sollen, kann man schon versucht sein, den LayoutManager eben mal auf null zu setzen.

Das dumme daran ist aber, die Größe des "genullten" Containers muss jetzt entweder auf einen fixen Wert gesetzt oder laufend neu berechnet werden. Aus dem Grund habe ich das DragLayout geschrieben.

Das DragLayout zielt darauf ab, verschiebbare Komponenten in einem JScrollpane zu haben. Schiebt man eine Komponente über den Rand, vergrößert sich automatisch der Container und die Scrollbalken erscheinen.

Dabei spielt sich alles in 3 Methoden ab:

    //geht alle Komponenten durch und findet die Extreme in allen Richtungen heraus, berechnet daraus dann die erforderliche Größe
    @Override
    public Dimension preferredLayoutSize(Container parent)
    {
        int top = 0,bot = 0,left = 0,right = 0;
        for(Component c:parent.getComponents())
        {
            Rectangle r=c.getBounds();
            if(r.x<left)
            {
                left=r.x;
            }
            else if(r.x+r.width>right)
            {
                right=r.x+r.width;
            }
            if(r.y<top)
            {
                top=r.y;
            }
            else if(r.y+r.height>bot)
            {
                bot=r.y+r.height;
            }
        }
       
        return new Dimension(right+(left*-1),bot+(top*-1));
    }
    //Falls Komponenten über den Rand nach oben/links geschoben werden, werden deren Koordinaten negativ.
    //Nachdem der Container dann erweitert wurde und diese Komponenten voll zu erfassen ist es notwendig alle Komponenten nach unten rechts zu verschieben
    @Override
    public void layoutContainer(Container parent)
    {
        for(Component c:parent.getComponents())
        {
            Point location=c.getLocation();
            if(location.x<0)
            {
                moveAllBy((location.x*-1),0,parent.getComponents());
            }
            if(location.y<0)
            {
                moveAllBy(0,(location.y*-1),parent.getComponents());
            }
        }
    }
    //Bewegt alle Komponenten
    private void moveAllBy(int dx,int dy,Component[] components)
    {
        for(Component c:components)
        {
            Point location=c.getLocation();
            location.translate(dx,dy);
            c.setLocation(location);
        }
    }

Das DragLayout verhält sich genau wie das NullLayout, man muss alle Komponenten von Hand ihre Position und Größe zuweisen. Es hat allerdings den Vorteil, dass es automatisch die preferredSize des Containers ausrechnet und dadurch die Verwendung in Kombination mit JScrollPanes und anderen LayoutManagern ermöglicht.

Download eines vollständigen Beispiels: Datei:DragLayout.zip

--bERt0r (26.04.2014 23:57 Uhr)