# Abstände im GridLayout ändern



## Karuka (13. Apr 2012)

Hallo Leute!

Ich versuche mithilfe des GridLayouts eine durchgängige grafische Oberfläche zu erzeugen. Es zeigt sich jedoch ein Problem auf. Dieses Problem tritt jedoch nur bei Grafiken auf, bei z.B. Buttons hingegen nicht.

Mein Problem ist, dass ich zwar alle Zellen im Layout mit Grafiken zu füllen kann jedoch liegen diese nicht "eng" aneinander so das sie aneinander anschließen. Das einzige Ergebnis was ich erziehle ist, das ich Abstände zwischen den einzelnen Bilder habe. 

Dementsprechend meine Frage, gibt es einen Weg diese Abstände zu verändern so das ich diese Abstände loswerde oder gibts es sogar eine bessere Methode für mein Vorhaben?


hier der Screen von meinen Problem







auf wunsch füge ich noch meinen Quellcode ein, falls dieser benötigt wird.


----------



## bERt0r (13. Apr 2012)

Diese Abstände sind hgap und vgap: GridLayout (Java Platform SE 7)


----------



## Karuka (13. Apr 2012)

Ich habe mit vgab und hgab rumprobiert aber mein Problem scheint es nicht zu lösen.
Wenn ich vgab und hgab verwende, reduziert es mir zwar die Abstände aber verkleinert auch die Grafiken und/oder verzieht diese, sprich aus meinen Quadraten werden Rechtecke...

Hier der Auszug des Quellcodes in dem ich hgab und vgab verwende
(Konstruktor meiner Klasse Layout).


```
public Layout() {
       int zeile=10;
       int spalte=10;
       int hgab=-18;
       int vgab=-18;
       setLayout(new GridLayout(zeile,spalte,hgab,vgab));
     }
```

Ich denke mir mal, das es richtig ist, dass ich negative Zahlen als Werte für hgab und vgab verwende. Ohne diese werte oder 0 als Wert bekomme ich das Ergebnis was ich oben schon als Screenshot gepostet habe.


----------



## bERt0r (13. Apr 2012)

Lies dir doch bitte die Javadoc durch und verwende nicht einfach irgenwelche Parameter. Wenn du keinen Abstand zwischen den Komponenten haben willst, verwendest du entweder gaps von 0 (Gap = Spalt) oder du nimmst gleich den einfacheren Konstruktor, wo du nur rows und columns angeben musst.
Der Konstruktor funktioniert so: (anzahlDerZeilen, anzahlDerSpalten, abstandZwischenSpalten, abstandZwischenZeilen)


----------



## L-ectron-X (13. Apr 2012)

Oder mal in die FAQ gucken: http://www.java-forum.org/bilder-gui-damit-zusammenhaengt/118231-gridlayout.html


----------



## Karuka (13. Apr 2012)

Ich hab mir sowohl das Javadoc als auch das FAQ zum GridLayout durchgelesen und finde immernoch keine Lösung...
Entweder reden wir hier grade alle anneinander vorbei.. oder ich versteh was falsch und bekomms einfach nicht auf die Reihe.. Dementsprechend rolle ich lieber das ganze Problem erneut auf und diesesmal so detailiert wie nur irgendwie möglich.

Mein Programm:

```
import java.awt.*;
 import javax.swing.*;

 public class Layout extends JFrame {
  static int zeile=5, spalte=5;
  static int az = (zeile*spalte);                  // Anzahl Panel/Label
 
     public Layout() {
       int hgap=0;
       int vgap=0;
       setLayout(new GridLayout(zeile,spalte,hgap,vgap));
     }
          
     public static void main(String[] args){
       Layout derp = new Layout();
       JPanel[] panel = new JPanel[az];
       JLabel[] grafik = new JLabel[az];
     
       ImageIcon bild2 = new ImageIcon("texturen/wandfeld.png");

       for(int i=0; i<az; i++){
         panel[i] = new JPanel(); 
         grafik[i] = new JLabel(bild2); 
         panel[i].add(grafik[i]);                   // Grafiken im Panel einfügen
         derp.add(panel[i]);                       // Panel im Layout einfügen
       }

       derp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       derp.setVisible(true);
       derp.pack();
       derp.setTitle("Fenster");
     }
 }
```

Der Screen wie das ganze aussieht:




Wie man sieht enstehen Spalten zwischen den einzelnen Grafiken, genauso wie auf den Screen in meinem ersten Post. Dieses Ergebnis bekomme ich wenn ich hgap/vgap auf 0 setze oder ganz aus dem Quellcode streiche.

Wenn ich hgap/vgap auf einen wert gößer 0 setze, zB 5 vergößern sich die Abstände (werd ich ja wohl nicht als screen einfügen müssen, da gibts auch keine Probleme).
Jedoch will ich ja die Abstände verringern auf eine größe das diese nichtmehr sichtbar vorhanden sind. Dementsprechend dachte ich mir einfach:"Hey, ich könnte negative Werte als Abstände nehmen und so die einzelnen Bilder aneinander rücken". Gesagt getan hgap/vgap auf einen negativen wert gesetzt(im screen bsp -15) und folgendes Ergebnis erzielt:





bei:

```
public Layout() {
       int hgap=-15;
       int vgap=-15;
       setLayout(new GridLayout(zeile,spalte,hgap,vgap));
     }
```

Wie man sehen kann, werden aus den Quadraten in der obersten Zeile und der äüßeren linken Spalte zu Rechtecken und die restlichen Quadrate werdern deutlich kleiner, wobei dies auch die Rechtecke betrifft und nur das erste Quadrat in der linken oberen Ecke unverändert zu bleiben scheint.
Jedenfalls werden auch die Abstände kleiner... dementsprechend kann ich wohl nicht ganz falsch liegen mit meiner Theorie, dass ich negative werte vlt. dafür verwenden sollte...

Ich habe alle hilfen durchgelesen die mir bisher vorgeschlagen wurden und entweder habe ich etwas falsch verstanden oder übersehe einfach irgendetwas entscheidendes.
Jedenfalls hoffe ich das mit dieser genaueren Schilderung eine Lösung für mein Problem gefunden werden kann.


----------



## L-ectron-X (13. Apr 2012)

Das Problem liegt in den festen Dimensionen der Grafikdatei.
Das GridLayout passt die Dimensionen von Komponenten automatisch an, aber nicht die von Grafiken.
Sobald du das Fenster größer ziehst, werden die Abstände größer.
Du wirst da einen anderen Weg finden müssen.


```
import java.awt.*;
import javax.swing.*;

public class Squares extends JPanel {
   public Squares() {
      super(new GridLayout(0, 8, 1, 1));
      setPreferredSize(new Dimension(500, 500));
      for(int i = 0; i < 64; i++) {
         JLabel label = new JLabel();
         label.setBackground(Color.BLUE);
         label.setOpaque(true);
         add(label);
      }
   }
   
   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            JFrame frame = new JFrame("Quadrate");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(new Squares());
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
         }
      });
   }
}
```


----------



## Camill (13. Apr 2012)

Das ganze ist auch zu sehen wenn man den JPanel's eine Hintergrundfarbe gibt - diese liegen dann nämlich aneinander.
Wenn man den Inhalt der for-Schleife jedoch in einem "Rutsch" macht scheint es wie gewünscht auszusehen(zumindestens bei mir). Also so:

```
derp.add(new JPanel().add(new JLabel(bild2)));
```

[EDIT]Habe mal ein wenig rum probiert, scheint wohl am FlowLayout des Panel's zu liegen. Ändert man diesen zb. auf ein Border- oder GridLayout füllen die Bilder diesen aus.[/EDIT]


----------



## Karuka (14. Apr 2012)

Ich hab es mal mit deinem Vorschlag versucht Camill, dass ich alles in einen "Rutsch" mache, scheint auch zu funktionieren aber ich davon abgelassen einfach aus dem Grund das ich es nicht ganz zum laufen bekommen habe wie ich es wollte. 
Ich wollte nämlich noch einbringen, dass wenn i zB den Wert 5 hat ein anderes Bild einsetzt. Es hat ein kleines bisschen rumgebuged (inform dessen, dass es einfach in mehrere Panel ein anderes Bild eingesetzt hat).
Jedenfalls hab ich mich dazu entschieden einfach die Panel noch in der Farbe des Bildes umzufärben um optisch mein gewünschtes Ziel zu erreichen. Danke für all die Hilfe 

Mein Ergebnis(nur die main):

```
public static void main(String[] args){
       int r,gr,b;
       Layout derp = new Layout();      
       JPanel[] panel = new JPanel[az];
       JLabel[] grafik = new JLabel[az];
       Color c = new Color(r=62,gr=35,b=229);         
                                                   
       ImageIcon bild1 = new ImageIcon("texturen/gehfeld.png");
       ImageIcon bild2 = new ImageIcon("texturen/wandfeld.png");

       for(int i=0; i<az; i++){
         panel[i] = new JPanel();                  // einzelne Felder i im Array zuweisen
         grafik[i] = new JLabel(bild2);            // Grafiken JLabel übergeben und dem Objekt Array zuweisen
         panel[i].setBackground(c);                // Abstände einfärben
          if(i==45){
          grafik[i] = new JLabel(bild1);
          panel[i].setBackground(Color.white);
         }

         panel[i].add(grafik[i]);                   // Grafiken im Panel einfügen
         derp.add(panel[i]);                        // Panel im Layout einfügen
       }
```


----------

