Dame Spiel Programmieren mit Java

auto3

Grünschnabel
Hallo alle zusammen.

Ich habe einige Probleme mit meinem Quellcode da kommt immer eine Fehlermeldung die für mich unklar ist.
Nun möchte ich hier euch um Hilfe bitten. Ich muss von der Schule aus ein Dame Spiel programmieren, das von der menu das Spiel starten kann und
das ich wie z.B. von Menü aus noch beenden kan usw.

Fehlermeldung:

Compiliere C:\Dokumente und Einstellungen\manwel\Eigene Dateien\- Programming -\-- Dame --\MenuDame.java mit Java-Compiler
MenuDame.java:157:22: non-static variable this cannot be referenced from a static context
MenuDame frame = new MakeFrame();
^
1 error

Meine Quellcode:

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class MenuDame {

public class MakeFrame extends Frame{

public MakeFrame(){
setTitle("Dame Spiel");
addWindowListener(new TestWindowListener());

add(new DrawingPanel());

setSize(450,500);
setVisible(true);
}

public class DrawingPanel extends Panel{
public void paint(Graphics g){

for(int i=1; i<=8; i++){ // i entspricht y-Koordinate
for(int j=1; j<=8; j++){ // j entspricht x-Koordinate

// erste zeile beginnend mit weiß
if(i%2==1 & j%2==1){
g.setColor(Color.GRAY);
g.drawRect(40+(j-1)*40, 40+(i-1)*40, 40, 40);

}

if(i%2==1 & j%2==0){
g.fillRect(40+(j-1)*40, 40+(i-1)*40, 40, 40);

}

// zweite zeile beginnend mit schwarz
if(i%2==0 & j%2==1){
g.fillRect(40+(j-1)*40, 40+(i-1)*40, 40, 40);

}

if(i%2==0 & j%2==0){
g.drawRect(40+(j-1)*40, 40+(i-1)*40, 40, 40);

}

}
}

// Fiegur zeichnen von oben
for(int i=1; i<=3; i++){
for(int j=1; j<=8; j++){
// erste zeile beginnend mit weiß
if(i%2==1 & j%2==0){
g.setColor(Color.WHITE);
g.drawOval(j*40, 40+(i-1)*40, 40, 40);

}

// zweite zeile beginnend mit schwarz
if(i%2==0 & j%2==1){
g.drawOval(40+(j-1)*40, 40+(i-1)*40, 40, 40);

}

}
}

// Fiegur zeichnen von unten
for(int i=8; i>=6; i--){
for(int j=8; j>=1; j--){
// erste zeile beginnend mit weiß
if(i%2==0 & j%2==1){
g.setColor(Color.BLACK);
g.drawOval((j*40), i*40, 40, 40);

}

// zweite zeile beginnend mit schwarz
if(i%2==1 & j%2==0){
g.drawOval(j*40, i*40, 40, 40);

}

}
}
}
}

}


public MenuDame () {
Frame f = new Frame ("Damen Spiel");
f.addWindowListener(new TestWindowListener());

f.setMenuBar(this.getMenubar ());
f.setSize(450,500);
f.setVisible(true);
}

protected MenuBar getMenubar(){
// Menüleiste anlegen
MenuBar menueLeiste = new MenuBar();

// Ein Menü anlegen ------------------------------------------------------
Menu datei = new Menu("Datei");
Menu bearb = new Menu("Bearbeiten");
Menu extra = new Menu ("Extras");
Menu help = new Menu("Hilfe");
Menu stuffe = new Menu("Stuffe");
Menu einst = new Menu("Einstellungen...");

// Einen Menüeintrag anlegen
MenuItem oeffnen = new MenuItem("Neu");

// Den Eintrag dem Menü hinzufügen
datei.add (oeffnen);
datei.add("leeres Brett");
datei.addSeparator();
datei.add("Beenden");
bearb.add("Rückgängig");
bearb.add("Wiederrufen");
help.add("Version");
help.add("Info");

//...das Menü dem Extramenü als Untermenü hinzufügen
extra.add(stuffe);
extra.add(einst);

// Das Untermenü mit Einträgen füllen
stuffe.add("Anfaenger");
stuffe.add("Fortgeschritten");
stuffe.addSeparator();
stuffe.add("Profi");
einst.add("Figur");
einst.add("Farbe");

// Das Extramenü der Leiste hinzufügen
menueLeiste.add(datei);
menueLeiste.add(bearb);
menueLeiste.add(extra);
menueLeiste.add(help);
return menueLeiste;
}

public class TestWindowListener extends WindowAdapter{ // windowsfenster min, max oder schießen
public void windowClosing(WindowEvent e){
e.getWindow().dispose();
System.exit(0);
}
}

public static void main (String[] args) {
MenuDame menusample = new MenuDame();
MenuDame frame = new MakeFrame();
}
}


Für eine schnelle Hilfe wäre ich sehr dankbar.

Mit freundlichen Grüßen.......
 
Hallo,

Erstmal Wilkommen im Forum!
Allerdings solltest du deinen Code in [Code][/Code] oder besser in [code=java][/code] - Tags fassen damit man ihn auch noch lesen kann.

Gruß
Erik
 
Zuletzt bearbeitet von einem Moderator:
Auf eine Instanzvariable kann von einer Klassenmethode nicht zugegriffen werden. Die Fehlermeldung sollte doch eindeutig sein.
 
Die Fehlermeldung passt nicht zum code.
Code:
MenuDame frame = new MakeFrame();
Das müsste "Type mismatch: cannot convert from MenuDame.MakeFrame to MenuDame" gewesen sein.

kompilierbare Version zum copypasten:
Code:
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.Panel;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class MenuDame {

	class MakeFrame extends Frame {

		public MakeFrame() {
			setTitle("Dame Spiel");
			addWindowListener(new TestWindowListener());

			add(new DrawingPanel());

			setSize(450, 500);
			setVisible(true);
		}

		class DrawingPanel extends Panel {
			public void paint(Graphics g) {

				for (int i = 1; i <= 8; i++) { // i entspricht y-Koordinate
					for (int j = 1; j <= 8; j++) { // j entspricht x-Koordinate

						// erste zeile beginnend mit weiß
						if (i % 2 == 1 & j % 2 == 1) {
							g.setColor(Color.GRAY);
							g.drawRect(40 + (j - 1) * 40, 40 + (i - 1) * 40, 40, 40);

						}

						if (i % 2 == 1 & j % 2 == 0) {
							g.fillRect(40 + (j - 1) * 40, 40 + (i - 1) * 40, 40, 40);

						}

						// zweite zeile beginnend mit schwarz
						if (i % 2 == 0 & j % 2 == 1) {
							g.fillRect(40 + (j - 1) * 40, 40 + (i - 1) * 40, 40, 40);

						}

						if (i % 2 == 0 & j % 2 == 0) {
							g.drawRect(40 + (j - 1) * 40, 40 + (i - 1) * 40, 40, 40);

						}

					}
				}

				// Fiegur zeichnen von oben
				for (int i = 1; i <= 3; i++) {
					for (int j = 1; j <= 8; j++) {
						// erste zeile beginnend mit weiß
						if (i % 2 == 1 & j % 2 == 0) {
							g.setColor(Color.WHITE);
							g.drawOval(j * 40, 40 + (i - 1) * 40, 40, 40);

						}

						// zweite zeile beginnend mit schwarz
						if (i % 2 == 0 & j % 2 == 1) {
							g.drawOval(40 + (j - 1) * 40, 40 + (i - 1) * 40, 40, 40);

						}

					}
				}

				// Fiegur zeichnen von unten
				for (int i = 8; i >= 6; i--) {
					for (int j = 8; j >= 1; j--) {
						// erste zeile beginnend mit weiß
						if (i % 2 == 0 & j % 2 == 1) {
							g.setColor(Color.BLACK);
							g.drawOval((j * 40), i * 40, 40, 40);

						}

						// zweite zeile beginnend mit schwarz
						if (i % 2 == 1 & j % 2 == 0) {
							g.drawOval(j * 40, i * 40, 40, 40);

						}

					}
				}
			}
		}

	}

	public MenuDame() {
		Frame f = new Frame("Damen Spiel");
		f.addWindowListener(new TestWindowListener());

		f.setMenuBar(this.getMenubar());
		f.setSize(450, 500);
		f.setVisible(true);
	}

	protected MenuBar getMenubar() {
		// Menüleiste anlegen
		MenuBar menueLeiste = new MenuBar();

		// Ein Menü anlegen
		// ------------------------------------------------------
		Menu datei = new Menu("Datei");
		Menu bearb = new Menu("Bearbeiten");
		Menu extra = new Menu("Extras");
		Menu help = new Menu("Hilfe");
		Menu stuffe = new Menu("Stuffe");
		Menu einst = new Menu("Einstellungen...");

		// Einen Menüeintrag anlegen
		MenuItem oeffnen = new MenuItem("Neu");

		// Den Eintrag dem Menü hinzufügen
		datei.add(oeffnen);
		datei.add("leeres Brett");
		datei.addSeparator();
		datei.add("Beenden");
		bearb.add("Rückgängig");
		bearb.add("Wiederrufen");
		help.add("Version");
		help.add("Info");

		// ...das Menü dem Extramenü als Untermenü hinzufügen
		extra.add(stuffe);
		extra.add(einst);

		// Das Untermenü mit Einträgen füllen
		stuffe.add("Anfaenger");
		stuffe.add("Fortgeschritten");
		stuffe.addSeparator();
		stuffe.add("Profi");
		einst.add("Figur");
		einst.add("Farbe");

		// Das Extramenü der Leiste hinzufügen
		menueLeiste.add(datei);
		menueLeiste.add(bearb);
		menueLeiste.add(extra);
		menueLeiste.add(help);
		return menueLeiste;
	}

	class TestWindowListener extends WindowAdapter { // windowsfenster
		// min, max oder
		// schießen
		public void windowClosing(WindowEvent e) {
			e.getWindow().dispose();
			System.exit(0);
		}
	}

	public static void main(String[] args) {
		MenuDame menusample = new MenuDame();
		MakeFrame frame = menusample.new MakeFrame();
	}
}

Zwei Anwendungsfenster sind unelegant. Wenn doch, am besten verschieden positionieren (setLocation()).
Irgendwie kann man noch nicht spielen. Da muss wohl noch weiterprogrammiert werden. :)
Klassen inline zu definieren ist eine Strukturierungs- und Zugriffskontrollmassnahme. Alles ungefragt in eine Klasse zu packen macht diese unhandlich.
 
Zurück