Warum musst du setLayout mit BoxLayout aufrufen?

8

Die meisten Layout-Manager haben keine Argument-Konstruktoren (das heißt, Sie können ein FlowLayout mit new FlowLayout () , ein GridLayout mit new GridLayout () , ein GridBagLayout mit new GridBagLayout () usw. erstellen). % Co_de% erfordert jedoch, dass Sie sowohl den zu verwaltenden Container als auch die Achse übergeben, auf der die Komponenten angeordnet werden sollen.

Meine Frage ist: Da Sie dem Layout-Manager bereits mitteilen, welche Komponente zu erstellen ist, müssen Sie

schreiben %Vor%

statt nur die erste Zeile?

Ich habe einen kurzen Blick auf den BoxLayout Quellcode geworfen Ich habe gesehen, dass der Konstruktor, den ich benutze (Zeilen 178-185), keinen Aufruf an BoxLayout oder etwas Ähnliches macht. Es scheint so, als wäre es wirklich einfach, das einfach hinzuzufügen. Gibt es einen Grund, warum es nicht in der Swing-Bibliothek enthalten ist?

Wenn es darauf ankommt, verwende ich

  

Java-Version 1.7.0

     

Java (TM) SE Laufzeitumgebung (Build 1.7.0-b147)

auf Win7Pro.

Danke!

SSCCE:

%Vor%     
wchargin 03.06.2012, 04:23
quelle

2 Antworten

5

Der Container muss existieren, bevor er an BoxLayout übergeben werden kann. Normalerweise schreibt man so etwas:

%Vor%

Es ist verlockend, die letzten beiden Zeilen zu kombinieren, aber das Prinzip der geringsten Verwunderung legt nahe, dass der Konstruktor des Layouts den Status des Containers nicht ändern sollte.

Convenienly, javax.swing.Box bietet "einen leichten Container, der verwendet ein BoxLayout -Objekt als Layout-Manager. "

%Vor%

Jetzt macht eine einzelne Zeile:

%Vor%     
trashgod 03.06.2012, 07:41
quelle
4

BoxLayout stellt sicher, dass die Layout-Methoden auf den richtigen Container angewendet werden. Es wird erzwungen, dass derselbe Container, der im Konstruktor angegeben wurde, in verschiedenen Methoden verwendet wird, z. B. layoutContainer(Container target) , preferredLayoutSize(Container target) usw. Es läuft auf die Methode checkContainer() hinaus, die die Verifizierung durchführt:

%Vor%

BoxLayout implementation speichert wahrscheinlich einige Details über den Container und versucht, den Status beizubehalten, sodass er nicht geteilt werden kann.

BEARBEITEN:

BoxLayout implementiert LayoutManager2 .invalidateLayout () , in dem die zwischengespeicherten Details zurückgesetzt werden. Andere Layout-Implementierungen folgen demselben Muster. Beispiel: GroupLayout und OverlayLayout benötigt ebenfalls Container-Argumente in ihren Konstruktoren.

    
tenorsax 03.06.2012 05:26
quelle