# einfaches menü erstellen



## moe_joe (20. September 2007)

Ich habe vor für mein Hangman-programm ein einfaches menü zu erstellen mit folgenden auswahlmöglichkeiten:

Datei
    -Spiel neu starten
    -Beenden
Hilfe
    -Spielregeln

```
{
    		     MenuBar hauptMenue = new MenuBar();
    		     Menu menue1 = new Menu("datei");
    		     Menu menue2 = new Menu("hilfe");
    		     menue1.add("Spiel neustarten");
    		     menue1.add("Beenden");
    		     menue2.add("Spielregeln");
    		     hauptMenue.add(menue1);
    		     hauptMenue.add(menue2);
    		     hauptMenue.setHelpMenu(menue2);
    		     setMenuBar(hauptMenue);
    		     menue1.addActionListener((ActionListener) this);
    		     addWindowListener(this);
    		   }
    	  public void actionPerformed(ActionEvent evt)
    	  {
    	     if (evt.getSource() instanceof MenuItem)
    	    {
    	       String menuAdd = evt.getActionCommand();
    	       if (menuAdd == "beenden") System.exit(0);
    	     }
    	   }
```
kann man das so machen?

mfg moe_joe


----------



## zerix (20. September 2007)

Hallo,

ich verstehe nicht warum du das machst

```
menue1.addActionListener((ActionListener) this);
```
, aber grundsätzlich kann man das so machen.

Warum postest du das hier und fragst ob man das so machen kann. Probier es doch einfach aus und wenn es funktioniert kann man es so machen. Wenn es nicht funktioniert, musst du halt den Fehler suchen. Wenn du diese nicht findest, dann kannst du hier posten.
Das ist nicht böse gemeint, aber wenn jeder fragen würde, ob man das so lösen kann wie er es gelöst hat, dann ist das Forum bald mit Themen voll, die meiner Meinung nach unnötig wären.

MFG

zEriX


----------



## MiMi (20. September 2007)

Vielleicht wollte er nur wissen ob es einen besseren/ effizienteren weg gibt 

@moe_joe
Du kannst es ja erstmal so machen wie du denkst, wenn alles funktioniert, kannst du es immer noch perfektionieren


----------



## zerix (20. September 2007)

mimij85 hat gesagt.:
			
		

> Vielleicht wollte er nur wissen ob es einen besseren/ effizienteren weg gibt



Das ist mir schon klar. Aber wie gesagt, wenn das jeder so machen würde, wäre das Forum sehr schnell mit diesen Themen überfüllt und die "richtigen" Probleme würden vernachlässigt. Wie gesagt, das ist ja auch nicht böse gemeint.

MFG

zEriX


----------



## moe_joe (20. September 2007)

mein problem ist, ich weis nich wo ich bei mir das menü vereinbaren muss. es muss ja irgendwo meinem fenster das menü hinzgefügt werden. 


```
private static void initializeNewWindow(){
    JFrame frame= new JFrame();       // neues Fenster
    	        frame.addWindowListener(new WindowAdapter() {   // WindowListener hinzufügen
    	            public void windowClosing(WindowEvent e) {  // wenn auf X geklickt:
    	                System.out.println();
    	                System.exit(0);       // Programm beenden.
    	            }
    	        });
    	          	        
    	        frame.setLayout(new BorderLayout());
    	        Panel buttonPanel = new Panel();
    	        buttonPanel.setLayout(new FlowLayout());
    	        buttonPanel.setBackground(Color.black);

    	        final JFrame f = frame;
    	        Button button1 = new Button("Nochmal");
    	                       button1.setPreferredSize(new Dimension(80,20));
    	                       button1.addActionListener(new ActionListener() {
    	                       public void actionPerformed(ActionEvent arg0) {
    	                           System.out.print("Nochmal...");
    	                           f.dispose();
                                           initializeNewWindow();
    	                           }
    	      });
    	        Button button2 = new Button("Beenden");
    	        button2.setPreferredSize(new Dimension(80,20));
    	        button2.addActionListener(new ActionListener() {
    	            public void actionPerformed(ActionEvent arg0) {
    	            System.out.print("Bis zum nächsten mal...");
    	            System.exit(0); 
    	            }
    	      });
    	       
    	        buttonPanel.add(button1);
    	        buttonPanel.add(button2);
    	       
    	        frame.add(buttonPanel,BorderLayout.SOUTH);
    	       
    	        Hangman panel = new Hangman();
    	        frame.add(panel,BorderLayout.CENTER);
    	       
    	        frame.setTitle(".:Hangman:.");  // Titel setzen
    	        frame.setSize(WND_B, WND_H);   // Größe setzen
    	        frame.setBackground(Color.black);
    	        frame.setVisible(true);                  // auf den Bildschirm
    	        panel.requestFocusInWindow();
    	        {
    	            MenuBar hauptMenue = new MenuBar();
    	            Menu menue1 = new Menu("datei");
    	            Menu menue2 = new Menu("hilfe");
    	            menue1.add("Spiel neu starten");
    	            menue1.add("Beenden");
    	            menue2.add("Spielregeln");
    	            hauptMenue.add(menue1);
    	            hauptMenue.setHelpMenu(menue2);
    	            setMenuBar(hauptMenue);
    	            menue1.addActionListener(this);
    	            addWindowListener(this);
    	          } 
    	        public void actionPerformed(ActionEvent evt)
    	        {
    	           if (evt.getSource() instanceof MenuItem)
    	          {
    	             String menuAdd = evt.getActionCommand();
    	             if (menuAdd == "beenden") System.exit(0);
    	           }
    	         }
```


----------



## zerix (20. September 2007)

Was mir auffällt ist, dass du Swing und AWT vermischst. Du solltest entweder AWT benutzen oder Swing. Alle Swing-Componenten beginnen mit einem J (Beispiel MenuBar: Awt -> MenuBar, Swing -> JMenuBar).

Es wird nicht angezeigt, weil du es deinem Frame nicht hinzufügst. 

```
frame.setJMenuBar();
```


Hättest du aber mal bei google gesucht, hättest du das sicherlich auch sehr schnell gefunden, wie man ein JMenu erstellt und dem Fenster hinzufügt.


MFG

zEriX


----------



## moe_joe (20. September 2007)

ich hab gegoogelt, hab auch nen menü gefunden, aber mein problem ist es in das vorhandene programm ein zu bauen. verstehst du?


----------



## zerix (20. September 2007)

Ich verstehe schon. Ich weiß aber auch, dass es nichts bringt, wenn dir immer jemand den fertigen Quelltext gibt, bzw dir sagt, wo man es einbauen muss. Bei komplizierten Sachen ok, aber dir fehlt nur ein Methodenaufruf.

MFG

zEriX


----------



## moe_joe (20. September 2007)

ich will ja nich immer den kompletten quellcode haben... aber wenn du sagst dir fehlt nur ein Methodenaufruf, das kann ich ja auch nich riechen.


----------



## zerix (20. September 2007)

Wenn du dir aber Beispiele anschaust, müssen dir ja Zeilen bekannt vorkommen. Dann siehst du auch was dir fehlt.

Hier ist es sogar im Code kommentiert
http://www.cs.cf.ac.uk/Dave/HCI/HCI_Handout_CALLER/node79.html

Hier ist alles fett was mit der JMenuBar zu tun hat
http://java.sun.com/docs/books/tutorial/uiswing/components/menu.html#create

Das waren die obersten zwei Links bei google. (Suchwörter: JMenuBar example)

MFG

zEriX


----------



## moe_joe (20. September 2007)

also, ich bin jetzt nen stückchen weiter. habe alles jetzt soweit überarbeitet das ich keine fehlermeldungen mehr bekomme, das programm wird auch kompiliert und lässt sich ausführen. allerdings wird die menübar nicht angezeigt.
so sieht's momentan aus (ich hoffe ich poste nich zu viel quellcode)

```
import java.awt.*;
import java.awt.event.*;
import java.io.*;      // für Dateioperationen

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

public class Hangman extends JPanel { 
	   
	private static final long serialVersionUID = 1L;
	// Globale Variablen
	private JMenuBar bar = null;
	private JMenu Datei = null;
	private JMenu Hilfe = null;
	private JMenuItem Nochmal = null;
	private JMenuItem Beenden = null;
	private JMenuItem Spielregeln = null;
	private JLabel text = null; 
    final static int WND_B=435, WND_H=360;
	private static final String EXIT_ON_CLOSE = null;
    final int SX=50, SY=50;
    RandomAccessFile file;
    String myword=null;  // das zu erratene wort
    char xyword[];        // das ungelöste Wort
    char probed[];
    char notprobed[];
    char alphab[]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N',
                   'O','P','Q','R','S','T','U','V','W','X','Y','Z',
		           'Ä','Ö','Ü','ß'};
    int mistakes=0;  // Anzahl der Fehler
    int tries=0;     // Anzahl der Versuche
    KL CONTROL;
    char c;
 
    public Hangman() {                // Hauptroutine
    
	String stmp=new String();
	bar = new JMenuBar();
    
    Datei = new JMenu("Datei");
    Hilfe = new JMenu("Hilfe");
    
    Nochmal = new JMenuItem("Spiel neu starten");
    Beenden = new JMenuItem("Beenden");
    Spielregeln = new JMenuItem("Spielregeln");
    
    text = new JLabel("Diese Anwendung demonstriert die Verwendung von Menüs");
    
    setJMenuBar(bar);
    
    bar.add(Datei);
    bar.add(Hilfe);
    
    Datei.add(Nochmal);
    Datei.add(Beenden);
    
    Hilfe.add(Spielregeln);
    
    getContentPane().add(text);
    
    Beenden.addActionListener((ActionListener) this);
    Spielregeln.addActionListener((ActionListener) this);
    Nochmal.addActionListener((ActionListener) this);
    
    setDefaultCloseOperation(EXIT_ON_CLOSE);
 } 
    
	private void setDefaultCloseOperation(String exitOnClose) {
		// TODO Auto-generated method stub
		
	}

	private void setJMenuBar(JMenuBar bar2) {
		// TODO Auto-generated method stub
		
	}

	private Container getContentPane() {
		// TODO Auto-generated method stub
		return null;
	}

	{
		int wordcount=0;           // neuer Integer für Wörterzahl
	    int wordseek=0;            // ~ für Zielwort-Position
	    RandomAccessFile f=new RandomAccessFile("hangman.dat","r");
	    String stmp;
		while ((stmp=f.readLine())!=null) {  // solange das, was wir lesen, noch sichtbar ist
		if (stmp.charAt(0) != '#') {      // und wenn kein '#' am anfang steht
		    wordcount++;                  // zähle es als Wort
		}  
	    }
	    if (wordcount==0) {
	    	System.out.println("ACHTUNG! In der Datendatei sind keine gültigen Wörter zu finden.");
	    	System.exit(0);
	    }
	    System.out.println("Woerter in Datendatei: "+wordcount);  // Statusbericht
	    while (wordseek==0) {    // Solange wordseek noch 0 ist, tue ...
		wordseek=(int)(Math.random()*wordcount)+1;  // hol' Dir einen Integer-Wert
	    }
	    System.out.print("Ausgewaehltes Wort: #"+wordseek);  // Statusbericht
	    f.seek(0);      // Position auf Dateianfang setzen
	    wordcount=0;    // Wieder auf NULL

	    while ((stmp=f.readLine())!=null) {   // und das ganze von vorne
		if (stmp.charAt(0) != '#') {
		    wordcount++;
		    if (wordcount==wordseek) {     // wenn an der Position, die wir suchen ...
			myword=stmp;               // setze myword auf gerade gelesenen String
			break;                    
		    }
		}
	    }
	    f.close();         // Datei wieder schließen
	}
	catch(IOException ioe) {    // Falls ein Fehler auftreten sollte Fehlermeldung ausgeben
	    System.out.println("IOException: "+ioe.toString());  // Fehlermeldung
	    System.out.println("\n\nFehler beim Bearbeiten der Datendatei. Stellen Sie sicher, daß die Datei HANGMAN.DAT auch existiert und lesbar ist.");
	    System.exit(0);
	}
	
	CONTROL=new KL();   // neuer KeyListener: CONTROL
	void addKeyListener(CONTROL];  // hinzufügen
	xyword=new char[myword.length()];      // array erstellen
	for (int i=0;i<myword.length();i++) {  // array initialisieren
	    xyword[i]='_';
	}
	probed=new char[alphab.length];                // array erstellen
	notprobed=new char[alphab.length];
	for (int i=0;i<alphab.length;i++) {            // array initialisieren
	    probed[i]='-';
	    notprobed[i]=alphab[i];
	}
    }
  public void update(Graphics g)
    {
         paint(g);
    }

    public void paint(Graphics g) {      // die Grafiken
    Toolkit tk=Toolkit.getDefaultToolkit(); 
	// g.drawString("Datensaetze: "+maxdat,40,350);
	// g.drawString("Wort: "+myword,40,200);
	// g.drawString("Zeichen: "+c,40,230);
	g.setColor(Color.black);           // Farbe auf Weiß
	g.fillRect(0,0,WND_B,WND_H);       // Fenster Weiß machen
	g.drawImage(tk.getImage("images/bg.gif"),1,1,this);
	g.drawString("Wort: "+new String(xyword),40,215);
	if (mistakes!=-1) {
	    g.drawString("Buchstaben: ",40,260);
	    for (int i=0;i<alphab.length;i++) {
		g.drawChars(probed,i,1,118+i*8,260);
		g.drawChars(notprobed,i,1,118+i*8,275);
	    }
	    g.drawString("Fehler: "+mistakes,40,230);
	}
	UpdateHangMan(g);    // Hangman updaten
    }

    public void UpdateHangMan(Graphics g) {
	Toolkit tk=Toolkit.getDefaultToolkit();   // Toolkit (für Grafikdatei-Support) zuweisen
	
	switch(mistakes) {   // CASE mistakes of ...
	case 6:
	    g.drawImage(tk.getImage("images/hm6.gif"),SX,SY,this);
	    g.setColor(Color.red);
	    g.drawString(">>> VERLOREN <<<",WND_B/2-70,WND_H/2+10);
	    g.setColor(Color.white);
	    g.drawString("Das gesuchte Wort war '"+myword+"'!",WND_B/4-100,WND_H/2-10);
	    removeKeyListener(CONTROL);   // Tastenkontrolle abschalten
	    break;
	case 5:
	    g.drawImage(tk.getImage("images/hm5.gif"),SX,SY,this);
	    break;
	case 4:
	    g.drawImage(tk.getImage("images/hm4.gif"),SX,SY,this);
	    break;
	case 3:
	    g.drawImage(tk.getImage("images/hm3.gif"),SX,SY,this);
	    break;
	case 2:
	    g.drawImage(tk.getImage("images/hm2.gif"),SX,SY,this);
	    break;
	case 1:
	    g.drawImage(tk.getImage("images/hm1.gif"),SX,SY,this);
	    break;
	case 0:
	    g.drawImage(tk.getImage("images/hm0.gif"),SX,SY,this);
	    break;
	case -1:
	    g.drawImage(tk.getImage("images/hm.gif"),SX,SY,this);
	    g.setColor(Color.green);
	    g.drawString(">>> GEWONNEN <<<",WND_B/2-70,WND_H/2+10);
	    g.drawString(">>> GEWONNEN <<<",WND_B/2-70,WND_H/2+10);
	    removeKeyListener(CONTROL);
	    break;
	}

    }

    class KL implements KeyListener {
	public void keyPressed(KeyEvent e) { }
	public void keyReleased(KeyEvent e) { }
	public void keyTyped(KeyEvent e) {
	    c=e.getKeyChar();              // Taste holen
	    c=Character.toUpperCase(c);    // Buchstabe(?) evtl. GROß machen
	    int i;                        
	    boolean status=false;        // Booleans
	    boolean check=false;         // für versch. Status-Werte
	    for (i=0;i<alphab.length;i++) {
	    	if (c==alphab[i]) {        // wenn c = einer der Buchstaben des Alphabets ist ...
		    if (probed[i]!=c) probed[i]=c; else check=true;  // und der noch nicht vorher getippt wurde, dann ... u.s.w.
		    if (notprobed[i]==c) notprobed[i]='-';
		}
	    }
	    int underscores=0;            // Integer für Anzahl der "_" im bisherigen Wort
	    for (i=0;i<myword.length();i++) {
		if (c==Character.toUpperCase(myword.charAt(i))) {
		    xyword[i]=myword.charAt(i);
		    status=true;
		}
		if (xyword[i]=='_') underscores++;
	    }
	    if (!status && !check) mistakes++;  // wenn der Buchstabe Falsch ist und nicht schon einmal getippt wurde mistakes+1
	    if (!check) tries++;   // solange kein doppelter Tip: tries+1;
	    if (underscores==0 || mistakes>=6) {
		System.out.println(" ("+myword+")");
		System.out.println("Anzahl Versuche: "+tries+"    davon falsch: "+mistakes);
		System.out.println("Getippte Buchstaben: "+new String(probed));
		System.out.println("Anzahl versch. Buchstaben im Wort: "+(tries-mistakes));
		System.out.println("Trefferquote: "+(((tries-mistakes)*100)/tries)+"%");
	    }
	    if (underscores==0) mistakes=-1;   // wenn keine fehlenden Zeichen im Lösungswort ...
	    if (mistakes>=6) mistakes=6;       // wenn mehr als 5 Fehler gemacht wurden
	    repaint();        // Grafikfenster neuzeichnen
	}
    }
    private static void initializeNewWindow(){
        JFrame frame= new JFrame();       // neues Fenster
        	        frame.addWindowListener(new WindowAdapter() {   // WindowListener hinzufügen
        	            public void windowClosing(WindowEvent e) {  // wenn auf X geklickt:
        	                System.out.println();
        	                System.exit(0);       // Programm beenden.
        	            }
        	        });
        	          	        
        	        frame.setLayout(new BorderLayout());
        	        JPanel buttonPanel = new JPanel();
        	        buttonPanel.setLayout(new FlowLayout());
        	        buttonPanel.setBackground(Color.black);

        	        final JFrame f = frame;
        	        Button button1 = new Button("Nochmal");
        	                       button1.setPreferredSize(new Dimension(80,20));
        	                       button1.addActionListener(new ActionListener() {
        	                       public void actionPerformed(ActionEvent arg0) {
        	                           System.out.print("Nochmal...");
        	                           f.dispose();
                                               initializeNewWindow();
        	                           }
        	      });
        	        Button button2 = new Button("Beenden");
        	        button2.setPreferredSize(new Dimension(80,20));
        	        button2.addActionListener(new ActionListener() {
        	            public void actionPerformed(ActionEvent arg0) {
        	            System.out.print("Bis zum nächsten mal...");
        	            System.exit(0); 
        	            }
        	      });
    
        	        Hangman Jpanel = new Hangman();
        	        frame.add(Jpanel,BorderLayout.CENTER);
        	        frame.setTitle(".:Hangman:.");  // Titel setzen
        	        frame.setSize(WND_B, WND_H);   // Größe setzen
        	        frame.setBackground(Color.black);
        	        frame.setVisible(true);                  // auf den Bildschirm
        	        Jpanel.requestFocusInWindow();
    }       	          
    public void actionPerformed(ActionEvent evt) {
        
        if (evt.getSource() == Spielregeln) {
           System.out.println("Mach Was");
        }
        else if (evt.getSource() == Beenden) {
           System.exit(0);
        }
        else if (evt.getSource() == Nochmal) {
           System.out.println("Programm erstellt von mir");
        }
     } 
	public static void main(String args[]) {
	       Hangman test = new Hangman();
	       test.pack();
	       test.setVisible(true); 
    	   initializeNewWindow();
    	    }

	private void pack() {
		// TODO Auto-generated method stub
		
	} 
}
```


----------



## zerix (20. September 2007)

Vielleicht solltest du auch das machen, was ich gesagt hab.
Du musst die MenuBar deinem Fenster hinzufügen.
Damit es aber mal komplett hier steht.

```
frame.setJMenuBar(hauptMenue);
```

Ich habe auch vorhin gesagt, dass du nicht Swing und AWT komponenten Vermischen solltest.

Du benutzt JFrame(Swing) und eine MenuBar(AWT). Für ein JFrame wäre das die JMenuBar. Alle Swing-Komponenten fangen mit einem J an und heißen genau wie bei AWT.

MFG

zEriX


----------



## moe_joe (20. September 2007)

so hab jetzt das menü usw auch mit swing gemacht (wie du oben sehen kannst) jetzt ist aber wieder das ding seit dem ich das alles in swing geändert habe, krieg ich von compiler fehlermeldungen das an einigen stellen der syntax nicht mehr stimm.


Syntax error on token "catch", Identifier expected line 120
Syntax error on token "CONTROL", VariableDeclaratorId expected after this token line1 26
Syntax error on token(s), misplaced construct 127
Syntax error on tokens, delete these tokens line 127	
Syntax error on token "]", { expectedline 128


----------



## zerix (20. September 2007)

Ich weiß ja nicht was du gemacht hast, aber es sieht aus als hättest du was gelöscht. 


```
{
    int wordcount=0;           // neuer Integer für Wörterzahl
      int wordseek=0;            // ~ für Zielwort-Position
      RandomAccessFile f=new RandomAccessFile("hangman.dat","r");
      String stmp;
    while ((stmp=f.readLine())!=null) {  // solange das, was wir lesen, noch
                                          // sichtbar ist
    if (stmp.charAt(0) != '#') {      // und wenn kein '#' am anfang steht
        wordcount++;                  // zähle es als Wort
    }
```

So beginnt nämlich keine Methode. Zu dem catch fehlt auch das try. Deshalb kommen die Fehler und nicht weil du jetzt die Swingklassen benutzt.

MFG

zEriX


----------



## moe_joe (21. September 2007)

ups, hatte da was übersehen, da fehlt wirklich nen stück^^ so soll das aussehen


```
public Hangman() {                // Hauptroutine
    
	String stmp=new String();
	try {
		int wordcount=0;           // neuer Integer für Wörterzahl
	    int wordseek=0;            // ~ für Zielwort-Position
	    RandomAccessFile f=new RandomAccessFile("hangman.dat","r");
	    while ((stmp=f.readLine())!=null) {  // solange das, was wir lesen, noch sichtbar ist
		if (stmp.charAt(0) != '#') {      // und wenn kein '#' am anfang steht
		    wordcount++;                  // zähle es als Wort
		}  
	    }
	    if (wordcount==0) {
	    	System.out.println("ACHTUNG! In der Datendatei sind keine gültigen Wörter zu finden.");
	    	System.exit(0);
	    }
	    System.out.println("Woerter in Datendatei: "+wordcount);  // Statusbericht
	    while (wordseek==0) {    // Solange wordseek noch 0 ist, tue ...
		wordseek=(int)(Math.random()*wordcount)+1;  // hol' Dir einen Integer-Wert
	    }
	    System.out.print("Ausgewaehltes Wort: #"+wordseek);  // Statusbericht
	    f.seek(0);      // Position auf Dateianfang setzen
	    wordcount=0;    // Wieder auf NULL

	    while ((stmp=f.readLine())!=null) {   // und das ganze von vorne
		if (stmp.charAt(0) != '#') {
		    wordcount++;
		    if (wordcount==wordseek) {     // wenn an der Position, die wir suchen ...
			myword=stmp;               // setze myword auf gerade gelesenen String
			break;                    
		    }
		}
	    }
	    f.close();         // Datei wieder schließen
	}
	 bar = new JMenu();
     datei = new JMenu("Datei");
     info = new JMenu("Info");
     nochmal = new JMenuItem("Neu starten");
     beenden = new JMenuItem("Beenden");
     spielregeln = new JMenuItem("Hilfe");
     text = new JLabel("Diese Anwendung demonstriert die Verwendung von Menüs");   
     setJMenuBar(bar);   
     bar.add(datei);
     bar.add(info);   
     datei.add(nochmal);
     datei.add(beenden);    
     info.add(spielregeln);
     getContentPane().add(text);
     beenden.addActionListener(this);
     nochmal.addActionListener(this);
     spielregeln.addActionListener(this);
     
     setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
    
    public void actionPerformed(ActionEvent evt) {
       
       if (evt.getSource() == nochmal) {
          System.out.println("Neu starten");
       }
       else if (evt.getSource() == beenden) {
          System.exit(0);
       }
       else if (evt.getSource() == spielregeln) {
          System.out.println("Spielregeln");
       }
    }
   
    public static void main(String[] args) {
       
       Hangman test = new Hangman();
       test.pack();
       test.setVisible(true);
    }
```


----------



## zerix (21. September 2007)

Funktioniert es jetzt oder nicht?

Du solltest die Menubar nicht dem Panel sondern dem Fenster adden.


```
frame.setJMenuBar()
```

MFG

zEriX


----------



## moe_joe (21. September 2007)

also das mit der menüleiste hab ich jetzt soweit hinbekommen. Allerdings tut sich jetzt das nächste problem auf. seitdem ich die menüleiste jetzt mit swing gemacht habe krieg ich beim auslesen der HANGMAN.DAT datei mit dem RandomAccessFile  immer die fehlermeldung er kann die daten nicht lesen. das problem ist, ich weis nicht wo ich jetzt nach dem fehler suchen soll weil eigentlich hab ich beim randomaccessfile nichts verändert. Der compiler selbst gibt mir auch keine fehlermeldung aus. 


```
public class Hangman extends JFrame implements ActionListener {
     
   private static final long serialVersionUID = 1L;
   // Globale Variablen
   final static int WND_B=435, WND_H=360;
   final int SX=50, SY=50;
   RandomAccessFile file;
   String myword=null;  // das zu erratene wort
   char xyword[];        // das ungelöste Wort
   char probed[];
   char notprobed[];
   char alphab[]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N',
                  'O','P','Q','R','S','T','U','V','W','X','Y','Z',
                  'Ä','Ö','Ü','ß'};
      
   int mistakes=0;  // Anzahl der Fehler
   int tries=0;     // Anzahl der Versuche
   KL CONTROL;
   char c;
   private JMenu bar = null;
   private JMenu datei = null;
   private JMenu info = null;
   private JMenuItem nochmal = null;
   private JMenuItem beenden = null;
   private JMenuItem spielregeln = null;
   private JLabel text = null;

   public Hangman() {  // Hauptroutine
      String stmp=new String();
        try {
           int wordcount=0;           // neuer Integer für Wörterzahl
           int wordseek=0;            // ~ für Zielwort-Position
           RandomAccessFile f=new RandomAccessFile("hangman.dat","r");
           
           // solange das, was wir
         // lesen, noch sichtbar ist
           while ((stmp=f.readLine())!=null) {

              // und wenn kein '#' am anfang steht
              if (stmp.charAt(0) != '#') {     
                 wordcount++;                  // zähle es als Wort
              }
     
              if (wordcount==0) {
                 System.out.println("ACHTUNG! In der Datendatei sind keine gültigen Wörter zu finden.");
                 System.exit(0);
              }
              
              System.out.println("Woerter in Datendatei: "+wordcount);  // Statusbericht
                while (wordseek==0) {   
               // hol' Dir einen Integer-Wert
               wordseek=(int)(Math.random()*wordcount)+1; 
            }

                System.out.print("Ausgewaehltes Wort: #"+wordseek);  // Statusbericht
                f.seek(0);      // Position auf Dateianfang setzen
                wordcount=0;    // Wieder auf NULL

                // und das ganze von vorne
                while ((stmp=f.readLine())!=null) {   
                   if (stmp.charAt(0) != '#') {
                      wordcount++;
                      
                      if (wordcount==wordseek) {     
                         // setze myword auf gerade gelesenen String
                         myword=stmp;               
                         break;                   
                      }
                   }
                }
                f.close();         // Datei wieder schließen
                     
                     
           }
         

        }catch (IOException e){
           e.printStackTrace();
        }
                     
        bar = new JMenu();
        datei = new JMenu("Datei");
        info = new JMenu("Info");
        nochmal = new JMenuItem("Neu starten");
        beenden = new JMenuItem("Beenden");
        spielregeln = new JMenuItem("Hilfe");
        text = new JLabel("Diese Anwendung demonstriert die Verwendung von Menüs");   
                     
        JMenuBar menubar = new JMenuBar();
        menubar.add(bar);
                     
        setJMenuBar(menubar);
        bar.add(datei);
        bar.add(info);   
        datei.add(nochmal);
        datei.add(beenden);   
        info.add(spielregeln);
        getContentPane().add(text);
        beenden.addActionListener(this);
        nochmal.addActionListener(this);
        spielregeln.addActionListener(this);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
       
        KeyListener control=new KL();
        addKeyListener(control);
       
        xyword=new char[myword.length()];      // array erstellen
        // array initialisieren
        for (int i=0;i<myword.length();i++) {
           xyword[i]='_';
        }   
       
        // array erstellen
        probed=new char[alphab.length];
        notprobed=new char[alphab.length];
       
        // array initialisieren
        for (int i=0;i<alphab.length;i++) {           
           probed[i]='-';
           notprobed[i]=alphab[i];
        }
                   
   }
   
   public void actionPerformed(ActionEvent evt) {
      if (evt.getSource() == nochmal) {
         System.out.println("Neu starten");
      } else if (evt.getSource() == beenden) {
         System.exit(0);
      } else if (evt.getSource() == spielregeln) {
         System.out.println("Spielregeln");
      }
   }
   
   public static void main(String[] args) {
      Hangman test = new Hangman();
      test.pack();
      test.setVisible(true);
   }
         
   public void update(Graphics g) {
      paint(g);
   }
             
   public void paint(Graphics g) {     
      // die Grafiken
       Toolkit tk=Toolkit.getDefaultToolkit();
       // g.drawString("Datensaetze: "+maxdat,40,350);
       // g.drawString("Wort: "+myword,40,200);
       // g.drawString("Zeichen: "+c,40,230);
       g.setColor(Color.black);           // Farbe auf Weiß
       g.fillRect(0,0,WND_B,WND_H);       // Fenster Weiß machen
       g.drawImage(tk.getImage("images/bg.gif"),1,1,this);
       g.drawString("Wort: "+new String(xyword),40,215);
       if (mistakes!=-1) {
          g.drawString("Buchstaben: ",40,260);
          for (int i=0;i<alphab.length;i++) {
             g.drawChars(probed,i,1,118+i*8,260);
             g.drawChars(notprobed,i,1,118+i*8,275);
          }
          g.drawString("Fehler: "+mistakes,40,230);
       }
       UpdateHangMan(g);    // Hangman updaten
   }

   public void UpdateHangMan(Graphics g) {
      Toolkit tk=Toolkit.getDefaultToolkit(); // Toolkit (für
                                    // Grafikdatei-Support)
                                    // zuweisen
      switch(mistakes) {
      // CASE mistakes of ...
           case 6:
              g.drawImage(tk.getImage("images/hm6.gif"),SX,SY,this);
              g.setColor(Color.red);
              g.drawString(">>> VERLOREN <<<",WND_B/2-70,WND_H/2+10);
              g.setColor(Color.white);
              g.drawString("Das gesuchte Wort war '"+myword+"'!",WND_B/4-100,WND_H/2-10);
              removeKeyListener(CONTROL);   // Tastenkontrolle abschalten
               break;
           case 5:
              g.drawImage(tk.getImage("images/hm5.gif"),SX,SY,this);
              break;
           case 4:
              g.drawImage(tk.getImage("images/hm4.gif"),SX,SY,this);
              break;
           case 3:
              g.drawImage(tk.getImage("images/hm3.gif"),SX,SY,this);
              break;
           case 2:
              g.drawImage(tk.getImage("images/hm2.gif"),SX,SY,this);
              break;
           case 1:
              g.drawImage(tk.getImage("images/hm1.gif"),SX,SY,this);
              break;
           case 0:
              g.drawImage(tk.getImage("images/hm0.gif"),SX,SY,this);
              break;
           case -1:
              g.drawImage(tk.getImage("images/hm.gif"),SX,SY,this);
              g.setColor(Color.green);
              g.drawString(">>> GEWONNEN <<<",WND_B/2-70,WND_H/2+10);
              removeKeyListener(CONTROL);
              break;
      }
   }

   class KL implements KeyListener {
      
      public void keyPressed(KeyEvent e) {
         
      }
      
      public void keyReleased(KeyEvent e) {
         
      }
      
      public void keyTyped(KeyEvent e) {
         c=e.getKeyChar();              // Taste holen
         c=Character.toUpperCase(c);    // Buchstabe(?) evtl.
                                          // GROß machen
         int i;                       
         boolean status=false;        // Booleans
         boolean check=false;         // für versch.
                                          // Status-Werte
         for (i=0;i<alphab.length;i++) {
            if (c==alphab[i]) { // wenn c = einer der
                           // Buchstaben des Alphabets
                           // ist ...
               
               //    und der noch nicht vorher getippt wurde, dann ...
               // u.s.w.
               if (probed[i]!=c)
                  probed[i]=c;
               else
                  check=true; 
               if (notprobed[i]==c)
                  notprobed[i]='-';
            }
         }
         // Integer für Anzahl der "_" im bisherigen Wort
         int underscores=0;           
         
         for (i=0;i<myword.length();i++) {
            if (c==Character.toUpperCase(myword.charAt(i))) {
               xyword[i]=myword.charAt(i);
               status=true;
            }
            
            if (xyword[i]=='_')
               underscores++;
         }
         
         // wenn der Buchstabe Falsch ist und nicht schon einmal
         // getippt wurde mistakes+1
         if (!status && !check)
            mistakes++;

         // solange kein doppelter Tip:
         // tries+1;
         if (!check)
            tries++;   

         if (underscores==0 || mistakes>=6) {
            System.out.println(" ("+myword+")");
            System.out.println("Anzahl Versuche: "+tries+"    davon falsch: "+mistakes);
            System.out.println("Getippte Buchstaben: "+new String(probed));
            System.out.println("Anzahl versch. Buchstaben im Wort: "+(tries-mistakes));
            System.out.println("Trefferquote: "+(((tries-mistakes)*100)/tries)+"%");
         }
         
         // wenn keine fehlenden Zeichen im Lösungswort ...
         if (underscores==0)
            mistakes=-1;   

         // wenn mehr als 5 Fehler gemacht wurden
         if (mistakes>=6)
            mistakes=6;       
      
         repaint();        // Grafikfenster neuzeichnen
      }
   }
}
```


----------



## moe_joe (24. September 2007)

hat denn keiner ne idee warum ich immer diese fehlermeldung bekomme? verzweifel schon fast daran.


----------



## zerix (24. September 2007)

Kannst du die Fehlermeldung mal posten? Das die Fehlermeldung kommt hat sicher nichts mit der Umstellung auf Swing zu tun.


MFG

zEriX


----------



## moe_joe (24. September 2007)

Ausgewaehltes Wort: #1IOException: java.io.IOException: Read error

Fehler beim Bearbeiten der Datendatei. Stellen Sie sicher, daß die Datei HANGMAN.DAT auch existiert und lesbar ist.


----------



## moe_joe (24. September 2007)

also der debugger sagt mir "RandomAccessFile.read() line: not available [native method] Source not found" so, wenn ich dann versuche "Edit Source Lookup Path" und versuch ihm die quelle anzugeben findet er die datei nicht. obwohl ich WEIS das die datei sich dort befinden muss. kennt jemand das problem?


----------



## zerix (24. September 2007)

Der Fehler kommt, weil du 
	
	
	



```
f.close()
```
 aufrufst und dann nochmal lesen willst aus der Datei.

MFG

zEriX


----------



## zerix (24. September 2007)

Du kannst dir nur die Sourcen von den Java-Klassen anschauen, wenn du die Sourcen dazu auch hast. Ich denke mal, dass die Datei die du angegeben hast, nicht die Java-Klassen beinhaltet.

MFG

zEriX


----------



## moe_joe (24. September 2007)

zerix hat gesagt.:


> Der Fehler kommt, weil du
> 
> 
> 
> ...



wo liest er denn später nochmal aus der datei? das mir grad nen rätsel. er liest doch nur am anfang einmal das wort zu erratene wort aus.


----------



## zerix (24. September 2007)

```
f.close()
```
 steht in einer Schleife.
Diese beginnt danach nochmal von vorne.

MFG

zEriX


----------



## moe_joe (24. September 2007)

so, hab das f.close mal entfernt und jetzt startet er immerhin das programm. Allerdings zeigt er mir keine menüleiste an und das fenster wird in einer "belibiegen" größe dargestellt. kann das fenster in der größe verändern usw...


----------



## zerix (24. September 2007)

Hallo,

das kannst du alles hier nachschauen.

http://www.galileocomputing.de/open...14_002.htm#mj3cd6456bd73f1bc863d301e7ebc60d98

MFG

zEriX


----------



## zerix (24. September 2007)

Dein Menu solltest du so aufbauen


```
datei = new JMenu("Datei");
    info = new JMenu("Info");
    nochmal = new JMenuItem("Neu starten");
    beenden = new JMenuItem("Beenden");
    spielregeln = new JMenuItem("Hilfe");

    JMenuBar menubar = new JMenuBar();

    setJMenuBar(menubar);
    menubar.add(datei);
    menubar.add(info);
    datei.add(nochmal);
    datei.add(beenden);
    info.add(spielregeln);
```

Du hattest vorher noch ein JMenu namens bar, dem hast du aber keinen String übergeben, deshalb ist die MenuBar ziemlich dünn und kaum sichtbar.

Dann solltest du die ganze restliche darstellung in ein JPanel packen. Also eine eigene Klasse von der Klasse JPanel ableiten und dort alles machen. Dieses Panel fügst du dann einem JFrame hinzu.

Dass du 
	
	
	



```
f.close()
```
 gelöscht hast ist schlecht, weil die Datei jetzt nicht mehr geschlossen wird. Du hättest es nur hinter die Schleife schreiben müssen.

MFG

zEriX


----------



## MiMi (24. September 2007)

@moe_joe

Kann es sein das du noch sehr unerfahren bist in Bezug auf (grafische) programmierung? Vielleicht solltest du dich ein wenig mehr mit den Grundlagen vertraut machen, und vielleicht auch ein paar tutorials durcharbeiten.
Net voese gemeint.

gr MiMi


----------



## moe_joe (24. September 2007)

mimij85 hat gesagt.:


> @moe_joe
> 
> Kann es sein das du noch sehr unerfahren bist in Bezug auf (grafische) programmierung? Vielleicht solltest du dich ein wenig mehr mit den Grundlagen vertraut machen, und vielleicht auch ein paar tutorials durcharbeiten.
> Net voese gemeint.
> ...



also 1. ja da hast du recht sind meine ersten anfänge mit oop
2. du bistn jetzt der X'te der mir sagt "setzt dich mit den grundlagen auseinander".
3. hilft mir bei meinen problem auch nicht weiter. dauert halt seine zeit bis man alles lernt.

das ding is halt ich muss das programm irgendwie zum laufen bekommen und kann nich sagen och fangen wir ersma langsam mit dem grundlagen an. Ich les mich ja durch viele tutorials... und probier das grundlegende ersmal zu verstehen, aber da ist das immer so "einfach" da wird dann NUR ein menü o.ä. initialisiert. und ich muss halt gucken wie ich da sin meinen laufen quellcode reinbekomme.


----------



## zerix (24. September 2007)

Das Problem ist aber, dass du in jedem Tutorial/Beispiel welches du über google finden kannst, siehst wie man die Größe eines Fensters oder generell jeder Component setzt. Wenn jemand dann so Fragen stellt, kommt man sich schon ein bischen verar.... vor und es macht den Eindruck als würde er sich absolut keine Gedanken machen und nicht mal ein bischen mühe geben danach zu suchen.
Also ich möchte dir auf keinen Fall was unterstellen, aber dieser Eindruck macht sich langsam breit.

MFG

zEriX


----------



## MiMi (24. September 2007)

moe_joe hat gesagt.:


> also 1. ja da hast du recht sind meine ersten anfänge mit oop
> 2. du bistn jetzt der X'te der mir sagt "setzt dich mit den grundlagen auseinander".
> 3. hilft mir bei meinen problem auch nicht weiter. dauert halt seine zeit bis man alles lernt.



zu 2. Dann bin ich wohl dann DIE erste die das sagt

zu 3. Doch das hilft dir weiter, auch wenn die Grundlagen langweilig und nervig sind, und es dir keinen Spass macht, ein Tutorial durchzuarbeiten. Grundlagen braucht man nunmal. Auch wenn du es mit einem kleinen Spiel versuchst, siehst du ja das du selbst bei den kleinsten Sachen scheiterst (wie halt zb das Aendern der groesse vom Fenster).


----------



## zerix (24. September 2007)

@mimij85
Man kann hier leider nicht erkennen, dass du weiblich bist. ;-)

MFG

zEriX


----------



## MiMi (24. September 2007)

Sorry, aber es wird immer davon ausgegangen das man maennlich ist , als ob nur Kerle programmieren (koennten).


----------



## moe_joe (24. September 2007)

haben hier auf der arbeit auch programmiererinnen^^ hab grad mal meinen ausbilder gefragt, selbst der weis mein problem nicht zu lösen... wie soll ich da in tutorials hilfe finden? 

aktuell hab ich nen problem mit dem einlesen der wörter. Wenn ich ein wort in meiner wörterliste drinne hab, dann läuft das programm. sobald ich aber zwei wörter drinne hab gibs ne entlosschleife vom compiler. 


```
public Hangman() {  // Hauptroutine
      String stmp=new String();
        try 
        {
           int wordcount=0;           // neuer Integer für Wörterzahl
           int wordseek=0;            // ~ für Zielwort-Position
           RandomAccessFile f=new RandomAccessFile("hangman.dat","r");
           
           // solange das, was wir
           // lesen, noch sichtbar ist
           while ((stmp=f.readLine())!=null) 
           {
        	   	// und wenn kein '#' am anfang steht
        	   	if (stmp.charAt(0) != '#') 
        	   		{     
        	   			wordcount++;// zähle es als Wort
        	   		}
     
        	   	if (wordcount==0) 
        	   		{
        	   			System.out.println("ACHTUNG! In der Datendatei sind keine gültigen Wörter zu finden.");
        	   		}
              
        	   	System.out.println("Woerter in Datendatei: "+wordcount); // Statusbericht
                while (wordseek==0) 
               		{   
                		wordseek=(int)(Math.random()*wordcount)+1;// hol' Dir einen Integer-Wert
               		}

                System.out.print("Ausgewaehltes Wort: #"+wordseek);  // Statusbericht
                f.seek(0);      // Position auf Dateianfang setzen
                wordcount=0;    // Wieder auf NULL
                
                // und das ganze von vorne
                while ((stmp=f.readLine())!=null) 
                	{   
                	if (stmp.charAt(0) != '#') 
                		{
                			wordcount++;
                      
                			if (wordcount==wordseek) 
                				{     
                					// setze myword auf gerade gelesenen String
                					myword=stmp;               
                					break;                   
                				}
                		}
                	}            
           	} 
        f.close();   
        }
```


----------



## zerix (24. September 2007)

Mal kurz dein ProgrammCode in Worten. Du hast eine Schleife die über die Datei läuft und abbricht sobald das Ende der Datei erreicht ist. In dieser Schleife setzt du den Zeiger der Datei wieder auf den Anfang der Datei und eine zweite Schleife startet die auch abbrechen soll, wenn das Ende der Datei erreicht ist. In dieser Schleife gibt es eine if-Anweisung, die diese Schleife abbricht, wenn der wordcount == wordseek ist. wordseek ist im ersten durchlauf 1. wordcount wird immer hochgezählt, wenn ein wort gefunden wird. D. h. wenn das erste Wort gefunden wird, wird diese Schleife abgebrochen. Die äußere Schleife kommt wieder zum Zug und alles startet wieder von vorne.


Also grob gesagt, dadurch, dass du den Zeiger der Datei immer wieder auf den Anfang der Datei setzt, kann die äußere Schleife nie beendet werden.

MFG

zEriX


----------



## moe_joe (25. September 2007)

da hätt ich ausnahmsweise auch mal drauf kommen können habs jetzt ein wenig verändert und es klappt. diese ganzen ineinander verschachtelten schleifen ... das kann doch garnich klappen^^


```
public Hangman() // Hauptroutine
   {  
      String stmp=new String();
      try 
      	{
           int wordcount=0;           // neuer Integer für Wörterzahl
           int wordseek=0;            // ~ für Zielwort-Position
           RandomAccessFile f=new RandomAccessFile("hangman.dat","r"); 
           
           while ((stmp=f.readLine())!=null) //Einlesen der Datensätze
           		{
        	   		wordcount++;
     
        	   		if (wordcount==0) //Wenn kein Wort gefunden wurde, Fehlermeldung ausgeben
        	   			{
        	   				System.out.println("ACHTUNG! In der Datendatei sind keine gültigen Wörter zu finden!");
        	   			}

        	   		System.out.println("Woerter in Datendatei: "+wordcount); // Statusbericht über Anzahl der Wörter
        	   	
           		}
            
           if (wordseek==0) 
               {   
        	   		wordseek=(int)(Math.random()*wordcount)+1;// Bestimmt zufälliges Wort aus den Eingelesenen Wörtern
               }
           
           System.out.print("Ausgewaehltes Wort: #"+wordseek);  // Gibt Statusbericht über ausgewähltes Wort
           wordcount=0;    // Setzt anzahl der Wörter wieder auf NULL
                
           while ((stmp=f.readLine())!=null) 
           	   {   
        	   		wordcount++;
        	   		
        	   		if (wordcount==wordseek) 
           	   	   		{     
        	   				myword=stmp;               
        	   				break;                   
           	   	   		}
           	   }
        }////////////////////////////Ende von try////////////////////////////////
       
        catch(IOException ioe) // Falls ein Fehler auftreten sollte Fehlermeldung ausgeben
        	{
        		System.out.println("IOException: "+ioe.toString());  // Fehlermeldung
        		System.out.println("\n\nFehler beim Bearbeiten der Datendatei. Stellen Sie sicher, daß die Datei HANGMAN.DAT auch existiert und lesbar ist.");
        		System.exit(0);//Beenden
        	}            
        bar = new JMenu();
        datei = new JMenu("Datei");
        info = new JMenu("Info");
        nochmal = new JMenuItem("Neu starten");
        beenden = new JMenuItem("Beenden");
        spielregeln = new JMenuItem("Hilfe");
        text = new JLabel("Hangman");               
        JMenuBar menubar = new JMenuBar();
        menubar.add(bar);               
        setJMenuBar(menubar);
        bar.add(datei);
        bar.add(info);   
        datei.add(nochmal);
        datei.add(beenden);   
        info.add(spielregeln);
        getContentPane().add(text);
        beenden.addActionListener(this);
        nochmal.addActionListener(this);
        spielregeln.addActionListener(this);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
       
        KeyListener control=new KL();
        addKeyListener(control);
       
        xyword=new char[myword.length()]; // array erstellen
        for (int i=0;i<myword.length();i++) // array initialisieren
        	{
        		xyword[i]='_';
        	}   
        
        // array erstellen
        probed=new char[alphab.length];
        notprobed=new char[alphab.length];
       
        // array initialisieren
        for (int i=0;i<alphab.length;i++) 
        	{           
        		probed[i]='-';
        		notprobed[i]=alphab[i];
        	}
                   
   }///////////////////// Ende der Hauptroutine////////////////////
   
   
   public void actionPerformed(ActionEvent evt) 
   	{
	   if (evt.getSource() == nochmal) 
	   	{
		   System.out.println("Neu starten");
	   	} 
	   else if (evt.getSource() == beenden) 
	   	{
		   System.exit(0);
	   	} 
	   else if (evt.getSource() == spielregeln) 
	   	{
         System.out.println("Spielregeln");
	   	}
    }
   
   public static void main(String[] args) 
   	{
	   JFrame frame = new JFrame("Hangman");
	   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	   frame.setSize(435, 360);
	   frame.setVisible(true);
	   frame.requestFocusInWindow();
   	}
         
   public void update(Graphics g) 
   	{
	   paint(g);
   	}	
             
   public void paint(Graphics g) // die Grafiken
   {     
       Toolkit tk=Toolkit.getDefaultToolkit();
       g.setColor(Color.black);           // Setzt Farbe auf Schwarz
       g.fillRect(0,0,WND_B,WND_H);       // Fenster Weiß machen
       g.drawImage(tk.getImage("http://www.tutorials.de/forum/images/bg.gif"),1,1,this);
       g.drawString("Wort: "+new String(xyword),40,215);
       if (mistakes!=-1) 
       	{
    	   g.drawString("Buchstaben: ",40,260);
    	   
    	   for (int i=0;i<alphab.length;i++) 
    	   	{
    		   g.drawChars(probed,i,1,118+i*8,260);
    		   g.drawChars(notprobed,i,1,118+i*8,275);
    	   	}
    	   
           g.drawString("Fehler: "+mistakes,40,230);
       	}
       UpdateHangMan(g);    // Hangman updaten
   }
   
   public void UpdateHangMan(Graphics g) 
   	{
      Toolkit tk=Toolkit.getDefaultToolkit(); // Toolkit (für
                                              // Grafikdatei-Support)
                                              // zuweisen
      switch(mistakes) //Verschiedenen Fälle für Fehlermeldungen
      	{
           case 6:
              g.drawImage(tk.getImage("http://www.tutorials.de/forum/images/hm6.gif"),SX,SY,this);
              g.setColor(Color.red);
              g.drawString(">>> VERLOREN <<<",WND_B/2-70,WND_H/2+10);
              g.setColor(Color.white);
              g.drawString("Das gesuchte Wort war '"+myword+"'!",WND_B/4-100,WND_H/2-10);
              removeKeyListener(CONTROL);
               break;
           case 5:
              g.drawImage(tk.getImage("http://www.tutorials.de/forum/images/hm5.gif"),SX,SY,this);
              break;
           case 4:
              g.drawImage(tk.getImage("http://www.tutorials.de/forum/images/hm4.gif"),SX,SY,this);
              break;
           case 3:
              g.drawImage(tk.getImage("http://www.tutorials.de/forum/images/hm3.gif"),SX,SY,this);
              break;
           case 2:
              g.drawImage(tk.getImage("http://www.tutorials.de/forum/images/hm2.gif"),SX,SY,this);
              break;
           case 1:
              g.drawImage(tk.getImage("http://www.tutorials.de/forum/images/hm1.gif"),SX,SY,this);
              break;
           case 0:
              g.drawImage(tk.getImage("http://www.tutorials.de/forum/images/hm0.gif"),SX,SY,this);
              break;
           case -1:
              g.drawImage(tk.getImage("http://www.tutorials.de/forum/images/hm.gif"),SX,SY,this);
              g.setColor(Color.green);
              g.drawString(">>> GEWONNEN <<<",WND_B/2-70,WND_H/2+10);
              removeKeyListener(CONTROL);
              break;
      	}
  	}
   
   
   class KL implements KeyListener 
   	{
      
      public void keyPressed(KeyEvent e) 
      	{
         
      	}
      
      public void keyReleased(KeyEvent e) 
      	{
         
      	}
      
      public void keyTyped(KeyEvent e) 
      	{
    	  c=e.getKeyChar();              // Taste holen
    	  c=Character.toUpperCase(c);    // Buchstabe(?) evtl.
                                          // GROß machen
    	  int i;                       
    	  boolean status=false;        // Booleans
    	  boolean check=false;         // für versch.
                                          // Status-Werte
    	  for (i=0;i<alphab.length;i++) 
    	  	{
    		  if (c==alphab[i]) // wenn c = einer der Buchstaben
    		  	{               //des Alphabets ist
    			  	if (probed[i]!=c)
    			  		probed[i]=c;
    			  	else
    			  		check=true; 
    			  	if (notprobed[i]==c)
    			  		notprobed[i]='-';
    		    }
    	  	 }

    	  int underscores=0; // Integer für Anzahl der "_" im bisherigen Wort
      
    	  for (i=0;i<myword.length();i++) //"Verschlüsseln" des Ratewortes
      		{
    		  	if (c==Character.toUpperCase(myword.charAt(i))) 
            		{
    		  			xyword[i]=myword.charAt(i);
    		  			status=true;
            		}
            
    		  	if (xyword[i]=='_')
    		  		underscores++;
      		}
         

    	  	if (!status && !check)// wenn der Buchstabe Falsch ist und nicht schon einmal
    	  		mistakes++;       //Getippt wurde Fehler +1

    	  	if (!check)
    	  		tries++;   

    	  	if (underscores==0 || mistakes>=6) 
    	  		{
    	  			System.out.println(" ("+myword+")");
    	  			System.out.println("Anzahl Versuche: "+tries+"    davon falsch: "+mistakes);
    	  			System.out.println("Getippte Buchstaben: "+new String(probed));
    	  			System.out.println("Anzahl versch. Buchstaben im Wort: "+(tries-mistakes));
    	  			System.out.println("Trefferquote: "+(((tries-mistakes)*100)/tries)+"%");
    	  		}
         
    	  	if (underscores==0) // wenn keine fehlenden Zeichen im Lösungswort sind
    	  		mistakes=-1;   

    	  	if (mistakes>=6)// wenn mehr als 5 Fehler gemacht wurden
    	  		mistakes=6;       
      
    	  	repaint();        // Grafikfenster neuzeichnen
      	}
    }
}
```

jetzt hab ich noch ein problem mit dem fenster. das JFrame wird zwar erstellt und kommt auf den display, allerdings ist es leer und dort wird nichts angezeigt.blick grad nich mehr durch wo ich meinem hangman spielfeld und dem menü den frame zuweise kann.


----------



## zerix (25. September 2007)

Ich hab dir doch gesagt was du machen sollst. Mach alles was dein Spielfeld ist, in eine extra Klasse die du von Component ableitest. 

Du kannst dann davon ein Object nachher deinem JFrame zuweisen.

MFG

zEriX


----------



## moe_joe (25. September 2007)

jetzt ist nur noch die sache, das wenn ich compilier krieg ich keine fehlermeldung mehr ausgegeben. lediglich in der console steht: Exception in thread "main" java.lang.NullPointerException
at Hangman.<init>(Hangman.java:89)
->xyword=new char[myword.length()];

at Hangman.main(Hangman.java:166)
->Hangman Jpanel = new Hangman();


```
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

public class Hangman extends JPanel implements ActionListener
{
     
   private static final long serialVersionUID = 1L;
   // Globale Variablen
   final static int WND_B=435, WND_H=360;
private static final int EXIT_ON_CLOSE = 0;
   final int SX=50, SY=50;
   RandomAccessFile file;
   String myword=null;  // das zu erratene wort
   char xyword[];        // das ungelöste Wort
   char probed[];
   char notprobed[];
   char alphab[]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N',
                  'O','P','Q','R','S','T','U','V','W','X','Y','Z',
                  'Ä','Ö','Ü','ß'};
     
   int mistakes=0;  // Anzahl der Fehler
   int tries=0;     // Anzahl der Versuche
   KL CONTROL;
   char c;
   private static JMenu bar = null;
   private static JMenu datei = null;
   private static JMenu info = null;
   private static JMenuItem nochmal = null;
   private static JMenuItem beenden = null;
   private static JMenuItem spielregeln = null;
   public Hangman() // Hauptroutine
   { 
      String stmp=new String();
      try
         {
           int wordcount=0;           // neuer Integer für Wörterzahl
           int wordseek=0;            // ~ für Zielwort-Position
           RandomAccessFile f=new RandomAccessFile("hangman.dat","r");
           
           while ((stmp=f.readLine())!=null) //Einlesen der Datensätze
                 {
                    wordcount++;
     
                    if (wordcount==0) //Wenn kein Wort gefunden wurde, Fehlermeldung ausgeben
                       {
                          System.out.println("ACHTUNG! In der Datendatei sind keine gültigen Wörter zu finden!");
                       }

                    System.out.println("Woerter in Datendatei: "+wordcount); // Statusbericht über Anzahl der Wörter
                 
                 }
           
           if (wordseek==0)
               {   
                    wordseek=(int)(Math.random()*wordcount)+1;// Bestimmt zufälliges Wort aus den Eingelesenen Wörtern
               }
           
           System.out.print("Ausgewaehltes Wort: #"+wordseek);  // Gibt Statusbericht über ausgewähltes Wort
           wordcount=0;    // Setzt anzahl der Wörter wieder auf NULL
               
           while ((stmp=f.readLine())!=null)
                 {   
                    wordcount++;
                    
                    if (wordcount==wordseek)
                             {     
                          myword=stmp;               
                          break;                   
                             }
                 }
        }//Ende von try
       
        catch(IOException ioe) // Falls ein Fehler auftreten sollte Fehlermeldung ausgeben
           {
              System.out.println("IOException: "+ioe.toString());  // Fehlermeldung
              System.out.println("\n\nFehler beim Bearbeiten der Datendatei. Stellen Sie sicher, daß die Datei HANGMAN.DAT auch existiert und lesbar ist.");
              System.exit(0);//Beenden
           }
       
        KeyListener control=new KL();
        addKeyListener(control);
       
        xyword=new char[myword.length()]; // array erstellen
        for (int i=0;i<myword.length();i++) // array initialisieren
           {
              xyword[i]='_';
           }   
       
        // array erstellen
        probed=new char[alphab.length];
        notprobed=new char[alphab.length];
       
        // array initialisieren
        for (int i=0;i<alphab.length;i++)
           {           
              probed[i]='-';
              notprobed[i]=alphab[i];
           }
   }//Ende der Hauptroutine
   
   
   private static void initializeNewWindow()
   {
      final JFrame frame = new JFrame("Hangman");
       frame.setTitle(".:Hangman:.");  // Titel setzen
       frame.setSize(435,360);   // Größe setzen
       frame.setBackground(Color.black);
       frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
       frame.setLayout(new BorderLayout());
       Hangman Jpanel = new Hangman();
       frame.add(Jpanel,BorderLayout.CENTER);
       Jpanel.requestFocusInWindow();
       final JMenuBar hauptMenue = new JMenuBar();
       Jpanel.add(hauptMenue);
       getContentPane().add(Jpanel);
       frame.setVisible(true);   
       bar = new JMenu();
       datei = new JMenu("Datei");
       info = new JMenu("Info");
       nochmal = new JMenuItem("Neu starten");
       beenden = new JMenuItem("Beenden");
       spielregeln = new JMenuItem("Hilfe");           
       hauptMenue.add(bar); 
       bar.add(datei);
       bar.add(info);   
       datei.add(nochmal);
       datei.add(beenden);   
       info.add(spielregeln);
       beenden.addActionListener(null);
       nochmal.addActionListener(null);
       spielregeln.addActionListener(null);
       initializeNewWindow();
   }

   private static Container getContentPane()
      {
         // TODO Auto-generated method stub
         return null;
      }

   public void actionPerformed(ActionEvent evt)
   {
      if (evt.getSource() == nochmal)
         {
            System.out.println("Neu starten");
         }
      else if (evt.getSource() == beenden)
         {
            System.exit(0);
         }
      else if (evt.getSource() == spielregeln)
         {
            System.out.println("Spielregeln");
         }
   }

   
   public static void main(String[] args)
      {
      Hangman test = new Hangman();
       test.setVisible(true);
      initializeNewWindow();
      }

public void update(Graphics g)
      {
      paint(g);
      }   
             
   public void paint(Graphics g) // die Grafiken
   {     
       Toolkit tk=Toolkit.getDefaultToolkit();
       g.setColor(Color.black);           // Setzt Farbe auf Schwarz
       g.fillRect(0,0,WND_B,WND_H);       // Fenster Weiß machen
       g.drawImage(tk.getImage("images/bg.gif"),1,1,this);
       g.drawString("Wort: "+new String(xyword),40,215);
       if (mistakes!=-1)
          {
          g.drawString("Buchstaben: ",40,260);
          
          for (int i=0;i<alphab.length;i++)
             {
             g.drawChars(probed,i,1,118+i*8,260);
             g.drawChars(notprobed,i,1,118+i*8,275);
             }
          
           g.drawString("Fehler: "+mistakes,40,230);
          }
       UpdateHangMan(g);    // Hangman updaten
   }
   
   public void UpdateHangMan(Graphics g)
      {
      Toolkit tk=Toolkit.getDefaultToolkit(); // Toolkit (für
                                              // Grafikdatei-Support)
                                              // zuweisen
      switch(mistakes) //Verschiedenen Fälle für Fehlermeldungen
         {
           case 6:
              g.drawImage(tk.getImage("images/hm6.gif"),SX,SY,this);
              g.setColor(Color.red);
              g.drawString(">>> VERLOREN <<<",WND_B/2-70,WND_H/2+10);
              g.setColor(Color.white);
              g.drawString("Das gesuchte Wort war '"+myword+"'!",WND_B/4-100,WND_H/2-10);
              removeKeyListener(CONTROL);
               break;
           case 5:
              g.drawImage(tk.getImage("images/hm5.gif"),SX,SY,this);
              break;
           case 4:
              g.drawImage(tk.getImage("images/hm4.gif"),SX,SY,this);
              break;
           case 3:
              g.drawImage(tk.getImage("images/hm3.gif"),SX,SY,this);
              break;
           case 2:
              g.drawImage(tk.getImage("images/hm2.gif"),SX,SY,this);
              break;
           case 1:
              g.drawImage(tk.getImage("images/hm1.gif"),SX,SY,this);
              break;
           case 0:
              g.drawImage(tk.getImage("images/hm0.gif"),SX,SY,this);
              break;
           case -1:
              g.drawImage(tk.getImage("images/hm.gif"),SX,SY,this);
              g.setColor(Color.green);
              g.drawString(">>> GEWONNEN <<<",WND_B/2-70,WND_H/2+10);
              removeKeyListener(CONTROL);
              break;
         }//Ende Switch
     }//Ende public void UpdateHangMan
   
   
   class KL implements KeyListener
      {
     
      public void keyPressed(KeyEvent e)
         {
         
         }
     
      public void keyReleased(KeyEvent e)
         {
         
         }
     
      public void keyTyped(KeyEvent e)
         {
         c=e.getKeyChar();              // Taste holen
         c=Character.toUpperCase(c);    // Buchstabe(?) evtl.
                                          // GROß machen
         int i;                       
         boolean status=false;        // Booleans
         boolean check=false;         // für versch.
                                          // Status-Werte
         for (i=0;i<alphab.length;i++)
            {
            if (c==alphab[i]) // wenn c = einer der Buchstaben
               {               //des Alphabets ist
                  if (probed[i]!=c)
                     probed[i]=c;
                  else
                     check=true;
                  if (notprobed[i]==c)
                     notprobed[i]='-';
              }
             }

         int underscores=0; // Integer für Anzahl der "_" im bisherigen Wort
     
         for (i=0;i<myword.length();i++) //"Verschlüsseln" des Ratewortes
            {
               if (c==Character.toUpperCase(myword.charAt(i)))
                  {
                     xyword[i]=myword.charAt(i);
                     status=true;
                  }
           
               if (xyword[i]=='_')
                  underscores++;
            }
         

            if (!status && !check)// wenn der Buchstabe Falsch ist und nicht schon einmal
               mistakes++;       //Getippt wurde Fehler +1

            if (!check)
               tries++;   

            if (underscores==0 || mistakes>=6)
               {
                  System.out.println(" ("+myword+")");
                  System.out.println("Anzahl Versuche: "+tries+"    davon falsch: "+mistakes);
                  System.out.println("Getippte Buchstaben: "+new String(probed));
                  System.out.println("Anzahl versch. Buchstaben im Wort: "+(tries-mistakes));
                  System.out.println("Trefferquote: "+(((tries-mistakes)*100)/tries)+"%");
               }
         
            if (underscores==0) // wenn keine fehlenden Zeichen im Lösungswort sind
               mistakes=-1;   

            if (mistakes>=6)// wenn mehr als 5 Fehler gemacht wurden
               mistakes=6;       
     
            repaint();        // Grafikfenster neuzeichnen
         }//Ende public void keyTyped(KeyEvent e)
    }// Ende class KL
}//Ende public class Hangman
```
das ist für mich nciht ganz nachvollziehbar. kann jemand das "problem" was er jetzt hat mal kurz für mich erläutern? was meint eclipse damit? da steh ich komplett aufm schlauch und weis auch nicht wo ich nach lösungen suchen kann. wenn in java ist eine insel, wo da?


----------

