4 Gewinnt Menü-Leiste

cascais

Mitglied
Hallo liebe Java-Freunde,

ich muss für die Schule ein Vier-Gewinnt-Spiel programmieren. Soweit läuft alles gut, nur der Einbau der Menüleiste inklusive der Buttons Neues Spiel und Beenden will nicht so ganz klappen. ;(

Wäre über Hilfe sehr dankbar, wie ich das integrieren kann. Mit JMenubar habe ich es schon vergeblich versucht.

Hier der Code der Game Frame Klasse:

Java:
package core;

import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.JFrame;
import javax.swing.JOptionPane;

class GameFrame extends JFrame implements WindowListener {
	private static final long serialVersionUID = 1L;

	private Game game;

	GameFrame(Game game) {
		super();
		addWindowListener(this);
		this.game = game;
	}
	public void windowClosing(WindowEvent e) {
		int result = JOptionPane.showConfirmDialog(null, "Sicher, dass beendet werden soll?", "Sicher?",
					JOptionPane.YES_NO_OPTION);
		if(result == JOptionPane.YES_OPTION) {
			shutdown();
		}
	}
	void shutdown() {
		dispose();
		game.clear();
		
		
	void clear() {
		getContentPane().removeAll();
	}
	
	public void windowActivated(WindowEvent e) {}
	public void windowClosed(WindowEvent e) {}	
	public void windowDeactivated(WindowEvent e) {}
	public void windowDeiconified(WindowEvent e) {}
	public void windowIconified(WindowEvent e) {}
	public void windowOpened(WindowEvent e) {}
}
 
Zuletzt bearbeitet:

cascais

Mitglied
Hier mal mein Versuch:

package pkg4gewinnt;

import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class GameFrame implements ActionListener {

JFrame applikation;
Container container;

// Menüleiste
JMenuBar menueLeiste;

// Menüleiste Elemente
JMenu datei;
JMenu hilfe;

// Datei
JMenuItem oeffnen;
JMenuItem beenden;

// Hilfe
JMenuItem faq;
JMenuItem about;

// Textfeld
JTextArea textarea;

public GameFrame() {
applikation = new JFrame("GameFrame");
container = applikation.getContentPane();

// Menüleiste erzeugen
menueLeiste = new JMenuBar();

// Menüelemente erzeugen
datei = new JMenu("Datei");
hilfe = new JMenu("Hilfe");

// Untermenüelemente erzeugen
oeffnen = new JMenuItem("öffnen");
oeffnen.addActionListener(this);
beenden = new JMenuItem("beenden");
beenden.addActionListener(this);
faq = new JMenuItem("F.A.Q.");
faq.addActionListener(this);
about = new JMenuItem("Über");
about.addActionListener(this);

// Menüelemente hinzufügen
menueLeiste.add(datei);
menueLeiste.add(hilfe);

// Untermenüelemente hinzufügen
datei.add(oeffnen);
datei.add(beenden);
hilfe.add(faq);
hilfe.add(about);

// Textfeld erzeugen
textarea = new JTextArea();

applikation.add(menueLeiste, BorderLayout.NORTH);
applikation.add(new JScrollPane(textarea), BorderLayout.CENTER);

applikation.setSize(400, 300);
applikation.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
applikation.setVisible(true);
}

public void actionPerformed(ActionEvent object) {
if (object.getSource() == oeffnen){
System.out.println("öffnen wurde angeklickt");
}
if (object.getSource() == beenden){
System.out.println("beenden wurde angeklickt");
}
if (object.getSource() == faq){
System.out.println("faq wurde angeklickt");
}
if (object.getSource() == about){
System.out.println("über wurde angeklickt");
}
}

public static void main(String[] args) {
new GameFrame();
}

private Game game;

GameFrame(Game game) {
super();
this.game = game;
}
public void windowClosing(WindowEvent e) {
int result = JOptionPane.showConfirmDialog(null, "Soll das Spiel wirklich beendet werden?", "Beenden",
JOptionPane.YES_NO_OPTION);
if(result == JOptionPane.YES_OPTION) {
shutdown();
}
}
void shutdown() {
game.clear();


}

}



Will er aber nicht anzeigen :((
 
G

Gast2

Gast
Bei mir wird die Menüleiste angezeigt.
Bekommst du ne Fehlermeldung? Ist dir bewusst dass du zwei verschiedenen Konstruktoren hast und den zweiten nie aufrufst?

PS:
Javacode in [ JAVA] Tags posten.
 

cascais

Mitglied
Ich bekomme in der creategame.java Klasse Fehler. Habe die Fehler mal rot markiert.
Muss ich den zweiten Konstruktor löschen/ändern oder wie?
Danke für die Hilfe.

package pkg4gewinnt;

import java.awt.Color;

import javax.swing.Box;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class CreateGame
{
private static void create() {
Game game = new Game();
GameFrame frame = new GameFrame(game);
frame.setSize(372, 350);
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
load(game, frame);
frame.setVisible(true);
}
static void load(Game game, GameFrame frame) {
frame.clear();
game.clear();

Box box = Box.createVerticalBox();
frame.add(box);

JPanel gamePanel = new JPanel(null);
box.add(gamePanel);

JPanel backgroundPanel = new JPanel();
backgroundPanel.setBounds(0, 0, 366, 314);
backgroundPanel.setBackground(Color.PINK);
gamePanel.add(backgroundPanel);

JPanel stonePanel = new JPanel(null);
stonePanel.setBounds(0, 0, 366, 314);
stonePanel.setOpaque(false);
gamePanel.add(stonePanel, 0);

JLabel foregroundLabel = new JLabel(new ImageIcon("img\\foreground.png"));
foregroundLabel.setBounds(0, 0, 366, 314);
gamePanel.add(foregroundLabel, 0);

JPanel mousePanel = new MousePanel(game, stonePanel, frame);
mousePanel.setBounds(0, 0, 366, 314);
mousePanel.setOpaque(false);
gamePanel.add(mousePanel, 0);

JLabel playerLabel = new JLabel();
box.add(playerLabel);
game.setPlayerLabel(playerLabel);
}
public static void main(String[] args) {
create();
}
}
 
G

Gast2

Gast
Die Klasse GameFrame besitzt keine Methoden setSize, etc.

PS:
EikeB hat gesagt.:
Javacode in [ JAVA] Tags posten

PPS:
Wenn du das nächste mal auf Fehler oder Exceptions stößt dann sag direkt wo welche Fehler auftreten, das machts einfacher..
 

cascais

Mitglied
Das ist der Fehlercode der mir angezeigt wird:

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - Erroneous sym type: pkg4gewinnt.GameFrame.setSize
at pkg4gewinnt.CreateGame.create(CreateGame.java:16)
at pkg4gewinnt.CreateGame.main(CreateGame.java:56)
 
G

Gast2

Gast
In GameFrame gibts keine Methode setSize,
Code:
gameFrame.setSize
kannst du also nicht aufrufen. Das selbe gilt für die anderen Methoden.
 

cascais

Mitglied
Hab den Code jetzt so geändert das es zu keinen Fehlermeldungen mehr kommt. Aber das Menü wird immer noch nicht angezeigt :(


Java:
package pkg4gewinnt;

import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

import javax.swing.JFrame;
import javax.swing.JOptionPane;


public class GameFrame extends JFrame implements ActionListener  {


JFrame applikation;
Container container;

// Menüleiste
JMenuBar menueLeiste;

// Menüleiste Elemente
JMenu datei;

// Datei
JMenuItem oeffnen;
JMenuItem beenden;


// Textfeld
JTextArea textarea;

public GameFrame() {
applikation = new JFrame("GameFrame");
container = applikation.getContentPane();

// Menüleiste erzeugen
menueLeiste = new JMenuBar();

// Menüelemente erzeugen
datei = new JMenu("Datei");


// Untermenüelemente erzeugen
oeffnen = new JMenuItem("öffnen");
oeffnen.addActionListener(this);
beenden = new JMenuItem("beenden");
beenden.addActionListener(this);


// Menüelemente hinzufügen
menueLeiste.add(datei);


// Untermenüelemente hinzufügen
datei.add(oeffnen);
datei.add(beenden);


// Textfeld erzeugen
textarea = new JTextArea();

applikation.add(menueLeiste, BorderLayout.NORTH);
applikation.add(new JScrollPane(textarea), BorderLayout.CENTER);

applikation.setSize(400, 300);
applikation.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
applikation.setVisible(true);
}

public void actionPerformed(ActionEvent object) {
if (object.getSource() == oeffnen){
System.out.println("öffnen wurde angeklickt");
}
if (object.getSource() == beenden){
System.out.println("beenden wurde angeklickt");
}

}



public static void main(String[] args) {
        GameFrame gameFrame = new GameFrame();
}
	private Game game;

	GameFrame(Game game) {
		super();
		this.game = game;
	}
	public void windowClosing(WindowEvent e) {
		int result = JOptionPane.showConfirmDialog(null, "Soll das Spiel wirklich beendet werden?", "Beenden",
					JOptionPane.YES_NO_OPTION);
		if(result == JOptionPane.YES_OPTION) {
			shutdown();
		}
	}
	void shutdown() {
		dispose();
		game.clear();
		
		
	}
	void clear() {
		getContentPane().removeAll();
	}
	
	public void windowActivated(WindowEvent e) {}
	public void windowClosed(WindowEvent e) {}	
	public void windowDeactivated(WindowEvent e) {}
	public void windowDeiconified(WindowEvent e) {}
	public void windowIconified(WindowEvent e) {}
	public void windowOpened(WindowEvent e) {}

   
}
 

cascais

Mitglied
Das Problem liegt glaub ich darin, dass CreateGame (ist die Hauptklasse), den GameFrame inklusive Menü iwie nicht mit berücksichtigt. Aber wie muss ich das dort einbinden?
Bin echt am verzweifeln gerade :(

Hier mal der Code der CreateGame Klasse:

Java:
package pkg4gewinnt;

import java.awt.Color;

import javax.swing.Box;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class CreateGame
{
	private static void create() {
		Game game = new Game();
		GameFrame frame = new GameFrame(game);
		frame.setSize(372, 350);
		frame.setResizable(false);
		frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
		load(game, frame);
		frame.setVisible(true);
	}
	static void load(Game game, GameFrame frame) {
		frame.clear();
		game.clear();
		
		Box box = Box.createVerticalBox();
		frame.add(box);
		
		JPanel gamePanel = new JPanel(null);
		box.add(gamePanel);
		
		JPanel backgroundPanel = new JPanel();
		backgroundPanel.setBounds(0, 0, 366, 314);
		backgroundPanel.setBackground(Color.PINK);
		gamePanel.add(backgroundPanel);
		
		JPanel stonePanel = new JPanel(null);
		stonePanel.setBounds(0, 0, 366, 314);
		stonePanel.setOpaque(false);
		gamePanel.add(stonePanel, 0);
		
		JLabel foregroundLabel = new JLabel(new ImageIcon("img\\foreground.png"));
		foregroundLabel.setBounds(0, 0, 366, 314);
		gamePanel.add(foregroundLabel, 0);
		
		JPanel mousePanel = new MousePanel(game, stonePanel, frame);
		mousePanel.setBounds(0, 0, 366, 314);
		mousePanel.setOpaque(false);
		gamePanel.add(mousePanel, 0);
		
		JLabel playerLabel = new JLabel();
		box.add(playerLabel);
		game.setPlayerLabel(playerLabel);
	}
	public static void main(String[] args) {
		create();
	}
}

und vielleicht hilft noch der Code der Game-Klasse

Java:
package pkg4gewinnt;

import javax.swing.JLabel;

class Game {
	private byte player;
	private JLabel playerLabel;
	private Stone[][] gameField;
	
	Game() {
		super();
		gameField = new Stone[7][6];
	}
	
void clear() {
	player = 0;
	if(playerLabel != null)
		setPlayerLabelText();
	
	for(byte y = 0; y < 6; y++) {
		for(byte x = 0; x < 7; x++) {
			Stone stone = gameField[x][y];
			if(stone != null) {
				stone.setStat(Stone.STAT_DIE);
				gameField[x][y] = null;					
			}
		}
	}
}
	void nextPlayer() {
		if(player == 0)
			player++;
		else
			player = 0;
		setPlayerLabelText();
	}
	void setPlayerLabel(JLabel newPlayerLabel) {
		playerLabel = newPlayerLabel;
		setPlayerLabelText();
	}
	void setPlayerLabelText() {
		playerLabel.setText("Spieler " + player + " ist an der Reihe.");
	}
	void setStoneToField(int x, int y, Stone stone)
	{
		gameField[x][y] = stone;
	}
	
	byte getPlayer()
	{
		return(player);
	}
	Stone getStoneFromField(int x, int y)
	{
		return(gameField[x][y]);
	}
}
 

cascais

Mitglied
Stimmt. Habe jetzt den Teil

public static void main(String[] args) {
GameFrame gameFrame = new GameFrame();
}

aus der GameFrame Klasse herausgelöscht. Dann wird sie zwar nicht mehr als Main deklariert aber das Menü taucht immer noch nicht auf.
 

tribalup

Bekanntes Mitglied

cascais

Mitglied
Ich habe wirklich schon alles versucht so gut es geht zu verstehen. Aber mir fehlt einfach das nötige Tiefenwissen, wie die ganzen Sachen zusammenhängen und da morgen Abgabe ist, bleibt dafür auch keine Zeit mehr das aufzuarbeiten.
 

timbeau

Gesperrter Benutzer
Jemandem 50€ für die Aufgabe bieten? Die 6 akzeptieren wenn dein Lehrer nicht ganz doof ist und im Netz sucht?

Wie sehen deine Konstruktoren aktuell aus?
 

cascais

Mitglied
Würde jemand für 50€ ein komplett neues Vier gewinnt inklusive GUI und Menüleiste inklusive Neues Spiel und Beenden Button schreiben? Beschrieben werden müssten die einzelnen Schritte im Code natürlich auch.
 

Neue Themen


Oben