# Schachbrett mit AWT erzeugen



## gehweg (10. Apr 2012)

Hallo erstmal,

ich habe mir jetzt schon sehr viel über das Programmieren mit Java hier durchgelesen, steige jedoch nicht durch mit swing, da wir in der Schule nur mit awt gearbeitet haben.
In allen bisherigen Threads usw. wird ständig nur swing verwendet bzw. mit swing und awt zusammen etwas erstellt.
Nun hier das Problem:
Ich habe als Fachreferat in Informatik das 8-Damen-Problem und möchte dazu ein Schachbrett erzeugen, hänge hier schon seit ein paar Tagen... Habe es mit Rechtecken probiert bzw. mit Panels. Aber es kann ja nicht sein dass ich 64 Panels oder Rechtecke erzeugen muss "nur" um ein Schachbrett zu erzeugen. Könntet Ihr mir hier ein wenig unter die Arme greifen? Sonst seh ich bald schwarz xD


----------



## ARadauer (10. Apr 2012)

> a nicht sein dass ich 64 Panels oder Rechtecke erzeugen muss "nur" um ein Schachbrett zu erzeugen.


32 rechtecke... ich würd die weißen einfach weiß lassen... du musst die ja auch nicht manuell machen, da machst dir einfach zwei for schleifen...


----------



## gehweg (10. Apr 2012)

Und wie verbinde ich dann das ganze?
Also dass quasi noch die Farben geändert werden und das mit der for-Schleife?
Mein Gedanke war:

```
public void paint( Graphics g )
	    {int i;
		  for( i = 0, i < 9,i=i+1)
		  {
	    g.drawRect( 50,50,50,50 ); //1
}
```
Die Position des Rechtecks weiß ich dass die nicht stimmt, wüsste aber auch nicht wie ich die dann für eine ganze Reihe machen soll.


----------



## Fu3L (10. Apr 2012)

2 for Schleifen. Die eine geht alle Zeilen durch, die andere alle Spalten. Nun kannst du unterscheiden: In jeder ungeraden Zeile, ist jedes gerade (oder ungerade) weiß, die anderen dann schwarz und umgekehrt (ich weiß nicht, wo man üblicherweise anfängt).

g.setColor(Color.BLACK); dürfte es dann tun


----------



## ARadauer (10. Apr 2012)

gehweg hat gesagt.:


> Und wie verbinde ich dann das ganze?



Die Position eines Quadrats abhängig von i? Ist das die Frage?


----------



## gehweg (10. Apr 2012)

Ok dankeschön.
Aber ich habe ja überhaupt ein Problem damit erstmal die for-Schleife mit etwas zu verbinden das etwas zeichnet bzw. weiß ich nicht mal ob ich das Schachbrett mit Panels/Labels erzeugen sollte oder mit Rechtecken, weil ich noch Damen auf die Felder setzen und überprüfen muss ob denn diese zu schlagen sind oder nicht (8-Damen-Problem eben)


----------



## ARadauer (10. Apr 2012)

Muss das zeug anklickbar sein? Ich würd das einfach zeichen... mach eine Klasse die von JComponent erbt und überschreib die paintComponent Methode... daran machst du dann deinen Swing zeichen Code


```
import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Schachbrett extends JComponent {

	
	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
hier zeichnen

	}

	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setSize(800, 800);
		frame.add(new Schachbrett());
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}

}
```

Den aktuellen Zustand deines Datenmodels würde ich da einfach zeichnen...



> erstmal die for-Schleife mit etwas zu verbinden das etwas zeichnet [/qutoe]
> ja die schleife einfach im paintComponent code verwenden und die kästchen zeichnen...


----------



## gehweg (10. Apr 2012)

Also wie schon oben beschrieben: Ich hab keine Ahnung von swing und swing verwirrt mich total ...
Und dann sprichst für mich hier in totalen Rätseln.


----------



## ARadauer (10. Apr 2012)

```
import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JComponent;
import javax.swing.JFrame;

public class Schachbrett extends JComponent {

	public static int width = 10;
	public static int numberOfRows = 400;

	public boolean turn = false;

	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		for (int i = 0; i < numberOfRows; i++) {
			for (int j = 0; j < numberOfRows; j++) {
				if (i % 2 == j % 2) {
					g.setColor(turn ? Color.white : Color.black);
				} else {
					g.setColor(turn ? Color.black : Color.white);
				}
				g.fillRect(i * width, j * width, width, width);
			}
		}
	}

	public static void main(String[] args) throws InterruptedException {
		JFrame frame = new JFrame();
		frame.setSize(1600, 1200);
		Schachbrett brett = new Schachbrett();
		frame.add(brett);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
		while (true) {
			brett.turn = !brett.turn;
			frame.repaint();
			Thread.sleep(100);
		}
	}

}
```
das verwirrt mich total -... weheee... jetzt ist mir schlecht... ich sollte eigentlich was sinnvolles arbeiten...


----------



## gehweg (10. Apr 2012)

Also Entschuldigung, aber spreche ich in Rätseln? Es tut mir ja Leid dass ich Hilfe in Anspruch nehme hierbei, aber ich wie oft soll ich noch sagen, dass ich mit import javax.swing.*; nichts anfangen kann da wir in der Schule nur mit import java.awt.*; und import java.awt.event.*; gearbeitet haben...
Nun noch einmal: Wie geht das ohne swing zu benutzen?


----------



## ARadauer (10. Apr 2012)

Was macht es für einen Unterschied ob du Swing benutzt? Alleine mit AWT kannst dus ja auch nicht. AWT ist 100 Jahre alte. Swing setzt drauf auf. Benutz einfach dein AWT Wissen mit diesen Swing teilen...


```
import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JComponent;
import javax.swing.JFrame;


public class Schachbrett extends JComponent {

	public static int width = 75;
	public static int numberOfRows = 8;

	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		for (int i = 0; i < numberOfRows; i++) {
			for (int j = 0; j < numberOfRows; j++) {
				if (i % 2 == j % 2) {
					g.setColor(Color.white);
				} else {
					g.setColor(Color.black);
				}
				g.fillRect(i * width, j * width, width, width);
			}
		}
	}

	public static void main(String[] args) throws InterruptedException {
		JFrame frame = new JFrame();
		frame.setSize(800, 600);
		Schachbrett brett = new Schachbrett();
		frame.add(brett);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}

}
```



> Nun noch einmal: Wie geht das ohne swing zu benutzen?


Ganze ehrlich: keine ahnung :-(


----------



## andre111 (10. Apr 2012)

Galileo Computing :: Java ist auch eine Insel - 14 Einführung in grafische Oberflächen
Hier sollte eigentlich alles notwendige zum Verständnis stehen (eventuell noch die Unterkapitel davor, wenn Swing komplett unklar ist).


----------



## freak_007 (10. Apr 2012)

Hier pures AWT:

```
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Component;
import java.awt.Frame;
 
 
public class Schachbrett extends Component {
 
    public static int width = 75;
    public static int numberOfRows = 8;
 
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        for (int i = 0; i < numberOfRows; i++) {
            for (int j = 0; j < numberOfRows; j++) {
                if (i % 2 == j % 2) {
                    g.setColor(Color.white);
                } else {
                    g.setColor(Color.black);
                }
                g.fillRect(i * width, j * width, width, width);
            }
        }
    }
 
    public static void main(String[] args) throws InterruptedException {
        Frame frame = new Frame();
        frame.setSize(800, 600);
        Schachbrett brett = new Schachbrett();
        frame.add(brett);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
 
}
```
[WR]ungetestet[/WR]


----------



## ARadauer (10. Apr 2012)

mhn so einfach is es auch nicht Component hat die paintComponent Methode nicht..


----------



## gehweg (10. Apr 2012)

Okai, danke trotzdem^^. Muss dann hal wohl in swing das ganze machen...
Wie kann ich nun quasi auf eine Fläche (grau/weiss) etwas "draufkleben"?? bzw. auf eine bestimmte Position das ganze machen und abrufen ob dort schon etwas ist?


----------



## Fu3L (10. Apr 2012)

> Wie kann ich nun quasi auf eine Fläche (grau/weiss) etwas "draufkleben"?? bzw. auf eine bestimmte Position das ganze machen und abrufen ob dort schon etwas ist?



Du musst nicht nachgucken, ob irgendwo schon etwas gemalt ist. Du musst ein "Datenmodell" haben, wo du die Positionen abspeicherst. Datenmodell klingt groß, kann aber einfach ein Array sein^^
Und "draufkleben" geht einfach indem du in der paintComponent() Methode dein Datenmodell "durchläufst" (nach dem Zeichnen des Hintergrundes) und dann halt Positionen richtig berechnen. Ansonsten malt man zB Kreise für Figuren wie die Hintergrundrechtecke nur halt mit fillOval 

PS: AWT und SWING sind fast gleich zu benutzen^^ Stell dich nicht so an *nettgemeint*


----------



## freak_007 (11. Apr 2012)

Sorry, hier gehört nur paint:

```
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Component;
import java.awt.Frame;
 
 
public class Schachbrett extends Component {
 
    public static int width = 75;
    public static int numberOfRows = 8;
 
    @Override
    protected void paint(Graphics g) {
        super.paintComponent(g);
        for (int i = 0; i < numberOfRows; i++) {
            for (int j = 0; j < numberOfRows; j++) {
                if (i % 2 == j % 2) {
                    g.setColor(Color.white);
                } else {
                    g.setColor(Color.black);
                }
                g.fillRect(i * width, j * width, width, width);
            }
        }
    }
 
    public static void main(String[] args) throws InterruptedException {
        Frame frame = new Frame();
        frame.setSize(800, 600);
        Schachbrett brett = new Schachbrett();
        frame.add(brett);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
 
}
```
[WR]ungetestet[/WR][/QUOTE]


----------

