tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
7
ZUGRIFFE
356
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    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
     

  2. #2
    SE Tutorials.de Gastzugang
    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.
     

  3. #3
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    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.
     

  4. #4
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    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?
     

  5. #5
    SE Tutorials.de Gastzugang
    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.
     

  6. #6
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    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
     

  7. #7
    SE Tutorials.de Gastzugang
    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.
     

  8. #8
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    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.
     

Ähnliche Themen

  1. GridBagLayout
    Von ElJarno im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 0
    Letzter Beitrag: 15.06.10, 10:26
  2. GridBagLayout
    Von FrankBooth im Forum Java Grundlagen
    Antworten: 1
    Letzter Beitrag: 07.12.09, 14:53
  3. GridBagLayout
    Von MScalli im Forum Java
    Antworten: 3
    Letzter Beitrag: 15.02.08, 10:15
  4. GridBagLayout
    Von MariusMeier im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 1
    Letzter Beitrag: 22.01.08, 10:48
  5. GridBagLayout
    Von soa im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 1
    Letzter Beitrag: 09.08.07, 19:30