2009-06-01 13 views
6

Welche Komponente ist in einem GridBagLayout am besten geeignet, um leeren Platz in einem Panel bereitzustellen? Im Idealfall würde Ich mag, eine Komponente verwenden, das aufweist:Leichteste Abstandskomponente in einem GridBagLayout

  1. Low Overhead
  2. Keine Nebenwirkung, wenn kein leerer Raum erforderlich ist (dh keine Mindestgröße)
  3. Eine triviale Konstruktor (keine Parameter)

Ein JPanel verstößt gegen den obigen 2. Eine Box benötigt einen Konstruktorparameter (# 3 oben), was in diesem einfachen Fall wirklich nicht notwendig ist. Ein JLabel funktioniert gut, aber ich mache mir Sorgen, dass es etwas Overhead haben könnte, obwohl es zugegebenermaßen ziemlich niedrig ist.

Eine anonyme Klasse scheint auch gut zu funktionieren (d. H. "New JComponent() {}"), aber das fügt bei jeder Verwendung eine zusätzliche .class-Datei hinzu. Ich nehme an, es ist nicht mehr Aufwand als jeder Event-Handler. Wäre es sinnvoll, eine eigene, von JComponent abgeleitete Komponente für die Implementierung zu erstellen? Gibt es eine vorhandene Komponente, die ich vermisse?

FYI GridBagLayout ist eine meiner Einschränkungen für das Team, dem ich angehöre, daher sind andere Layouts keine Option.

+0

Ich habe auch versucht eine anonyme Klasse von Komponenten abgeleitet (statt JComponent), und das scheint gut zu funktionieren. Ich mache mir ein paar Gedanken über mögliche Kompatibilitätsprobleme mit dem Einbau einer AWT-Komponente in eine Swing-GUI (z. B. fehlende Doppelpufferung), aber es scheint, als wäre es eine sehr leichte Lösung. – dcstraw

+0

Komponente sollte in Ordnung sein. Canvas würde das nicht schaffen, da es einen schwergewichtigen Peer schaffen würde, obwohl ich glaube, dass es in letzter Zeit einige Verbesserungen in diesem Bereich gegeben hat. –

Antwort

10

Sie erwähnen Box, aber es kann in einem "leichten" Mode mit den folgenden vier statischen Methoden verwendet werden, die einfach eine Komponente zurückgeben. Ich benutze diese die ganze Zeit. Sie sind in Bezug auf die Malerei unsichtbar. In Ihrem Fall sieht es so aus, als wären die Leime der richtige Weg. Ein trivialer Konstruktor (wie das ist eine schlechte Sache!), Geringer Overhead. Der Nebeneffekt, wenn kein Platz benötigt wird, hängt davon ab, wie Sie Ihre Gittertasche gestalten.

panel.add(Box.createHorizontalGlue()); 
panel.add(Box.createVerticalGlue()); 
panel.add(Box.createHorizontalStrut(int width)); 
panel.add(Box.createVerticalStrut(int width)); 

JavaDoc hier: http://java.sun.com/javase/6/docs/api/javax/swing/Box.html

+0

Ich mag diese Lösung sehr. Die Methode "createGlue()" funktioniert auch gut für meine Zwecke. Mein einziges Bedenken ist, dass es für BoxLayouts gedacht ist, aber ich werde versuchen, darüber hinwegzukommen und nicht so wählerisch zu sein. :) Danke für die Antwort! – dcstraw

+0

Keine Notwendigkeit für Skeps - aus der JavaDoc: "Box bietet mehrere Klassenmethoden, die nützlich sind für Container mit BoxLayout - auch Nicht-Box-Container." – banjollity

+0

Hinweis, das verlinkte Dokument empfiehlt die Verwendung von Streben zugunsten starrer Bereiche für feste Größen. (Neben starren Bereichen, verwenden Sie Kleber für Growable Abstandhalter und benutzerdefinierte Box.Filler für die Kontrolle über max/min/preferred Größen.) –

Verwandte Themen