2017-06-09 10 views
1

Ich habe den folgenden Code, um eine Anzahl von Etiketten in einem Fenster anzuzeigen:Warum erzwingt das GridBagLayout eine gewisse Höhe für meine Komponenten?

private static class Bordered extends JLabel { 
     public Bordered(final String text) { 
      super(text); 
      this.setBorder(new MatteBorder(2,2,2,2,Color.BLACK)); 
     } 
    } 

    public static void main(String[] args) { 
     Frame frame = new Frame("toto"); 

     JPanel panel = new JPanel(new GridBagLayout()); 
     panel.add(new Bordered("0"), new GridBagConstraints(0,0,1,3, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(3, 3, 3, 3), 0, 0)); 
     panel.add(new Bordered("1"), new GridBagConstraints(1,0,1,1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(3, 3, 3, 3), 0, 0)); 
     panel.add(new Bordered("2"), new GridBagConstraints(2,0,1,1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(3, 3, 3, 3), 0, 0)); 
     panel.add(new Bordered("3"), new GridBagConstraints(1,1,1,2, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(3, 3, 3, 3), 0, 0)); 
     panel.add(new Bordered("4"), new GridBagConstraints(2,1,1,2, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(3, 3, 3, 3), 0, 0)); 
     panel.add(new Bordered("5"), new GridBagConstraints(3,2,1,1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(3, 3, 3, 3), 0, 0)); 
     panel.add(new Bordered("6"), new GridBagConstraints(4,0,1,3, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(3, 3, 3, 3), 0, 0)); 
     panel.add(new Bordered("7"), new GridBagConstraints(3,0,1,1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(3, 3, 3, 3), 0, 0)); 
     panel.add(new Bordered("7bis"), new GridBagConstraints(3,1,1,1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(3, 3, 3, 3), 0, 0)); 


     frame.add(panel); 

     frame.pack(); 
     SwingUtilities.invokeLater(() -> frame.setVisible(true)); 
    } 

Wie alles funktioniert gut:

Layout

Nun, ich habe wirklich keine Verwendung für 7 und 7bis habe ich sie einfach hinzugefügt, um dir zu zeigen, was ich will. So sie können entfernen:

private static class Bordered extends JLabel { 
     public Bordered(final String text) { 
      super(text); 
      this.setBorder(new MatteBorder(2,2,2,2,Color.BLACK)); 
     } 
    } 

    public static void main(String[] args) { 
     Frame frame = new Frame("toto"); 

     JPanel panel = new JPanel(new GridBagLayout()); 
     panel.add(new Bordered("0"), new GridBagConstraints(0,0,1,3, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(3, 3, 3, 3), 0, 0)); 
     panel.add(new Bordered("1"), new GridBagConstraints(1,0,1,1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(3, 3, 3, 3), 0, 0)); 
     panel.add(new Bordered("2"), new GridBagConstraints(2,0,1,1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(3, 3, 3, 3), 0, 0)); 
     panel.add(new Bordered("3"), new GridBagConstraints(1,1,1,2, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(3, 3, 3, 3), 0, 0)); 
     panel.add(new Bordered("4"), new GridBagConstraints(2,1,1,2, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(3, 3, 3, 3), 0, 0)); 
     panel.add(new Bordered("5"), new GridBagConstraints(3,2,1,1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(3, 3, 3, 3), 0, 0)); 
     panel.add(new Bordered("6"), new GridBagConstraints(4,0,1,3, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(3, 3, 3, 3), 0, 0)); 
//  panel.add(new Bordered("7"), new GridBagConstraints(3,0,1,1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(3, 3, 3, 3), 0, 0)); 
//  panel.add(new Bordered("7bis"), new GridBagConstraints(3,1,1,1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(3, 3, 3, 3), 0, 0)); 


     frame.add(panel); 

     frame.pack(); 
     SwingUtilities.invokeLater(() -> frame.setVisible(true)); 
    } 

Jetzt bekomme ich diese Ungeheuerlichkeit:

Monstrosity

Die Höhe auf Nummer 3 und 4 werden nicht mehr berücksichtigt wird, ist alles von gleicher Höhe.

Warum passiert das? Wie kann ich das Layout erzwingen, um mir zu gehorchen :(?

+1

Setzen Sie leere JLabels in die Positionen 7 und 7bis. –

+0

@HovercraftFullOfEels Dies ist jedoch weder eine Lösung noch eine Erklärung, ich sollte keine zufälligen Artefakte in meine Komponenten einfügen müssen – Saffron

+1

Aber so funktioniert GridBagLayout.Für eine ausführlichere Erklärung, bitte suchen Sie nach den Hunderten von ähnlichen Fragen auf dieser Website jemanden kritisieren, der versucht, dir kostenlos zu helfen . –

Antwort

4

Der Vertrag von Number 5 soll 1 zu 1 und in der 3. Reihe sein. Dieser Vertrag folgt eindeutig NICHT dem Layout hier. Wie können Nummer 4 und 5 Nummer die gleiche Höhe oder sogar in der gleichen Position sein, wenn ihre y und Höhe Attribute unterschiedlich sind?

Sie haben etwas von einem Missverständnis in wie GridBagLayout arbeitet

So, Ihr Original-Layout Aussehen etwas wie das ...

Original

Zellen 1x1 (3) und 2x1 (4) sind eigentlich übergroß, ihre Höhen sind eine Summe der Höhen der Zeilen 1 und 2

Dann entfernen Sie die Zellen bei 3x0 und 3x1 und Sie haben die Erwartung von etwas wie dieses ...

Expectations

Bu t, warten, GridBagLayout ist klug, es abgeleitet, dass wegen der Reihe Spannweiten, Reihe 1 tatsächlich leer ist (hat eine kombinierte Größe 0), so dass es komprimiert die Reihe und Sie am Ende mit ...

Actual

Sie könnten denken, das ist "falsch", aber es ist nicht, und es braucht einige Zeit, um darüber nachzudenken, was tatsächlich passiert.

Die einzige Zelle, die tatsächlich hat jeder auf der Höhe der Zeile beeinflussen 1 ist Zelle 3x1, die nun technisch eine Größe von 0 hat, weil nichts da wohnt, so dass die Zeilenhöhe wird, 0 (auch die bevorzugte Höhe von die Zellen @1x1 und 1x2 sind kleiner als die Summe der beiden Reihen aus der Spanne vor, es hat eine auch)

so GridBagLayout schaut Zellen 1x1 (3) und 2x1 (4) und berechnet ihre Höhen beeinflussen als eine Summe der Zeilenhöhen 1 a nd 2, aber weil 0 plus irgendetwas ist alles, die Zeile ist "kollabiert" und GridBagLayout stützt sich auf die preferred/minimum/maximum Größe der Komponenten, um die tatsächliche Höhe zu verwenden.

Nun, ich weiß, du gehst zu beklagen, dass dies nicht sinnvoll, da die Zellen 1x1 (3) und 2x1 (4) in Reihe starten 1, und ihre Höhe sollte die Höhe der Zeile beeinflussen und alles, in gewissem Sinne tun sie, aber dann erweitern sie auch zwei Zeilen, die in der Meinung von GridBagLayout hat eine Auswirkung auf das Ergebnis, das ist, wie GridBagLayout funktioniert.

Also, was ist die Lösung? Gefällt oder nicht, wenn Sie möchten, dass das Layout NICHT komprimiert wird, müssen Sie eine Art von Komponente bei 3x2 liefern, die die gewünschte Höhe der Reihe hat. Ich weiß, es ist keine großartige Lösung und ich habe in der Vergangenheit viele verschiedene Hacks gemacht, um es zum Laufen zu bringen (mit einer JLabel, deren Vordergrundfarbe die gleiche wie die Hintergrundfarbe des Containers war, oder die eine Vordergrundfarbe hatte, die war völlig transparent.Ich habe sogar meinen eigenen Layout-Manager verwendet, der die visible -Eigenschaft der Komponente ignorierte, um zu bewirken, dass der Container die gleiche Größe hatte, sodass ich die Komponente "verstecken" und "anzeigen" konnte, ohne das Layout zu haben komprimieren)

Eine andere Lösung könnte sein, andere Layout-Manager zu untersuchen, ich empfehle MigLayout als Ausgangspunkt.

Jetzt noch einmal, bevor Sie sich darüber beschweren "nicht sinnvoll" oder "nicht richtig sein" oder "es muss Bug sein" - Denken Sie daran, das ist, wie GridBagLayout in den letzten 20 Jahren gearbeitet hat - so Es funktioniert - Sie müssen es verstehen und damit arbeiten oder eine Alternative finden - tut mir leid, aber das ist genau so :(

+1

Ich zweitens die Verwendung von 3rd-Party-Layout-Manager, wo die Layout-Anforderungen die Standard-stressing sind. Eine andere Lösung besteht darin, einen benutzerdefinierten Layout-Manager zu erstellen. 1+ –

Verwandte Themen