# 4 Gewinnt Menü-Leiste



## cascais (2. Aug 2012)

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:


```
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) {}
}
```


----------



## Gast2 (2. Aug 2012)

In deinem Code sehe ich nirgends ne JMenuBar. Poste doch mal deine Versuche, dann kann man dir bestimmt helfen.
Stoff dazu gibts außerdem hier: How to Use Menus (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)
Das hast du dir schon komplett angeschaut und nachvollzogen?


----------



## cascais (6. Aug 2012)

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 (


----------



## Gast2 (6. Aug 2012)

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 (6. Aug 2012)

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();
	}
}


----------



## Gast2 (6. Aug 2012)

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 (6. Aug 2012)

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)


----------



## cascais (6. Aug 2012)

Sorry weiß echt nicht was ich ändern soll da.


----------



## Gast2 (6. Aug 2012)

In GameFrame gibts keine Methode setSize, 
	
	
	
	





```
gameFrame.setSize
```
 kannst du also nicht aufrufen. Das selbe gilt für die anderen Methoden.


----------



## ARadauer (6. Aug 2012)

vermutlich, GameFrame von JFrame erben lassen...
public class GameFrame extends JFrame implements ActionListener


----------



## cascais (6. Aug 2012)

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



```
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) {}

   
}
```


----------



## tribalup (6. Aug 2012)

Bei mir funzt ebenfalls alles


----------



## cascais (6. Aug 2012)

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:


```
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


```
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]);
	}
}
```


----------



## tribalup (6. Aug 2012)

Du hast 2 mains.


----------



## huestblub (6. Aug 2012)

Wenn du schon 80% kopierst, warum nicht auch den rest? 

/trunk/4Gewinnt/ - viergewinnthsbremen - GUI basierendes 4Gewinntspiel - Google Project Hosting


----------



## cascais (6. Aug 2012)

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.


----------



## cascais (6. Aug 2012)

@huestblub

weil ich ein Menü brauche, welches darin nicht vorkommt.


----------



## tribalup (6. Aug 2012)

Im load machst du ein frame.clear.


----------



## cascais (6. Aug 2012)

Wenn ich frame.clear entferne hat das keinerlei Auswirkung leider.


----------



## tribalup (6. Aug 2012)

huestblub hat gesagt.:


> Wenn du schon 80% kopierst, warum nicht auch den rest?
> 
> /trunk/4Gewinnt/ - viergewinnthsbremen - GUI basierendes 4Gewinntspiel - Google Project Hosting



Du solltest wohl zuerst versuchen nachzuvollziehen was der code überhaupt macht, bevor du ihn kopierst.

Du machst ein 

```
frame.add(box);
```

ohne borderlayout miteinzubeziehen wird das gesamte Frame dafür verwendet.


----------



## cascais (6. Aug 2012)

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 (6. Aug 2012)

Wie machen denn die anderen aus deiner Klasse das?


----------



## tribalup (6. Aug 2012)

Die Lösung für dein Problem hat Eike dir bereits genannt:
Überprüfe deine Konstruktoren


----------



## cascais (6. Aug 2012)

Das ist eine Zusatzaufgabe die nur ich machen muss leider.

Weiß keiner mehr Rat? (


----------



## timbeau (6. Aug 2012)

_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 (6. Aug 2012)

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.


----------



## tribalup (6. Aug 2012)

Ein kleines @ tutorials.de: Tutorials, Forum & Hilfe

Das schafft man bis morgen. Zumindest wenns wichtig ist.


----------

