JButton + GridBagLayout

hesk

Erfahrenes Mitglied
Hallo!

Ich hab 2 Fragen:

1) Ich möchte einen Button machen welcher nur ein Image enthält.
Klappt auch alles, das Problem ist nur dass er um das Image bis zum Border ziemlich viel Platz hat. Ich würde gerne den Border so eng wie mögilch um das Image haben.
Also dass der ganze Button nur das Image ist.

Wenn ich folgendes mache:
chooseDirectory.setBorderPainted( false );
chooseDirectory.setContentAreaFilled( false );

dann ist zwar nur noch das Bild da, aber es gibt keinen rollover-Effekt mehr.

Hoffe was ich will ist verständlich:)

2) Habe das GridBagLayout:
1 Combo-Box und daneben den Button.
Nur er zeigt mir die 2 Sachen immer in der Mitte(horizontal) an. Wie kann ich es machen
dass sie links oben sind?

Vielen Dank
 
1) Guck dir mal die DOC zu Component an. Dort hast du ein Feld vom Typ "Insets" , damit steuerst du den Raum der zwischen Icon und ButtonBorder bleibt.
2) Das ist eine eigenart vom GridBagLayout. Soweit ich weis kann man das nur durch ableiten und überschreiben ausgleichen, aber selbst bietet GridBagLayout da keinerlei Möglichkeit das zu ändern.
 
Habe beim Button .setMargin( new Insets(0,0,0,0) ); gemacht.
Leider ist noch immer ein Abstand zwischen Bild und Border.
Das Bild selber hab ich mir auch angesehen. Es hat rund herum nichts transparentes.
D.h. es muss noch etwas geben was den Abstand zwischen Bild und Border beeinflußt.
 
Hab nun die Option setContentAreaFilled( false ); gefunden.
Die macht genau das was ich will.

Das einzige Problem ist jetzt noch, dass kei Hover-Effekt passiert. Jemand eine Idee:)?
 
FALSCH
setContentAreaFilled(boolean) macht eben NICHT das was du willst.
Was du willst : die Insets zwischen Icon und Border reduzieren
was setConentAreaFilled(boolean) macht : den Bereich den du nicht haben willst einfach nicht zeichen

Wenn du jetzt aber mal ein Stück neben das Icon klickst bemerkst du das der Button immer noch reagiert obwohl dort eigentlich keiner zu sehen ist. Das liegt daran das der Button zwar da , aber nicht sichtbar ist.

Das es mit setMargin(Insets) nicht funktioniert war mir fast klar. Ich habe es bei einem Projekt auch mal benutzt und hatte dann trotzdem noch "den Rand" drum rum. Das liegt auch daran das setMargin(Insets) nicht unbedingt die grafische Darstellung ändert sondern viel mehr das logische Layout.

Der Grund für dieses Phänomen ist das die Größe des Buttons nach folgender *vereinfachter* Formel berechnet wird :
Größe des Inhaltes + Insets
Da du die Insets aber erst nach dieser Berechnung auf 0 setzt behält der Button seine ursprüngliche Größe. Du müsstest also nach dem Setzen der Insets die Größe des Buttons auf die Größe des Inhaltes setzen um den Button nun wirklich nur so Groß zu machen wie der Inhalt + Insets *in dem Fall 0* ergibt.

Hoffe das hilft dir.
 
Ich weiß nicht warum, aber jetzt hat es mit setMargin funktioniert

JButton chooseDirectory = new JButton();
chooseDirectory.setIcon( icon );
chooseDirectory.setMargin( new Insets(0,0,0,0));

Wegen dem zweiten Problem hab ich es jetzt so gelöst:

Zuerst ein BorderLayout. Im oberen Bereich ist ein FlowLayout, und im Rest ein GridBagLayout.

Vielen Dank für die Hilfe und Anregungen:)
 
Naja gut ... wenn du natürlich ein JPanel welches das GBC enthält über einen anderen LayoutManager eine Ebene höher anders platzierst wird auch der gesamte Inhalt anderst Dargestellt ... das ist aber eher ein work-around als standardkonform.
 
Hier nochmal der neueste Stand:

Mit Gridbaglayout kann man so gut wie alles machen.
Es hilft wenn man sich die Elemente auf ein Blatt Papier zeichnet und dann durchnummeriert.
Dann erkennt man welche Elemente ein gridwidth und welche zb ein gridheight brauchen.

Das Problem in meinem Ausgangspost könnte man so lösen:
Der ComboBox auf x=0, y=0 platzieren, weighty=1
Den Button auf x=1, y=0, weighty=1, weightx=1
Das bedeutet dass der Button den maximalen Raum in der x-Achse benutzt.
Dadurch würde die ComboBox ganz nach links gerückt.
Wenn man beiden dann noch Anchor=NW gibt, ist alles ganz links oben in der Ecke.
 
Zurück