# Programmierung grafischer Oberflächen - Raster



## Alibistudent (22. Mrz 2011)

Hallo alle zusammen ich hab ne Hausaufgabe in Informatik aufbekommen und komme nicht ganz zurecht weil ich noch nicht soweit mit dem umgehen von AWT und Swing bin.

Die Aufgabe lautet:
Schildkröten sind nicht besonders schlau. Eine besondere Art von Schildkröten kann sich lediglich in horizontaler und vertikaler Richtung bewegen, und das auch nur innerhalb eines quadratischen Reviers der Größe *10x10*. Allerdings kann diese Schildkrötenart die Kommandos *left*,*right*,*up* und *down* befolgen. Sollte ein Kommando die Schildkröte aus ihrem Revier herausführen, so ist sie verwirrt. Sie bleibt einfach auf dem Feld stehen, auf dem sie sich befindet und wartet auf das nächste Kommando. Die Schildkröte startet ihren Weg in der linken unteren Ecke ihres Reviers. Ergänzen Sie das Java-Programm, das folgende Oberfläche erzeugt und nachstehende Funktionalität realisieren soll. Für eine Folge von Kommandos, soll die Anzahl der Besuche der Schildröte auf den Feldern des Reviers angezeigt werden. Im unten angezeigten Beispiel soll die Kommandofolge *right*, *right*, *up*, *up*, *up*, *up*, *right*, *right*, *down*, *up*, *up* die Schildkröte dazu bewegen, den folgenden Weg zu gehen und untenstehende Anzeige erzeugen.

Mein Problem ist erstmal der Aufbau von dem Ganzen. Wenn ich den hab hab ich eigentlich keine großen Probleme mit der Erzeugung der Funktion des Fensters. Ich hab ein großes Panel erzeugt mit BorderLayout. Mein erstes Problem ist wofür stehen die Zahlen in den Klammern des BorderLayouts. Hab BorderLayout in einem früheren Beispiel genutzt und ich wusste nicht was es genau bewirkt. Als nächstes dachte ich mir ich mach die Buttons hab die mit GridLayout erzeugt. Also 5 gleichgroße Buttons im Süden des Fensters(BorderSouth). Jetzt dachte ich mir ich kann doch dieses GridLayout eigtl auch auf das Raster anwenden sodass ich 100 gleichgroße Rechtecke hab(10 Zeilen, 10 Spalten) nur wusste ich nicht wie ich den Rest des Fensters für diesen Zweck in Zusammenhang mit dem BorderLayout benutze, dachte mir vllt gibt es ja einen anderen Layout-Manager mit dem das besser funktioniert?! und ich weiß auch nicht wie die Seiten der Rechtecke sichtbar werden! Naja vorab sollte ich erstmal wissen wie diese Rechtecke "imaginär" dort stehen^^ danach würde ich als Label ein Array verwenden um den einzelnen Rechtecken den Wert zu übergeben:rtfm: aber das kann noch bisschen warten. Erstmal möchte ich den Aufbau(Layout-Manager) des Fensters realisieren
Danke im voraus ihr würdet mir echt weiterhelfen:toll:

Was ich bisher hab:

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

public class Raster{
	public static void main(String[] args){
	
		//Fenster erstellen
		JFrame f = new JFrame("Schaltjahr");
		
		JPanel bigPanel = new JPanel(new BorderLayout(0,20));
		JPanel rasterPanel = new JPanel(new GridLayout(10, 10, 0, 0));//Zeilen, Spalten, Abstand Zeilen, Abstand Spalten
		JPanel btnPanel = new JPanel(new GridLayout(0, 5, 10, 0));
		//JLabel labelField[][] = new JLabel[10][10];//[Zeilen][Spalten]
		//rasterPanel.add(labelField[i][j]);
		
		JButton button1 = new JButton("up");
		JButton button2 = new JButton("down");
		JButton button3 = new JButton("left");
		JButton button4 = new JButton("right");
		JButton button5 = new JButton("clear");
		btnPanel.add(button1);
		btnPanel.add(button2);
		btnPanel.add(button3);
		btnPanel.add(button4);
		btnPanel.add(button5);
		
		bigPanel.add(btnPanel, BorderLayout.SOUTH);
		
		f.add(bigPanel);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setSize(400, 400);
		f.setVisible(true);
		
	}
}
```


----------



## L-ectron-X (23. Mrz 2011)

Alibistudent hat gesagt.:


> Mein erstes Problem ist wofür stehen die Zahlen in den Klammern des BorderLayouts.


Solche Sachen kannst du immer in der API-Doc erfahren: [japi]BorderLayout[/japi]
Schau dir dann die Beschreibung des Konstruktors an.



Alibistudent hat gesagt.:


> dachte mir vllt gibt es ja einen anderen Layout-Manager mit dem das besser funktioniert?!


Das GridLayout ist für dein Raster durchaus geeignet.



Alibistudent hat gesagt.:


> und ich weiß auch nicht wie die Seiten der Rechtecke sichtbar werden!


Das könnte man bereits durch die Angabe von Werten im Konstruktor erledigen.

```
new GridLayout(10, 10, 1, 1);
```
Dadurch werden die Zellen um jeweils einen Pixel hirizontal und vertikal auseinander gezogen.

Wenn du dann noch den Hintergrund des Panels einfärbst, werden diese Zwischenräume als Linien sichtbar.


----------



## Ironzwerg (23. Mrz 2011)

Die Werte kannst du in allen LayoutManagern verwenden, diese geben den horizontalen und den vertikalen Abstand zwischen Komponenten an.
Probier es einfach mal aus, änder einen Wert und guck dir dann die Oberfläche an.
Für dieses Beispiel, kannst du aber auch die Werte beim BorderLayout weglassen, sieht dann auch noch gut aus.

Aber wie L-ectron-X schon sagte, guck mal in die JavaDoc, da findest du super Beschreibungen.

Ein GridLayout kannst du natürlich auch verwenden, Problem dabei ist nur, dass die Zellen immer gleich groß sind, sprich ohne irgendwelche Größenänderungen vorgenommen zu haben, sieht das doof aus.
Daher würde ich beim BorderLayout bleiben.
Einfach das rasterPanel in den CENTER kloppen und schon siehts gut aus.

Nur aus Interesse:
Wieso willst du Label nehmen?
Laut dem Bild, sind das alles Buttons.
So würde ich es auch machen.
In einer entsprechenden Schleife erzeugst du dir die Button und setzt diese auf enable(false).
Dann kann man sie nicht anklicken und du siehst das Raster


----------

