2010-01-21 18 views
5

Wenn Sie einzelne Komponenten eines von GridBagLayout verwalteten Layouts unsichtbar machen, ändert sich die Anordnung der übrigen Komponenten im Layout. Das GridBagLayout scheint Zellen mit unsichtbaren Komponenten zu "verfallen", wodurch andere Komponenten Positionen ändern. Das ist ein sehr nerviges Verhalten, und ich habe nach einem Weg gesucht, das davon abzuhalten.GridBagLayout: So verhindern Sie, dass unsichtbare Komponenten kollabieren

Eine Methode, die ich ausprobiert habe, ist das Hinzufügen eines Abstandshalters zur gleichen Zelle, mit einer festen Größe gleich der bevorzugten Größe der Komponente, die versteckt werden kann, aber wenn diese bevorzugte Größe jemals geändert würde, wäre es eine Menge Probleme, um den Spacer synchron zu halten. Gibt es einen besseren Weg?

Eigentlich wäre es nicht so schlimm, wenn das GridBagLayout Zellen mit unsichtbaren Komponenten wirklich vollständig ignorieren würde, aber es berücksichtigt immer noch die Zelleneinschübe, also wenn Sie ein Layout von Eingabefeldern haben und die Einfügungen sauber verwenden ordnen Sie sie mit regelmäßigen Abständen dazwischen an, dann versteckt man eine Komponente in der Mitte, entfernt sie aus dem Layout, verlässt aber die Lücke, was normalerweise bedeutet, dass die umgebenden Komponenten zusammenfließen, aber mit einer hässlichen, doppelt breiten Lücke zwischen ihnen ...

+1

Ah gut alt Gridbaglayout mit seinen Einschränkungen, wie ich dich nicht vermisse (aber ich werde diesen Thread trotzdem folgen;) – Anders

+0

Ich kenne das GridBagLayout seit Jahren, und manchmal kann ich auch viel Zeit damit verbringen, nach was zu suchen das Kollapsverhalten. Versuchen Sie, eine große Komponente hinzuzufügen, z. B. eine Beschriftung mit viel Text. Ändern Sie die Größe Ihres GridBagLayout-Containers auf eine Breite, die kleiner als die bevorzugte Größe des Labels ist ... Das ist so seltsam – Timmos

Antwort

1

Eine Möglichkeit wäre, verschachtelte Panels mit einer CardLayout zu verwenden, um Komponenten zu verbergen, anstatt sie auf unsichtbar zu setzen. Ein CardLayout bewirkt, dass das Panel immer die Größe der größten "Karte" hat.

Alternativ können Sie versuchen, die neue (ab Java 6) GroupLayout anstelle der GridBagLayout - es ist IMO viel einfacher zu verwenden und fast so mächtig.

+0

Ich hatte keine Gelegenheit, GroupLayout auszuprobieren - es sieht interessant aus, aber unglücklicherweise wird die Java 1.5-Kompatibilität im Projekt durchgesetzt (Ich meine, wie können Sie erwarten, dass die Benutzer ihre Umgebungen auf einen Stand der Technik aktualisieren müssen, der WENIGER ALS 4 JAHRE alt ist ?!) –

1

Verwenden MigLayout

die Freude in Layouten ^^ zurück zu bringen.

Ich habe auch GridBagLayout in der Vergangenheit verwendet, und es ist schrecklich. Es gibt viele Codebeispiele, und wenn Sie eine kleine Komponente hinzufügen, wird das Layout höchstwahrscheinlich verschraubt.

Eine weitere Alternative ist mit Boxlayout

+0

Code von Drittanbietern ist leider aus verschiedenen Gründen keine Option, und BoxLayout tut das auch scheint nicht in der Lage zu sein, die (ziemlich komplexen) erforderlichen Anordnungen von UI-Elementen zu erstellen ... –

8

Was JPanel (oder Box) als Platzhalter?
Setzen Sie ein JPanel in jede Zelle und fügen Sie die Komponenten den Panels hinzu. Wenn Sie die Komponente unsichtbar machen, sollte das Panel immer noch da sein ...

+4

Nicht sicher, warum dies keine Upvotes hatte, es war genau das, was ich brauchte. Nur eine Sache: Sie wollen "ContainerPanel" machen.setLayout (new GridLayout (1, 1)); 'oder etwas Ähnliches, sonst wird das Standard-BorderLayout in einigen Abständen hinzugefügt und alle Ihre Komponenten um ein paar Pixel aus. –

+0

Getestet, und das ist eine große Problemumgehung für das schreckliche Einsturzverhalten. – Timmos

0

IIRC, was ich in der Vergangenheit getan habe, ist die Komponente in einen Container (oder eine separate Komponente), die die Größe des Originals nachahmt Komponente, aber nicht, ob es sich um den versteckten Zustand handelt. Passen Sie dies in einer Methode oder einer Fassade an Gitterbeutel an, und Ihr Layout-Code kann schön und sauber bleiben.

+0

Das ist die Methode, die ich verwendet habe (Erstellen von Struts über die von "Box" angebotenen Methoden), aber es ist ungeschickt und fehleranfällig. –

Verwandte Themen