# MenuBar wird bei Spiel nicht angezeigt



## jzine (24. Jul 2008)

Hallo,

ich habe folgendes Problem.
Und zwar habe ich das Spiel TicTacToe programmiert, welches auch ohne Probleme funktioniert.
Jetzt wollte ich  noch eine Menüleiste dem Spielfenster hinzufügen, jedoch schaffe ich es nicht, dass diese
im selben Fenster wie das Spiel angezeigt wird.
Die Funktionen der Menüleiste gehen auch, so wie sie es sollten. Außer vielleicht der Menüpunkt NEU, den ich noch nicht getestet habe und evtl. den Code noch überarbeiten muss.
Das einzige Problem ist, dass ich nun schon seit 2 Tagen versuche, dass im Fenster des TicTacToe-Spiels auch die 
Menüleiste angezeigt wird. Nur leider ohne Erfolg.
Ich bin auch noch nicht so erfahren in JAVA, aber vielleicht weiß ja einer von euch Rat!?

Hier ist der Code, der mich noch zum Wahnsinn treibt:



```
package xogame;
import java.awt.*;
import javax.swing.*;
import javax.swing.JButton.*;
import javax.swing.JLabel;
import javax.swing.ButtonGroup;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class Main extends JFrame implements ActionListener {

    private JFrame fenster = new JFrame("X-O Das JAVA-Spiel");
    
    private JButton feld1 = new JButton("");
    private JButton feld2 = new JButton("");
    private JButton feld3 = new JButton("");
    private JButton feld4 = new JButton("");
    private JButton feld5 = new JButton("");
    private JButton feld6 = new JButton("");
    private JButton feld7 = new JButton("");
    private JButton feld8 = new JButton("");
    private JButton feld9 = new JButton("");
    
    private String zeichen = "";
    public int zaehler = 0;
    public boolean sieg = false;
    
    public Main() throws Exception {
        add(new Menu());
        /* Fenster für Spiel erstellen */
        fenster.setSize(300,300);
        fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fenster.setLayout(new GridLayout(3,3));
        /* Die einzelnen Felder dem Fenster hinzufügen */
        fenster.add(feld1);
        fenster.add(feld2);
        fenster.add(feld3);
        fenster.add(feld4);
        fenster.add(feld5);
        fenster.add(feld6);
        fenster.add(feld7);
        fenster.add(feld8);
        fenster.add(feld9);
        
        /* Den einzelnen Feldern einen ActionListener hinzufügen */
        feld1.addActionListener(this);
        feld2.addActionListener(this);
        feld3.addActionListener(this);
        feld4.addActionListener(this);
        feld5.addActionListener(this);
        feld6.addActionListener(this);
        feld7.addActionListener(this);
        feld8.addActionListener(this);
        feld9.addActionListener(this);
        
        /* Das Fenster auf dem Bildschirm sichtbar machen */
        fenster.setVisible(true);
    
    }
    public void actionPerformed(ActionEvent a){
        zaehler++;
        
        /* Berechnen wer am Zug ist */
        if(zaehler == 1 || zaehler == 3 || zaehler == 5 || zaehler == 7
                || zaehler == 9){
            zeichen = "X";
        } else if(zaehler == 2 || zaehler == 4 || zaehler == 6 || zaehler == 8
                || zaehler == 10){
            zeichen = "O";
        }
        
        /* Das Zeichen X bzw. O auf den Feldern anzeigen lassen */
        if(a.getSource() == feld1){
            feld1.setText(zeichen);
            feld1.setEnabled(false);
           }else if(a.getSource() == feld2){
                feld2.setText(zeichen);
                feld2.setEnabled(false);
               }else if(a.getSource() == feld3){
                  feld3.setText(zeichen);
                  feld3.setEnabled(false);
                 }else if(a.getSource() == feld4){
                     feld4.setText(zeichen);
                     feld4.setEnabled(false);
                    }else if(a.getSource() == feld5){
                        feld5.setText(zeichen);
                        feld5.setEnabled(false);
                       }else if(a.getSource() == feld6){
                           feld6.setText(zeichen);
                           feld6.setEnabled(false);
                          }else if(a.getSource() == feld7){
                              feld7.setText(zeichen);
                              feld7.setEnabled(false);
                             }else if(a.getSource() == feld8){
                                 feld8.setText(zeichen);
                                 feld8.setEnabled(false);
                                }else if(a.getSource() == feld9){
                                    feld9.setText(zeichen);
                                    feld9.setEnabled(false);
                                   }
      
    
      /* Herausfinden wer der Sieger ist */
      
      /* waagerechte Siegmöglichkeiten */
      if( feld1.getText() == feld2.getText() && feld2.getText() == feld3.getText() && feld1.getText() != ""){
          sieg = true;
      } 
      else
          if(feld4.getText() == feld5.getText() && feld5.getText() == feld6.getText() && feld4.getText() != ""){
          sieg = true; 
      } 
      else 
          if(feld7.getText() == feld8.getText() && feld8.getText() == feld9.getText() && feld7.getText() != ""){
          sieg = true;
      }
    
      /* senkrechte Siegmöglichkeiten */
      else if(feld1.getText() == feld4.getText() && feld4.getText() == feld7.getText() && feld1.getText() != ""){
          sieg = true;
      } else if(feld2.getText() == feld5.getText() && feld5.getText() == feld8.getText() && feld2.getText() != ""){
          sieg = true;
      } else if(feld3.getText() == feld6.getText() && feld6.getText() == feld9.getText() && feld3.getText() != ""){
          sieg = true;
      } 
    
      /* diagonale Siegmöglichkeiten */
      else if(feld1.getText() == feld5.getText() && feld5.getText() == feld9.getText() && feld1.getText() != ""){
          sieg = true;
      } else if(feld3.getText() == feld5.getText() && feld5.getText() == feld7.getText() && feld3.getText() != ""){
          sieg = true;
      } else{
          sieg = false;
      }
    
      /* Eine Meldung anzeigen lassen, falls jemand gewonnen hat bzw. bei unentschieden */
      if (sieg == true){
            JOptionPane.showMessageDialog(null, "der Spieler " + zeichen + 
                    " hat gewonnen!"); 
            NochmalSpielen();
        } else if(zaehler == 9 && sieg == false){
            JOptionPane.showMessageDialog(null, "Unentschieden!");
            NochmalSpielen();
        }
    }  
    
    /* Nachfragen ob nochmal gespielt werden soll */
      public void NochmalSpielen() {
        int nachfragen = JOptionPane.showConfirmDialog(null, "Wollen Sie noch " 
                +"ein Spiel spielen?", "Bitte auswählen", 
                JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
        
        if(nachfragen == JOptionPane.YES_OPTION) neustarten();
        else System.exit(0);
    }
      
    /* Spiel neustarten*/
    public void neustarten(){
        
            feld1.setText("");
            feld1.setEnabled(true);
            
            feld2.setText("");
            feld2.setEnabled(true);
            
            feld3.setText("");
            feld3.setEnabled(true);
            
            feld4.setText("");
            feld4.setEnabled(true);
            
            feld5.setText("");
            feld5.setEnabled(true);
            
            feld6.setText("");
            feld6.setEnabled(true);
            
            feld7.setText("");
            feld7.setEnabled(true);
            
            feld8.setText("");
            feld8.setEnabled(true);
            
            feld9.setText("");
            feld9.setEnabled(true);
       
        sieg = false;
        zaehler = 0;
    }  
    
    /* MENU */
    public class Menu extends JMenuBar {
         
        public Menu(){
          /* Menüleiste für ein JFrame erzeugen */
          JMenuBar menuBar = new JMenuBar();
          setTitle ( "Menü Beispiel");
          setSize ( 150 , 150 ) ; setSize (150, 150); 
          
          /* Menüleiste auf den Rahmen hinzufügen */
          setJMenuBar(menuBar);
          menuBar.setVisible(true);
          /* Zwei Drop-Down-Menüs Datei und Einstellungen der Menüleiste 
           * hinzufügen und festlegen */
          JMenu fileMenu = new JMenu ("Datei");
          JMenu editMenu = new JMenu ("Hilfe");
          menuBar.add(fileMenu);
          menuBar.add(editMenu);
          
          /* Menüpunkte zum Drop-Down-Menü hinzufügen */
          JMenuItem newAction = new JMenuItem ("Neues Spiel");
          JMenuItem exitAction = new JMenuItem ("Beenden");
          JMenuItem howToAction = new JMenuItem ("Anleitung");
          JMenuItem creditsAction = new JMenuItem ("Credits");
          
          /* Buttongruppe erzeugen */
          ButtonGroup bg = new ButtonGroup();
          fileMenu.add(newAction);
          fileMenu.addSeparator();
          fileMenu.add(exitAction);
          editMenu.add(howToAction);
          editMenu.addSeparator();
          editMenu.add(creditsAction);
          
          /* Action-Performed-Methode dem Menuelement Neu hinzufügen */
          newAction.addActionListener(new ActionListener(){
             public void actionPerformed(ActionEvent n){
                 System.out.println("Sie haben gerade den Menüpunkt NEU gedrückt");
                int nachfragen = JOptionPane.showConfirmDialog(null, "Wollen Sie wirklich " 
                +"neustarten?", "Bitte auswählen", 
                JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
        
                if(nachfragen == JOptionPane.YES_OPTION) { 
                    feld1.setText("");
                    feld1.setEnabled(true);
            
                    feld2.setText("");
                    feld2.setEnabled(true);
            
                    feld3.setText("");
                    feld3.setEnabled(true);
            
                    feld4.setText("");
                    feld4.setEnabled(true);
            
                    feld5.setText("");
                    feld5.setEnabled(true);
            
                    feld6.setText("");
                    feld6.setEnabled(true);
            
                    feld7.setText("");
                    feld7.setEnabled(true);
            
                    feld8.setText("");
                    feld8.setEnabled(true);
            
                    feld9.setText("");
                    feld9.setEnabled(true);
       
                    sieg = false;
                    zaehler = 0;
                    
                }  else if(nachfragen == JOptionPane.NO_OPTION) {   
                }
             } 
          });
          
          /* Action-Performed-Methode dem Menuelement Beenden hinzufügen */
          exitAction.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                System.out.println("Sie haben gerade den Menüpunkt BEENDEN gedrückt");
                int nachfragen = JOptionPane.showConfirmDialog(null, "Wollen Sie wirklich "
                +"beenden?", "Bitte auswählen",
                JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
                
                if(nachfragen == JOptionPane.YES_OPTION){
                System.exit(0);} else if(nachfragen == JOptionPane.NO_OPTION){
                }
            }
          });  
          
          howToAction.addActionListener(new ActionListener(){
             public void actionPerformed(ActionEvent h){
                 System.out.println("Sie haben gerade den Menüpunkt ANLEITUNG gedrückt");
                 JFrame help = new JFrame("Anleitung");
                    help.setSize(250,200);
                    help.setVisible(true);
                  
                 JLabel text = new JLabel();
                     text.setText("<html>Bei diesem Spiel kommt es darauf an, 3 Kreuze

" +
                             "(3 Kreise) entweder waagerecht, senkrecht oder

" +
                             "diagonal nebeneinander zu setzen.

" +
                             "Das Spiel ist dann zu Ende, wenn als erstes 3

" +
                             "Kreuze (Kreise) nebeneinander platziert

" +
                             "wurden.



" +
                             "Spieler 1 = X 

" +
                             "Spieler 2 = O</html>");
                     text.setFont(new Font("Serif",Font.PLAIN,12));
                     text.setHorizontalAlignment(JLabel.LEADING);
                     text.setVerticalAlignment(JLabel.TOP);
                     text.setForeground(Color.black);
                     help.getContentPane().add(text);
                     text.setVisible(true); 
             } 
          });
          
          creditsAction.addActionListener(new ActionListener(){
             public void actionPerformed(ActionEvent a){
                 System.out.println("Sie haben gerade den Menüpunkt CREDITS gedrückt");
                 JFrame about = new JFrame("Credits");
                    about.setSize(270,150);
                    about.setVisible(true);
                 
                 JLabel text2 = new JLabel();
                    text2.setText("<html>Studienarbeit: Programmierung und Datenbanken

" +
                            "

" +
                            "Erstellt von: 

" +
                            "xyz 

" +
                            "MUK4 - Sommersemester 2008 

" +
                            "<html>");
                    text2.setFont(new Font("Serif",Font.PLAIN,12));
                    text2.setHorizontalAlignment(JLabel.LEADING);
                    text2.setVerticalAlignment(JLabel.TOP);
                    text2.setForeground(Color.black);
                    about.getContentPane().add(text2);
                    text2.setVisible(true); 
             } 
             
          });
    }
   }
    
    
    public static void main(String[] args) throws Exception {
        new Main(); }
        
}
```


----------



## Marco13 (24. Jul 2008)

Nicht Swing (JFrame) und AWT (Menu) mischen. Stattdessen JMenu verwenden. Hier steht alles, was du wissen musst: http://java.sun.com/docs/books/tutorial/uiswing/components/menu.html


----------



## jzine (24. Jul 2008)

Vielen Dank für die schnelle Hilfe! Ich Depp, dass hab ich ganz übersehen. Dann kann ich es ja ewig versuchen  
Ich mach mich gleich mal ans Werk, Danke nochmal!!


----------



## diggaa1984 (25. Jul 2008)

was mir auffällt, du hast oben 
	
	
	
	





```
add(new Menu());
```
 stehen, das bezieht sich also auf eine Instanz der Klasse Main, welche von Frame abgeleitet ist.

Das Fenster was du siehst erzeugst aber extra mit 
	
	
	
	





```
private JFrame fenster = new JFrame("X-O Das JAVA-Spiel");
```
 und alles was du an Komponenten hinzufügst, schiebst du in dieses Fenster und machst es visible.

Also am besten gleich das 
	
	
	
	





```
extends JFrame
```
 raus, und einfach 
	
	
	
	





```
fenster.add(newMenu());
```
machen 

es wurde doch bisher auch schon JMenu verwendet oder is da ein edit im post, der nich angezeigt wird ^^


----------



## Marco13 (25. Jul 2008)

Wah  :shock: ICH Depp! Das "Menu" ist ja nicht das AWT Menu, sondern eine eigene Klasse   

Da wirkt das "Vielen Dank für die schnelle Hilfe!" ja schon fast zynisch  ???:L 

Sorry. Hätte mal genauer lesen sollen. Hoffentlich hilft jetzt der Post von diggaa1984 wenigstens _wirklich_....


----------



## diggaa1984 (25. Jul 2008)

zumindest klingt meins erstma plausibel  .... sieh's ma so, nu hast wen an eine umfassende Doku verwiesen, das kann nie schaden  :roll:


----------

