# Einfaches Menü erstellen



## moe_joe (20. Sep 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

Da ich grade erst mit java anfang wollt ich mal fragen wie ich das am besten realisieren könnte.

mfg moe_joe


----------



## The_S (20. Sep 2007)

mittels JMenuBar, JMenu und JMenuItem.


----------



## @x.l (20. Sep 2007)

JavaInsel - Menüs


----------



## moe_joe (20. Sep 2007)

heir das bsp da sich gefunden habe, wollte es eigentlich ind er art realisieren


```
public Fenster()
  {
     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);
     }
   }

  public void windowClosing(WindowEvent evt)
  {
     System.exit(0);
   }

  public void windowOpened(WindowEvent evt){}
  public void windowIconified(WindowEvent evt){}
  public void windowDeiconified(WindowEvent evt){}
  public void windowClosed(WindowEvent evt){}
  public void windowActivated(WindowEvent evt){}
  public void windowDeactivated(WindowEvent evt){}
}
```


----------



## The_S (20. Sep 2007)

moe_joe hat gesagt.:
			
		

> heir das bsp da sich gefunden habe, wollte es eigentlich ind er art realisieren



Und die Frage war gleich wieder ... ?


----------



## moe_joe (20. Sep 2007)

ich hab gegoogelt, hab auch nen menü gefunden, aber mein problem ist es in das vorhandene programm ein zu bauen. so und dann dachte ich mir stellst doch mal die"annfänger frage" immerhin heißt das subforum ja auch "Anfängerfragen". irre ich mich da?!


----------



## @x.l (20. Sep 2007)

1. Poste bitte nur den relevanten Code!
2. Stelle deine Frage konkreter ("Warum funktioniert es nicht?" Ist extrem schwammig... Zeigt es kein Menü an? Meldet der Compiler nen Fehler? Funktioniert das Menü nicht? Fehlen Einträge?, ...


----------



## The_S (20. Sep 2007)

3.) Gewöhn dir mal n ordentliches Klassendesign an. Ist ja schrecklich!
4.) Ein KSKB kann auch nie Schaden!


----------



## moe_joe (20. Sep 2007)

1. ich werd's versuchen
2. ist aber nicht so einfach konkrete fragen zu stellen wenn man garnich weis warum es nicht funktioniert.
3. musst du damit arbeiten?! -> Nein! also kann es dir doch eigentlich egal sein wie das klassendesign ist. ich leg da noch nciht so nen wert drauf, bin überhaupt ersmal froh wenn das programm ohne fehler läuft und das ist ja auhc das ziel welche sich erreichen möchte.
4. wäre schön wenn du das auch mal auf deutsch schreiben könntest(KSKB?!?!)

seit ca. 2 wochen befasse ich mich jetzt auf der arbeit mit java(ausbildung als fachinformatiker). ist aber echt blöde wenn der chef zu dir kommt sagt programmier jetzt mal das und das mit java zum üben, aber keine zeit hat um dir die grundlegenden sachen von java zu erklären. das heißt viele tutorials lesen um die ganzen klassen zu verstehen usw. ganz ehrlich was würdet ihr denn machen?


----------



## The_S (20. Sep 2007)

moe_joe hat gesagt.:
			
		

> 1. ich werd's versuchen



Und wo ist der Versuch?



			
				moe_joe hat gesagt.:
			
		

> 2. ist aber nicht so einfach konkrete fragen zu stellen wenn man garnich weis warum es nicht funktioniert.



Debuggen, Programm Stück für Stück aufbauen und überprüfen ab wann der Fehler auftritt. Außerdem wollten wir eher wissen "was" nicht funktioniert. Z. B.:

- Code lässt sich nicht kompilieren
- Code lässt sich nicht ausführen
- Es erscheint kein Menü
- Es wird eine Exception geworfen (wenn ja welche)
- ...

Dass du die Fehlerursache nicht kennst, sollte klar sein, sonst würdest du ja wohl nicht fragen  .



			
				moe_joe hat gesagt.:
			
		

> 3. musst du damit arbeiten?! -> Nein! also kann es dir doch eigentlich egal sein wie das klassendesign ist.



Nee, aber ich bin der Depp, der deinen Code lesen muss ...



			
				moe_joe hat gesagt.:
			
		

> 4. wäre schön wenn du das auch mal auf deutsch schreiben könntest(KSKB?!?!)



Kleines, Selbstkompilierendes Beispiel (oder so ähnlich). Den Begriff hat André Uhres hier mal aufgebracht. Auch hier hätte dir die Forensuche mal wieder weitergeholfen! Dreht sich um ein Programm, dass so wenige Zeilen wie möglich hat und bei dem dann genau dein Fehler nachzuvollziehen ist.



			
				moe_joe hat gesagt.:
			
		

> seit ca. 2 wochen befasse ich mich jetzt auf der arbeit mit java(ausbildung als fachinformatiker). ist aber echt blöde wenn der chef zu dir kommt sagt programmier jetzt mal das und das mit java zum üben, aber keine zeit hat um dir die grundlegenden sachen von java zu erklären. das heißt viele tutorials lesen um die ganzen klassen zu verstehen usw. ganz ehrlich was würdet ihr denn machen?



Und da beschwerst du dich? Auch ich habe vor 3 Jahren meine Ausbildung zum Fachinformatiker begonnen. Mir wurde aber ein Buch (von 2001 (!), also hoffnunglsos veraltet) von Java hingelegt, welches ich lesen sollte. Danach hab ich keine Aufgaben, gar nix mehr bekommen. Ich musste mir also Java komplett selbst beibringen. Ohne Erklärer, ohne konkrete Aufgaben, ohne Ahnung! Bis ich nach 2 Jahren endlich mal soetwas wie Aufgaben von meinem Chef bekommen habe. Und jetzt habe ich im Juli meine Ausbildung beendet, wurde übernommen und betreue selbst unseren neuen Azubi.

Es ist vollkommen normal, dass du keinen Privatlehrer hast, der dir Grundlegendes erklärt. Das musst du dir selbst beibringen/erlesen - Willkommen im Berufsleben!


----------



## moe_joe (20. Sep 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)

```
final JFrame f = frame;
        	        JMenuBar menuBar = new JMenuBar();
        	        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
        	        frame.setMenuBar(null);
        	        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(null);
        	            addWindowListener();}
        	          } 
        	        private static void setMenuBar(MenuBar hauptMenue) {

		
	}
					private static void addWindowListener() {

		
	}
					public void actionPerformed(ActionEvent evt)
        	        {
        	           if (evt.getSource() instanceof MenuItem)
        	          {
        	             String menuAdd = evt.getActionCommand();
        	             if (menuAdd == "beenden") System.exit(0);
        	           }
        	         }
	public static void main(String args[]) {
    	   initializeNewWindow();
    	    } 
}
```


----------



## metaltiffy (20. Sep 2007)

schreibt mal in der Funktion, in der du dein shell hast


shell.setMenuBar(menuBar);

Das scheint bei dir zu fehlen..


----------



## The_S (20. Sep 2007)

1.) Nicht AWT und Swing mischen (du verwendest Button und JFrame, JMenu, ...)
2.) Warum ist das Frame final?
3.) Warum sind die ganzen Buttons und MenuItems etc. keine Klassenvariablen?
4.) In welcher Methode befinden wir uns eigentlich gerade? Im Konstruktor?
5.) Was sollen die geschweiften Klammern um dem Block, der das Menu initiaisiert?
6.) Warum verwendest du so oft static, obwohl du es nicht verwenden musst/sollst?


----------



## moe_joe (20. Sep 2007)

jo ich werd's mal suchen und probieren. aber was ist denn "shell" genau?


----------



## L-ectron-X (20. Sep 2007)

Stimmt, das ist etwas irritierend.

Mit shell ist hier aber offenbar der Frame/Dialog gemeint, der die Menüzeile erhalten soll.
Wenn du mit Swing arbeitest, muss diese Zeile übrigens anders heißen:

```
myJFrame.setJMenuBar(jMenuBar);
```


----------



## metaltiffy (20. Sep 2007)

Shell ist, glaub ich nur bei swt....
du solltest deine Code strukturierter machen...

so ruft man das auf 

```
ublic class DBTool {

	
	protected Shell dbShell;
	Display toolDisplay;
	static DBTool dbTool;
	static DBMonitoring moniWindow;

	public static void main(String[] args) {
		try {
			dbTool = new DBTool();
			dbTool.open();
		} catch (Exception ex) {
			System.out.println("Fehler in main");
			ex.printStackTrace();
		}
	}

	public void open() {
		toolDisplay = Display.getDefault();
		createContents();
		dbShell.open();
		dbShell.layout();
		while (!dbShell.isDisposed()) {
			if (!toolDisplay.readAndDispatch())
				toolDisplay.sleep();
		}
	}
	
	public void createContents(){

//hier den ganzen gui-kram reinschreiben...

}
```

musst natürlich noch den klassennamen anpassen
In dem fall würde das shell.setMenu in die funktion open kommen


----------



## The_S (20. Sep 2007)

@metaltiffy

ich glaub jetzt haste ihn vollkommen verwirrt


----------



## moe_joe (20. Sep 2007)

jetzt versteh ich nur noch bahnhof


----------



## The_S (20. Sep 2007)

myFrame natürlich durch dein JFrame ersetzen.


----------



## moe_joe (20. Sep 2007)

irgendwie scheint JMenuBar aber noch nicht richtig vereinbart zu sein, kriege die meldung JMenuBar cannot be resolved


----------



## The_S (20. Sep 2007)

statt jMenuBar musst du natürlich auch den Namen schreiben, den du deiner JMenuBar gegeben hast. Außerdem muss JMenuBar natürlich importiert sein.


----------



## moe_joe (20. Sep 2007)

also der sacht mir jetzt
Cannot make a static reference to the non-static method setMenuBar(MenuBar) from the type Frame


----------



## The_S (20. Sep 2007)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> 1.) Nicht AWT und Swing mischen (du verwendest Button und JFrame, JMenu, ...)
> 2.) Warum ist das Frame final?
> 3.) Warum sind die ganzen Buttons und MenuItems etc. keine Klassenvariablen?
> 4.) In welcher Methode befinden wir uns eigentlich gerade? Im Konstruktor?
> ...



Beantworte mir die Fragen. Dann erledigt sich auch dein Problem. Wenn dud ie Fragen nicht beantworten kannst, solltest du dir dringend nochmal dein Anfängerbuch ansehen! Ansonsten hat das alles hier keinen Sinn!


----------



## FenchelT (20. Sep 2007)

moe_joe hat gesagt.:
			
		

> also der sacht mir jetzt
> Cannot make a static reference to the non-static method setMenuBar(MenuBar) from the type Frame



Hallo moe_joe,

ohne Dir zu Nahe treten zu wollen, goenn Dir ein gutes Buch und lies Dir mal die Basics durch.
Auch wenn der Chef sagt "..mach mal.." (ist ja leider immer der Chef  :wink: ) so bringt Dich das auf Dauer auch nicht weiter.

Du wirst bei den naechsten Aufgaben wieder vor den gleichen Problemen stehen und die gleichen Fragen fragen, wenn Du die Basics nicht richtig verstanden hast und damit meine ich in erster Linie:

- Klassen-
- Methoden
- Objektorietierung im allgemeinen und in Java im Speziellen
- Modifier
- Datentypen in Java


Alles andere ist Flickwerk


Just my 2 Cent


----------



## moe_joe (20. Sep 2007)

> 1.) Nicht AWT und Swing mischen (du verwendest Button und JFrame, JMenu, ...)


bin ja dabei alles auf swing umzubauen



> 2.) Warum ist das Frame final?


das frame is final, weil ich sonst probleme mit f.dispose bekomme



> 3.Warum sind die ganzen Buttons und MenuItems etc. keine Klassenvariablen?


weil ich es anders noch nicht anders hinbekommen habe und es funktioniert ja



> 4.) In welcher Methode befinden wir uns eigentlich gerade? Im Konstruktor?


da bin ich überfragt^^



> 5.) Was sollen die geschweiften Klammern um dem Block, der das Menu initiaisiert?


weil ich das so in nem tutorial gefunden habe 



> 6.) Warum verwendest du so oft static, obwohl du es nicht verwenden musst/sollst?


das programm funktioniert doch! das für mich ersma die hauptsache. ob mit oder ohne static

so fragen beantwortet?  :wink:


----------



## The_S (20. Sep 2007)

Ne, fragen nicht beantwortet. Aber ich poste dir mal eben ein kleines Beispielprogramm  .


----------



## moe_joe (20. Sep 2007)

kannst dir sparen die arbeit, habs selber hingekriegt. er zeigt mir jetzt das menü an so wie ich es haben wollte. Muss jetzt nur noch festenlegen was bei welcher aktion passieren soll


----------



## The_S (20. Sep 2007)

Das wird auch von diesem KSKB demonstriert 


```
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class MenuTest extends JFrame implements ActionListener {

	private JMenuBar bar = null;
	
	private JMenu datei = null;
	private JMenu info = null;
	private JMenu sub = null;
	
	private JMenuItem doSomething = null;
	private JMenuItem exit = null;
	private JMenuItem help = null;
	private JMenuItem about = null;

	private JLabel text = null;


    public MenuTest() {
    	
    	setTitle("Menu-Test");
    	
    	bar = new JMenuBar();
    	
    	datei = new JMenu("Datei");
    	info = new JMenu("Info");
    	sub = new JMenu("Sub-Menü");
    	
    	doSomething = new JMenuItem("Mach Was");
    	exit = new JMenuItem("Beenden");
    	help = new JMenuItem("Hilfe");
    	about = new JMenuItem("Info");
    	
    	text = new JLabel("Diese Anwendung demonstriert die Verwendung von Menüs");
    	
    	setJMenuBar(bar);
    	
    	bar.add(datei);
    	bar.add(info);
    	
    	datei.add(sub);
    	datei.add(exit);
    	
    	info.add(help);
    	info.add(about);
    	
    	sub.add(doSomething);
    	
    	getContentPane().add(text);
    	
    	exit.addActionListener(this);
    	doSomething.addActionListener(this);
    	help.addActionListener(this);
    	about.addActionListener(this);
    	
    	setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
    
    public void actionPerformed(ActionEvent evt) {
    	
    	if (evt.getSource() == doSomething) {
    		System.out.println("Mach Was");
    	}
    	else if (evt.getSource() == exit) {
    		System.exit(0);
    	}
    	else if (evt.getSource() == about) {
    		System.out.println("Programm erstellt von mir");
    	}
    	else if (evt.getSource() == help) {
    		System.out.println("Das Programm ist hilflos");
    	}
    }
    
    public static void main(String[] args) {
    	
    	MenuTest test = new MenuTest();
    	test.pack();
    	test.setVisible(true);
    }
}
```


----------



## moe_joe (20. Sep 2007)

so, das hast du ja jetzt mit swing gemacht. hab das grad mal eben probiert auf mein programm anzuwenden aber da bekomme ich jetzt wieder einige fehler.


```
public static void main(String args[]) {
	       MenuTest test = new MenuTest();
	       test.pack();
	       test.setVisible(true); 
    	   initializeNewWindow();
```
hier hat er nen problem pack is undefinied for the typ hangman"


```
getContentPane().add(text);
    
    Beenden.addActionListener((ActionListener) this);
    Spielregeln.addActionListener((ActionListener) this);
    Nochmal.addActionListener((ActionListener) this);
    
    setDefaultCloseOperation(EXIT_ON_CLOSE);
```
hier das problem "getcontentPane().add(text) is undefinied for the typ hangman"
und setDefaultCloseOperation(EXIT_ON_CLOSE) cannot be resolved


----------



## tuxedo (20. Sep 2007)

moe_joe hat gesagt.:
			
		

> seit ca. 2 wochen befasse ich mich jetzt auf der arbeit mit java(ausbildung als fachinformatiker). ist aber echt blöde wenn der chef zu dir kommt sagt programmier jetzt mal das und das mit java zum üben, aber keine zeit hat um dir die grundlegenden sachen von java zu erklären. das heißt viele tutorials lesen um die ganzen klassen zu verstehen usw. ganz ehrlich was würdet ihr denn machen?



Ähm... Wer hat denn gesagt dass die Ausbildung leicht wird? Ein Studium sieht auch nicht viel anders aus: Da steht einer vorne, labert ne menge kryptisches Zeugs und nach einigen Monaten wird eine Klausur geschrieben. Toll. Da ist keiner der einen an die Hand nimmt und sagt: "Guck, das geht so und so"..
Learning by doing. Das heißt lesen, versuchen zu verstehen und da wo's dann hängt Leute aufsuchen die sich mit auskennen. Aber das heißt auch seine Fragen so stellen, dass der Helfende eine Ahnung hat wo er ansetzen muss.

Ich geh ja auch nicht in Werkstatt und sage: Mein Auto geht nicht... Die werden auch Fragen: Was geht denn nicht. Und die werden auch sauer wenn sie dann nach 4 Telefonaten mit dir erfahren dass du einfach den Schlüssel verloren hast und es deshalb nicht geht.

- Alex


----------



## moe_joe (21. Sep 2007)

> Ähm... Wer hat denn gesagt dass die Ausbildung leicht wird?


Ähm.. hab ich denn gesagt das es leicht wird?! nö.


----------



## tuxedo (21. Sep 2007)

Nö, aber es hat sich so gelesen als ob du dich innerlich beschwerst dass es so schwer ist ;-)


----------



## moe_joe (21. Sep 2007)

nene, mir macht das programmieren ja auch spaß, so is es nicht. Habe bloß vorher immer mit C/C++ gearbeitet, und da gibt es ja schon einige unterschiede zu java.


----------



## tuxedo (21. Sep 2007)

moe_joe hat gesagt.:
			
		

> nene, mir macht das programmieren ja auch spaß, so is es nicht. Habe bloß vorher immer mit C/C++ gearbeitet, und da gibt es ja schon einige unterschiede zu java.



Naja, wenn du C/C++ schon kannst dann müsste Java ja ein leichtes sein. Aber wir wollen ja jetzt keinen Glaubenskrieg bzgl. Java <-> C/C++ anfangen. Also back to topic ;-)


----------



## moe_joe (21. Sep 2007)

so, nochmla ne frage^^ und zwar kann mir meiner sagen warum der jetzt nen problem hat mit dem "Control" beim keylistener? er sagt mir Severity and Description	Path	Resource	Location	Creation Time	Id
Syntax error on token "CONTROL", VariableDeclaratorId expected after this token	line 119, aber ich vertshe nicht was er damit meint!



```
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);
    }   
	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 <-----Damit hat der nen Problem!!!!
	addKeyListener(CONTROL);  // hinzufügen                   <-----Damit hat der nen Problem!!!!
	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
    }
```


----------



## tuxedo (21. Sep 2007)

Hast du das "mal eben" wild zusammenkopiert? Weil da sind n haufen Klammerfehler drin.

In welcher Methode/Klasse befindet sich denn die Zeile 84/85??

Benutzt du eine IDE? Weil der Code ist schon ein wenig krass verstümmelt was die Einrückung betrifft. Eclipse hat alle mühe den Code zu formatieren weil viele Einrückungen mit der "Leertaste" gemacht sind.

- Alex


----------



## Murray (21. Sep 2007)

Ist CONTROL eine Instanzvariable? Falls nicht, dann fehlt die Deklaration:


```
KeyListener CONTROL=new KL(); 
addKeyListener(CONTROL);
```

Dann sind Variablen in Großbuchstaben etwas ungewöhnlich; besser wäre 

```
KeyListener control=new KL(); 
addKeyListener( control);
```
oder gleich

```
addKeyListener( new KL());
```


----------



## tuxedo (21. Sep 2007)

Interessant wäre auch die Klassensignatur der Klasse "KL" ...

- Alex


----------



## moe_joe (21. Sep 2007)

> Dann sind Variablen in Großbuchstaben etwas ungewöhnlich; besser wäre


wusste ich nicht, danke

hier sagt er mir jetzt aber folgenden fehler

```
KeyListener control=new KL();
	addKeyListener(control); //control cannot be resolved to a type
```


----------



## ms (21. Sep 2007)

KeyListener ist ein Interface, das kannst du nicht mit new so instanzieren.
Du brauchst eine Klasse, die dieses Interface implementiert.

ms


----------



## moe_joe (21. Sep 2007)

ich hab ja die klasse KL

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


----------



## ms (21. Sep 2007)

Ok, sorry, da war ich wohl zu schnell.
mal genauer schaun...

ms


----------



## Murray (21. Sep 2007)

ms hat gesagt.:
			
		

> KeyListener ist ein Interface, das kannst du nicht mit new so instanzieren.


Das versucht doch auch niemand, oder?


			
				ms hat gesagt.:
			
		

> Du brauchst eine Klasse, die dieses Interface implementiert.


Ich habe mal angenommen, dass KL genau das ist. //EDIT: Ok, ist durch den Post bestätigt


Zur Fehlermeldung: wenn die Zeile darüber ohne Fehler durchgeht, ist das eigentlich Quatsch. Zeig doch bitte mal die genaue Fehlermeldungen mit Zeilennumern und den Sourcecode dazu (mit passenden Zeilennummer).


----------



## moe_joe (21. Sep 2007)

hier der komplette quellcode (hab mal probiert den ein bisschen strukturierter aufzubauen)

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

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");
    				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) 
    							{    
    								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) 
	    										{     
	    											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);
    					}  
			
    				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);
    					}
    				KeyListener control=new KL();
    				addKeyListener(control);  // hinzufügen                   <-----Damit hat der nen Problem!!!!
    				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);
    									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
    						}
    	}
}
```

und hier die fehlermeldungen;

The method setJMenuBar(JMenuBar) in the type JFrame is not applicable for the arguments (JMenu)	<- line 87	
Syntax error, insert "Finally" to complete TryStatement <- line 97	
Syntax error, insert "}" to complete Block <- line 97
Syntax error, insert "}" to complete Block <- line 97
Syntax error on token "control", VariableDeclaratorId expected after this token <- line 130
Syntax error on token "catch", Identifier expected <- line 123	
Syntax error on token ")", { expected after this token <- line 130
Return type for the method is missing <- line 130
control cannot be resolved to a type <- line 130


----------



## Murray (21. Sep 2007)

Zuerst musst du mal die Klammerfehler beheben, vorher geht gar nichts.

```
public Hangman()
```
ist ein Konstruktor, also im Prinzipo eine ganz normale Methode. Du kannst nicht innerhalb dieser Methode weitere Methoden deklarieren; die gehören hinter den Konstruktor.
Und ein try-Statement muss mit einem catch- und/oder einem finally-Statement abgeschlossen werden.


```
public class Hangman extends JFrame implements ActionListener {

  // ...

  public Hangman() {

    try {
    } catch ( Exception e) { //--- besser: genau angeben, welche Art von Exception man catchen will
      // ...
    }
  }

  public static void main( String[] args){
    // ...
  }

  public void actionPerformed(ActionEvent evt)  {
    // ...
  }

  // weitere Methoden ...  

}
```


----------



## Michael... (21. Sep 2007)

1. setJMenuBar erwartet eine JMenuBar und kein JMenu
2. die Code-Blöcke ({}) sind wohl etwas durcheinander geraten, dadurch findet der Compiler z.B nicht das entsprechende catch zu dem try


----------



## tuxedo (21. Sep 2007)

Ich habs mal in Eclipse rein gezogen und versucht ein wenig zu formatieren... 
Also wenn du schon C/C++ gemacht hast, dann frage ich mich ob du vergessen hast dass es die "Tab" Taste gibt... Einrücken mit der Leerteste ist sowas von uncool ;-)

Ich hab mal ein wenig drin rumgebastelt und die gröbsten schnitzer beseitigt und kommentiert:


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

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");
                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)
                         {   
                            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)
                                     {     
                                        myword=stmp;               // setze
																	// myword
																	// auf
																	// gerade
																	// gelesenen
																	// String
                                        break;                   
                                     }
                               }
                         }
                      f.close();         // Datei wieder schließen
                      
                      
                 } // alex0801: Ende des äußeren Whiles ergänzt...
          
                // alex0801: Ein try brauch auch ein entsprechendes catch
          }catch (IOException e){
          }
                      
                      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");   
                      
                      // alex0801: Hab ich mal eingefügt.. Solltest "bar" in
						// "menu" umbenennen....!
                      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);
                   
                }
   
                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);
	}
         
                // alex0801: Das hier sollte wohl weiter oben stehen? Try-Catch-Blöcke lassen sich nicht Methodenübergreifend nutzen
//                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);
//                   }
                KeyListener control=new KL();
                addKeyListener(control);  // hinzufügen <-----Damit hat der
											// nen Problem!!!!
                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);
	     		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]='-';
	}
}
                         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
                      }
       }
}
```

Ist noch die Sache mit dem CONTROL-Fehler drin...Da ist irgendwas krass durcheinander... Weil da fehlt eine Methodensignatur... " KeyListener control=new KL();" steht einfach so verlassen im Raum ... 

Ich rate dir dringend bei sowas großem einen Editor mit Syntaxhighlighting (Klammerzugeörigkeit etc) oder sogar eine richtige IDE zu benutzen...

- Alex


----------



## moe_joe (21. Sep 2007)

Murray hat gesagt.:
			
		

> ```
> catch ( Exception e)
> { //--- besser: genau angeben, welche Art von Exception man catchen will
> wie meisnt du das jetzt genau? komm grad nich hinterher
> ...


----------



## moe_joe (21. Sep 2007)

ja ich weis das mit der tab taste....^^ bin aber auch grad dabei gewesen das ein bischen ordentlicher zu machen, bin da selbst schon garnich mehr durchgestiegen.


----------



## ms (21. Sep 2007)

Kleine Frage am Rande:
Wie lange hast du denn schon mit C/C++ gearbeitet?

ms


----------



## moe_joe (21. Sep 2007)

auch nich so lange, ca. nen Jahr und dann auch nur consolen anwendungen


----------



## Murray (21. Sep 2007)

moe_joe hat gesagt.:
			
		

> Murray hat gesagt.:
> 
> 
> 
> ...



Ich wollte ja nicht deinen Code aufräumen (das ist ja nun trotzdem geschehen), deshalb hatte ich nur ein Grundgerüst hingeschrieben. Und "catch( Exception e)" ist zwar nicht falsch, normalerweise sollte man sich aber Gedanken machen, mit welchen Fehlern man zu rechnen hat und wie man diese Fehler jeweils behandeln will. Da ich nicht genau weiss, mit welchen Exceptions in deinem Code konkret zu rechnen ist, musste ich das so global schreiben - und daher der Kommentar.

Mit deinem Problem hat das aber nur am Rande zu tun - dem Compiler reicht es, wenn a) das try-Statement abgeschlossen wird und b) alle in der Methode möglicherweise auftretenden _Checked-Exceptions_ abgefangen werden.


----------



## tuxedo (21. Sep 2007)

So, ich glaub ich habs ... Lass mich raten:

* Du hast keine IDE benutzt
* Du hast keinen Editor der dir Klammerzugehörigkeit anzeigt
* Du hast den Code zwischendrin mehrfach umkopiert

???

Schau dir den Code an:

Korrekte Einrückung mit Tab-Taste -> Das ist lesbar
Die Sache mit dem Fehler beim KeyListener kam deshlab, weil die Zeile völlig mitten im Raum stand und der compiler angenommen hat du versucht mit "addKeyListener(control);" eine neue Methode zu definieren. Deshalb hat er gemeckt dass "control" ein Parameterdeklaration in der Methodensignatur sein soll....

Tipp: Besorg dir einen Editor mit Syntaxhighlighting (Notepad++ z.B.) oder gleich eine gescheite IDE (Eclipse, Netbeans oder was auch immer). 


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

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
                      
                      
        	} // alex0801: Ende des äußeren Whiles ergänzt...
          
        // alex0801: Ein try brauch auch ein entsprechendes catch
        }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");   
                      
        // alex0801: Hab ich mal eingefügt.. Solltest "bar" in
		// "menu" umbenennen....!
        JMenuBar menubar = new JMenuBar();
        menubar.add(bar);
                      
        setJMenuBar(menubar); // alex0801: Statt "jmenu" muss hier ein "jmenubar" rein   
        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);
        
        
        // alex0801: verschoben: ich glaub das gehört hier rein, und nicht dort unten (siehe unten)
        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];
        }
        // Ende des verschobenen teils
                   
	}
   
	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);
	}
         
                // alex0801: Das hier sollte wohl weiter oben stehen? Try-Catch-Blöcke lassen sich nicht Methodenübergreifend nutzen
//                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);
//                   }
	
// alex0801: und das gehört wohl weiter oben hin, siehe oben...	
//    KeyListener control=new KL();
//    addKeyListener(control);  // hinzufügen <-----Damit hat der
//								// nen Problem!!!!
//    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);
	     		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
		}
	}
}
```

ich hoffe du lernst jetzt für die Zukunft:

* Formatierter Code ist einfacher lesbar. 
* Zum Einrücken benutzt mandie Tab-Taste und nicht die Leerteste


----------



## moe_joe (21. Sep 2007)

Vielen dank für eure hilfe und rätschläge. werd mir das für die zukunft zu herzen nehmen. 

zum thema IDE, ich arbeite eigentlich mit Eclipse IDE. 

so, nochmal zu dem kommentar im quellcode mit der fehlermeldung, die soll ja erscheinen wenn die externe datei HANGMAN.DAT nicht vorhanden oder leer ist. In der stehen die zu erratenen wörter. weil so wie ihr das jetzt umgebaut hab, krieg ich jedesmal die fehlermeldung "ACHTUNG! In der Datendatei sind keine gültigen Wörter zu finden.
" obwohl die datei ja bei mir ja vorhanden und nicht leer ist


----------



## tuxedo (21. Sep 2007)

Also ich hab mir folgende hangman.dat gebaut:


```
hallo
welt
#
```

In der Console kommt:



> Woerter in Datendatei: 1
> Ausgewaehltes Wort: #1java.io.IOException: Read error
> at java.io.RandomAccessFile.read(Native Method)
> at java.io.RandomAccessFile.readLine(Unknown Source)
> ...



Folglich muss irgendwas an deiner Hangman nicht stimmen wenn du die Achtung-Meldung bekommst.

Für solche "kleine" Sachen verwende ich in der Regel einen FileReader und kein RandomAccessFile.
Ein einfacherer Ansatz wäre, da die Anzahl der Wörter ja nicht allzugroß ist, die Zeilen in ein Array einzulesen, oder besser einen Vector oder List (da musst du keine Größe angeben). Dann kannst du bqeuem mit Array oder dem Vector/Liste arbeiten...

- Alex


----------



## moe_joe (21. Sep 2007)

also der fehler kommt ja erst jetzt nach dem "umbau" vom menü(wo ihr mir ja reichlich geholfen habt ;-)" zur hangman.dat datei, ich wollte dort eigentlich nich mehr als 30 wörter einfügen. also sollte ich da am besten statt RandomAccessFile mit Filereader arbeiten?! es ist aber wichtig das der die wörter aus der datei nicht immer einfach nur hintereinander ausliest, es sollen ja immer "zufällige" wörter sein. Deswegen brauch ich ja ein random


----------



## tuxedo (21. Sep 2007)

Prinzipiell iste s egal, ob das eine oder das andere. Ich finde halt den FileReader besser.

btw: das menü ist an der sache nicht schuld ;-)


----------



## moe_joe (21. Sep 2007)

ich sach ja auhc nicht das das menü daran schuld ist  ich sage nur das es seit dem umbau des menü's nicht mehr geht ;-)


----------



## tuxedo (21. Sep 2007)

Na dann würd ich sagen probier mal n bisschen und versuch den Fehler zu finden (ist ja nicht mein/unser Fehler, die Logik ist nach wie vor von dir). Und wenn du nicht weiter kommst berichtest du nochmal. Als "erfahrerer" C/C++ Consolenprogramm-Schreiber solltest du eigtl. weiter kommen.

- Alex


----------



## moe_joe (21. Sep 2007)

erfahren?!^^ naja eher weniger als mehr xD


----------



## moe_joe (21. Sep 2007)

also wenn die beiden sich nicht viel tun (filreader, randomaccesfile) und es eher "geschmackssache" ist dann versuch ich glaub ich lieber das mit dem randomaccessfile wieder lauffähig zu bekommen. 

Edit: Hab mich nochmal in verschiedenen tutorials reingelesen... und steh total aufm schlauch! ich bin der meinung alles richtig vereinbart zu haben usw.... und find den fehler nicht warum er aufeinmal keine daten mehr ausliest.

er sacht mir zwar: #1IOException: java.io.IOException: Read error 
aber ehrlichgesagt kann ic damit auhc nich viel anfangen


----------



## tuxedo (21. Sep 2007)

Für sehr große Files ist das Ramdomfile-Dingens glaub besser weil er Native IO im Hintergrund benutzt (--> schneller). Dafür ist er ein wenig komplexer zu nutzen wenn man zeilenorientiert arbeitet. 

Welchen du nimmst ist für deinen Anwendungszweck wurscht.

- Alex


----------



## moe_joe (21. Sep 2007)

ja hab mich dazu entschieden das weiter mit RandomAccessFile zu machen. da muss ich "nur"^^ gucken das ich da smit dem fehler behebe. wenn ich jetzt umsteigen würde auf filereader, müsste ich ja "alles" neu machen. das gibt dann wieder nur viele probleme....


----------



## tuxedo (21. Sep 2007)

Naja, "alles" wären maximal 20 Zeilen.. ;-) Normalerweise dürfte das ganze Dateieinlesen-Gedöns in 3min erledigt sein ... Egal ob mit dem einen oder mit dem anderen.


----------



## moe_joe (21. Sep 2007)

also wenn du den thread verfolgt hast, wirst du sicherlich merken das das bei mir länger dauern kann^^


----------



## tuxedo (21. Sep 2007)

Na aber hallo?! Dachte du hast ein Jahr C/C++ programmiert?

Also nach einem Jahr Java hab ich ne kleine Datenbankanwendung mit C/C++ geschrieben.. Dann sollte doch sowas lapidares wie eine textdatei einlesen für einen "von C nach Java" Umsteiger kein Thema sein?

Oder meinst du mit "1 Jahr": "Ich hab 1 Jahr lang alle 6 Monate für 2 Wochen C/C++ programmiert" ??

- Alex


----------



## moe_joe (21. Sep 2007)

auch nich ganz^^ 1 jahr lang (muss man ja noch ferien abziehen) inner schule jede woche 6 stunden c++ gehabt. ich muss mal gucken wie ich das jetzt mache. überleg mir das übers wochenende nochmal wie genau...


----------



## tuxedo (21. Sep 2007)

Naja, dann scheint in dem Jahr nicht viel dabei rausgekommen zu sein.


----------



## moe_joe (24. Sep 2007)

so da bin ich wieder xD joa nö nich so wirklich. lag an dem arbeitstempo der klasse. da waren einige dabei dies es einfach nich gerafft haben(ok, manchmal gehörte ich vielleicht auch dazu....^^) so aber jetzt wieder zurück zum thema, ich sitz hie grad wieder und guck was den nun der fehler mit dem randomaccessfile ist. er gibt mir immernoch diese fehlermeldung "#1IOException: java.io.IOException: Read error" aus. krieg hier bald die krise!!!!


----------



## HLX (24. Sep 2007)

:lol:  :applaus: 

Oh Wunder! Hast du geglaubt die Heinzelmännchen wären am Wochenende an deinem Programm gewesen?


----------



## moe_joe (24. Sep 2007)

man darf doch nochmal träumen


----------



## moe_joe (24. Sep 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?


----------



## tuxedo (24. Sep 2007)

Das Problem wird sein dass du scheinbar nicht weißt wo die Datei liegt. Weil dein Programm versuchts ja, findet aber nix. Evtl. Pfad falsch angegeben?

- Alex


----------



## moe_joe (24. Sep 2007)

ja, danke das hab ich mittlerweile behoben. ich habs jetzt geschafft das das programm korrekt ausgeführt wird, er die wörter richtig aus ließt und keine fehlermeldungen mehr gibt.
Allerdings wird die menüleiste nicht angezeigt und das fenster ist beliebig in der größe veränderbar...


----------



## tuxedo (24. Sep 2007)

moe_joe hat gesagt.:
			
		

> Allerdings wird die menüleiste nicht angezeigt und das fenster ist beliebig in der größe veränderbar...



Ist das etwa ein Problem? Die API hilft dir da weiter (Stichwort JFrame und JMenuBar)


----------



## moe_joe (25. Sep 2007)

ja wie ich das frame vereinbare weis ich auch... das problem ist das ich nicht weis wie/wo ich meinem programm den frame zuweise


----------



## tuxedo (25. Sep 2007)

Vielleicht solltest du dir mal "Java ist auch eine Insel" zu gemüte führen. Ich hab das gefühl in dem Jahr C/C++ wurde nicht sonderlich viel vermittelt. 
Das Buch gibts bei Galileo Computing kostenlos im Netz, auch zum runterladen ...

Ein gutes "Kochbuch" ist auch das "Javabuch" von Guido Krüger, welches ebenfalls kostenlos im Netz zum download erhältlich ist.

- Alex


----------



## moe_joe (25. Sep 2007)

:roll:  das tutorial hab ich auch hier aufm rechner als pdf. wenn ich nen problem hab guck ich da auch ersmal nach und probiere es hinzukriegen. wenn das aber nich klappt.... dann frag ich hier halt. is das denn so schlimm?! is doch das "Anfängerforum".wozu is das denn da? sonst könnt man ja im gleich im forum einen beitrag schreiben in dem steh"siehe java ist eine insel" das ham mir jetzt schon zig leute gesagt. ich verstehe die sachen besser in dem ich learning by doing  mache und nich learning by lese java ist eine insel


----------



## HLX (25. Sep 2007)

Nur ist die Community ja nicht dafür da, deine Arbeit zu erledigen.  :noe: 

Deine Einzeiler lassen wenig Engagement vermuten. Versuche erstmal alle Möglichkeiten auszuschöpfen, dem Problem selbst auf die Schliche zu kommen. Falls du keine Lösung findest, kannst du das Problem meist schon etwas eingrenzen. Erst dann beschreibe detailliert was los ist.

Zu 





> Allerdings wird die menüleiste nicht angezeigt und das fenster ist beliebig in der größe veränderbar...


wird dir niemand helfen können, geschweige denn wollen.


----------



## moe_joe (25. Sep 2007)

hab ich jemals gesagt die "community" SOLL meine arbeit erledigen? ne, wenn du kein bock drauf hast dann beachte den thread doch einfach nicht! Aber es gibt bestimmt nette leute die einem dann auch mal helfen und Klar sagen so und so geht das, dann machst du das so und dann läuft das.
ganz ehrlich mir wird es auch solangsam zu blöd in diesem forum!!! anfänger sind halt anfänger, soll doch jeder auf seine art und weise machen wie er es denkt. ihr könnt doch auch nicht mehr als schlaue tipps geben guck bei java ist eine insel. wenn ihr kb auf solche fragen habt dann frag ich mich wofür gibt es den Anfänger bereich überhaupt gibt. jeder 3. der kommt sagt les dir ersmal java ist eine insel durch.


----------



## tuxedo (25. Sep 2007)

moe_joe hat gesagt.:
			
		

> :roll:  das tutorial hab ich auch hier aufm rechner als pdf. wenn ich nen problem hab guck ich da auch ersmal nach und probiere es hinzukriegen. wenn das aber nich klappt.... dann frag ich hier halt. is das denn so schlimm?! is doch das "Anfängerforum".wozu is das denn da? sonst könnt man ja im gleich im forum einen beitrag schreiben in dem steh"siehe java ist eine insel" das ham mir jetzt schon zig leute gesagt. ich verstehe die sachen besser in dem ich learning by doing  mache und nich learning by lese java ist eine insel



Du bist hier schon richtig im Forum. Allerdings solltest du erkennen lassen dass du dich mit dem Problem beschäftigt hast. Und es sollte erkennbar sein was du schon alles versucht/unternommen hast um das Problem zu lösen. 

Learning by doing ist der richtige Weg. Erwarte aber nicht dass dir jemand extra für dich hier im Forum vorbetet was du tun musst um zum Ziel zu kommen. Denn wir sind ncioht dazu da ein Buch zu kopieren oder zu ersetzen. Hier gibts primär Hilfe zur Selbsthilfe. Weil wenn du mit ein wenig "anschubsen" selbst auf die Lösung kommst hast du mehr gelernt als wenn wir dir sagen: Schreib die Codezeile wie folgt um ....

Ich hab deinen Code quasi schon komplett überarbeitet so dass ihn der Compiler ohne zu murren frisst. Damit hast du eine gute Ausgangsbasis um weiter zu basteln. 

Nochmals: Mein Tipp: Schnapp dir eins der von mir genannten Bücher und schau dir die Beispiele zu JFrame sowie die Erklärungen dazu an. Dann kommst du wirklich ganz schnell zum Ziel.


----------



## ms (25. Sep 2007)

Bitte lies dir deinen (diesen) Beitrag nochmal durch und im Vergleich dazu auch andere Beiträge. Dein Betrag betrifft die  absoluten Basics und sticht durch eine schlechte Fehlerbeschreibung hervor. Es hat den Anschein, als ob du etwas probierst, siehst, dass es nicht funktioniert und sofort hier fragst ohne den dir zu Verfügung stehenden Mitteln (Compilermeldungen, Stacktrace, Api-Doc, google, Insel, Hausverstand) den Fehler selbst einzugrenzen. Deine öffentliche Bekenntnis, keine Bücher lesen zu wollen runden das Bild ab.

Ich bin mir sicher, wenn du dich ein wenig anstrengst, kannst du die meisten deiner Probleme selbst lösen.

ms


----------



## moe_joe (25. Sep 2007)

ms hat gesagt.:
			
		

> Deine öffentliche Bekenntnis, keine Bücher lesen zu wollen runden das Bild ab.
> Dein Betrag betrifft die absoluten Basics
> ms



Na klar betrifft der Beitrag die absoluten basics, bin ja auch im anfängerforum (hab ich zumindestens gedacht!)? Wo hab ich denn gesagt da sich keine bücher lesen will? dann hätte ich ja wohl kaum java ist eine insel aufm rechner....ich habe nur gesagt das mir schon einige leute gesagt haben guck bei java ist eine insel. natürlich guck ich mich erst um und probiere die fehler selbst zu beheben, das is aber nich immer einfach so für mich umsetzbar. ich probier dann das ganze so wie ich es verstanden hab umzusetzten, das klappt aber oft nicht und es entstehen dann folge fehler daraus. 

So dann nochmal ganz von vorne. Hab mich jetzt gefrat wie kann ich ein neues frame erstellen in dem meine menüleiste und das programm angezeigt werden. Dann habe ich probiert ein neues frame zu initialisieren, das klappt auch soweit. dann hab ich einen neuen panel erstellt und will dem panel jetzt das menü und das spielfeld zuweisen und dann den panel auf's frame packen. das müsste theoretisch ja so gehen. so wie ich das versteh (laut java ist eine insel und anderen tutorials) müsste das ganze dan ja ungefähr so aussehen:

```
private 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 GridLayout());
       JPanel panel = new JPanel(new GridLayout()); 
       panel.requestFocusInWindow();
       final JMenuBar hauptMenue = new JMenuBar();
       panel.add(hauptMenue);
       getContentPane().add(panel);
       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);
}
```

da sagt mir der compiler jetzt "The method initializeNewWindow() from the type Hangman is never used locally"
und der debugger sagt "ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2
JDWP exit error AGENT_ERROR_NO_JNI_ENV(183):  [../../../src/share/back/util.c:820]" die fehlermeldungen versteh ich aber nich so ganz und kann damit nicht viel anfangen. hat also vielleicht jemand nen tipp wo mein denkansatz scheitert?
[/code]


----------



## Guest (25. Sep 2007)

moe_joe hat gesagt.:
			
		

> da sagt mir der compiler jetzt "The method initializeNewWindow() from the type Hangman *is never used* locally"



Und was sagt uns das? Hast du vielleicht in all deinem Eifer vergessen diese Methode aufzurufen?

- Alex


----------



## tuxedo (25. Sep 2007)

Mist, Browser neu installiert und gleich vergessen anzumelden ... hmmpf

Was du da versucht hast zu debuggen versteh ich nicht. WIE hast du denn debugged?

- Alex


----------



## moe_joe (25. Sep 2007)

ich arbeite mit eclipse, so dann bin ich da auf Debug gegangen, hab gesagt debug Hangman() und dann hatte er mit das unten in der console ausgegeben


----------



## moe_joe (25. Sep 2007)

ja hatte es vergessen, flüchtigkeitsfehler. tut mir leid! das hätte nicht sein müssen


----------



## moe_joe (25. Sep 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)
	             at Hangman.main(Hangman.java:166)


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


----------



## tuxedo (25. Sep 2007)

Der Compiler sagt dir doch wo der Fehler zu suchen ist: 



> at Hangman.<init>(Hangman.java:89)
> at Hangman.main(Hangman.java:166)



In dieser Liste mit Meldungen solltest du oben anfangen mit suchen... Also schau in Zeile 89 deiner Hangman.java ... Dort wirst du mit etwas arbeiten was noch nicht initialisiert wurde und demnach "null" ist, was dann beim Zugriff eine NullPointerException wirft.

- Alex


----------



## moe_joe (25. Sep 2007)

das in den zeilen was falsch ist verstehe ich schon, aber z.B. der erste fehler Z. 89 da steh 
	
	
	
	





```
xyword=new char[myword.length()]; // array erstellen
```

da hab ich überhaupt nichts dran verändert! ich hab mich die ganze zeit damit beschäftigt das frame zu initialisieren und mit dem panel/menü. und das befindet sich ja alles ein bischen weiter unten im quellcode. das meinte ich damit wenn man rumbastel und probiert hat man das eine geschafft und dann kommt ein anderer fehler ob wohl man an der stelle ncihts verändert hat. so und jetzt weis ich natürlich auch nciht wie ich diesen fehler beheben könnte, vorher lief es ja auch so. der kommt auf einmal so. das macht echt keinen spaß mehr.....


----------



## ms (25. Sep 2007)

Kann es sein, dass myword == null ist?

ms


----------



## Murray (25. Sep 2007)

Offensichtlich ist myword an dieser Stelle null. Lass dir doch weiter oben mal wordcount, wordseek etc. ausgeben.


----------



## moe_joe (26. Sep 2007)

also wordcount ist 14 (hab auch meine 14 wörter in der datendatei, das stimmt soweit) wordseek ist aber null! da liegt dann denk ich mal das problem aber, wenn wordseek 0 ist, dann wird ihm ja hiermit einw ert zugewiesen


```
while (wordseek==0) 
               {   
        	   		wordseek=(int)(Math.random()*wordcount)+1;// Bestimmt zufälliges Wort
               }
```
math.random gibt ja einen double zufallswert zwischen 0,1 und 1,0 aus, der dann mit wordcount multipliziert wird. nehmen wir mal an math.random gibt den wert aus0,3 aus. dann würde die rechnung ja so aussehen: (0,3*14)+1 = 5,2 
da es aber nen integer wert sein muss wird das denk ich mal auf 5 gerundet (stimmt das so? ich hab mal geraten) also müsste wordseek ja einen wert haben.

hab nochmal ein bischen rumgebastelt und krieg nun die fehlermeldung: String index out of range: 0 at java.lang.String.charAt(Unknown Source) 

also kann es ja eigentlich nciht mehr an wordseek liegen


----------



## tuxedo (26. Sep 2007)

Ich schlage vor du gibst dir an verschiedenen Stellen mal entsprechende String oder Integer-Werte aus oder debuggst das ganze Schritt für Schritt. Weil mit mutmaßungen kommst du nicht weiter. 

Wenn du ein "String index out of range: 0" bekommst, würde ich sagen du hast einen leeren String -> "" ... Also einen nicht-null-String der aber nix enthält.

- Alex


----------



## Murray (26. Sep 2007)

moe_joe hat gesagt.:
			
		

> math.random gibt ja einen double zufallswert zwischen 0,1 und 1,0 aus,


Der Wert ist größer oder gleich 0.0 und kleiner als 1.0


			
				moe_joe hat gesagt.:
			
		

> da es aber nen integer wert sein muss wird das denk ich mal auf 5 gerundet (stimmt das so? ich hab mal geraten)


Es wird nicht gerundet, sondern abgeschnitten.

Bei wordcount=14 wird wordseek also zwischen 1 und 14 liegen. Da wordseek also bereits nach der ersten Zuweisung mindestens  1 sein muss, kannst du aus dem while auch ein if machen.




			
				moe_joe hat gesagt.:
			
		

> hab nochmal ein bischen rumgebastelt und krieg nun die fehlermeldung: String index out of range: 0 at java.lang.String.charAt(Unknown Source)


Der Rest des StackTrace würde dir die Zeilennummer angeben, in der der Fehler auftaucht.


----------



## moe_joe (26. Sep 2007)

soooo, hab mich jetzt mal ausführlich (so wie ihr es mir ausdrücklich gesagt habt zu tun) selber damit beschäftigt mein Problem zu lösen.   (java is ne insel, google, usw...) hab den fehler auch behoben, aber weis jetzt im endeffect nicht was der fehler war! hier ein bischen rum gebastelt, da nen bischen rumgebastelt, und siehe es läuft (fast^^). Krieg keine fehlermeldungen mehr, zufallswörter werden erkannt und berechnet... so wie ich es will! nebenbei ist aber was mit dem keylistener passiert. Er reagiert nicht mehr auf die tastatureingabe!!! Habe jetzt mal den aktuellen code mit älteren versionen(als der keylisatener noch lief) verglichen und mir sind keine untschiede aufgefallen. jetzt suche ich verzweifelt nach dem problem des keylisteners warum er nicht mehr reagiert. java is ne insel, google, tutorials haben mir nicht weiterhelfen können. Deswegen würde ich mich freuen wenn einer von euch hier auch nochmal nen blick drauf werfen könnte (4 augen sehen mehr als 2^^)  :?: 


```
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;
   final static 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;
   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)
		    	{ 
		    		wordcount++;  
		    	}
		    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
		}//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();   // neuer KeyListener: CONTROL
        addKeyListener(control);  // hinzufügen
        xyword=new char[myword.length()];      // array erstellen
        for (int i=0;i<myword.length();i++) 
        	{ 
            	xyword[i]='_';
        	}
        probed=new char[alphab.length];                // array erstellen
        notprobed=new char[alphab.length];
        for (int i=0;i<alphab.length;i++) 
        {  
            probed[i]='-';
            notprobed[i]=alphab[i];
        }
    }
    public void update(Graphics g)
    	{
        	paint(g);
        } //Ergänzung : Flackern beim Zeichen des Grafikbildschirms verhindern
         //was nun noch flackert, ist das Überzeichnen des Bildes bzw. Einlesen der Bilddatei 	
             
   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
   }//Ende pain(Graphics g)
   
   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 UpdateHangMan (Graphics g)
   
   
   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.
                                          
    	  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
  
  
   public static void main(String[] args) 
  	{
	   Hangman Jpanel = new Hangman();
	   Jpanel.requestFocusInWindow();
	   JFrame frame = new JFrame("JFrame");
	   frame.setTitle(".:Hangman:.");  // Titel setzen
	   frame.add(Jpanel,BorderLayout.CENTER);
	   frame.setSize(435,360);   // Größe setzen
	   frame.setBackground(Color.black);
	   frame.add(Jpanel,BorderLayout.CENTER);
	   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	   
	   JMenuBar menuBar = new JMenuBar();
	   frame.setJMenuBar(menuBar);
	   JMenu datei = new JMenu("Datei");
	   menuBar.add(datei);
	   datei.add(new JMenuItem("Nochmal"));
	   datei.add(new JMenuItem("Beenden"));
	   JMenu hilfe = new JMenu("Hilfe");
	   menuBar.add(hilfe);
	   hilfe.add(new JMenuItem("Spielregeln"));

	   frame.setVisible(true);
  	}//Ende Main

   	@Override
   	public void actionPerformed(ActionEvent e) 
   	{
	// TODO Auto-generated method stub
   	}
   	
}//Ende public class Hangman
```

Update: habe control jetzt kleingeschrieben, hat sich abe rnichts geändert!


----------



## tuxedo (26. Sep 2007)

Mal davon abgesehen dass du meine ganze schöne formatierung wieder über bord geworfen hast:

Ii Zeile 51:


```
CONTROL=new KL()
```

Ich hab nirgens ein 


```
KL CONTROL;
```
oder

```
KL CONTROL = null;
```

gefunden, oder bin ich blind. Ohne es probiert zu haben: Fehlerfrei sollte das nicht compiliert werden können ...

BTW: Variablen wie "control" schreibt man nicht in durchgehend großen Lettern... Klassen ebensowenig. Such dir lieber einen vernünftigen Namen dafür. Statt KL kannst du "KeyListenerImpl" nehmen und statt CONTROL könntest du "keyListener" benutzen.

- Alex

[update]
Sieht so aus als ob du wieder nur die hälfte gepostet hast?!

- Alex


----------



## moe_joe (26. Sep 2007)

ja das mit deiner formatierung tut mir leid, die hat leider beim rumprobieren etwas gelitten. doch es funktioniert ohne fehlermeldung(zumindestens bei mir) nur die hälfte? was fehlt dir denn?


----------



## tuxedo (26. Sep 2007)

Naja, wie in meinem UPDATE zu lesen hast du offensichtlich nur wieder die hälfte gepostet... 

Übrigens: Du machst dir das leben selbst schwer wenn du einfach "hopphopp" "schnellschnell" den Code soweit zusammenflickst dass er geht, aber nicht schön aussieht. Weil wenn du dann den Fehler suchen musst quälst du dich, weil das Ding nicht richtig leserlich ist. 

Mit Eclipse ist es doch ein kinderspiel und bedarf eigtl kaum einer erwähnenswerten Anstrengung sauber formatierten Code zu erstellen. Warum kriegst du das dann nicht hin?

Hast du die Sache mit den Variablen und Klassennamen zur kenntnis genommen?

Was geht denn an deinem Keylistener nicht? Gibts Fehlermeldungen? Wenn nicht: Hast du's mal mit Sysout's zwischendrin probiert oder versucht zu debuggen ?

- Alex


----------



## moe_joe (26. Sep 2007)

erkläre mir doch mal in einem ganzen Satz was du mit der "hälfte" meinst. Der Quellcode ist doch KOMPLETT da.
also ich blick durch meinen quellcode vollkommen durch! und so hab ich's halt damals inner schule mit c++ gelern(und ja ich weiß was die tab taste ist) wennd ann musst du mienen lehrer die schuld dafür geben ;-P

wie ich schon gesagt habe, das Problem an meinem keylistener ist, das nicht das nichts passiert wenn ich die tasten für die buchstaben drücke um das wort im spiel zu erraten

und Nein, ich bekomme keine fehlermeldungen! weder unter Problems, noch in der Console, noch vom Debugger. er compiliert das Programm, zeigt es mir auf dem bildschirm an und ncihts passiert wenn ich tasten für die buchstabe drücke


----------



## tuxedo (26. Sep 2007)

a) Nein, das "war" nicht der ganze Code. Das ganze fing ab "public HandMan()" erst an. JETZT ist er komplett da
b) Dass du durchblickst mag sein, dann erwarte aber nicht dass andere, die nach einer allgemein üblichen Java-Code-Convention arbeiten durch seinen Kraut-und-Rüben-Acker durchsteigen bzw. sich da einarbeiten wollen
c) Deine Lehrer sind hier nicht dran schuld. In Eclipse muss man sich ja schon fast Mühe geben den Code zu verunstalten ...
d) Ein Debugger liefrt auf keine Fehlermeldungen.. Ein Debugger ist dazu da, während der Laufzeit des Programms einsicht in diverse Variablen und Vorgänge zu haben. Wenn du den Debugger richtig einsetzen würdest, hättest du den Fehler wohlmöglich schon gefunden. Und selbst wenn du den Debugger nicht richtig benutzen kannst, gibts immer nocht "System.out.println()" mit dem man sich ebenfalls, mehr oder weniger gut, während der Laufzeit wichtige Informationen ausgeben kann die einem sonst verborgen blieben.

- Alex


----------



## tuxedo (26. Sep 2007)

Kleiner Tipp noch zum KeyListener:

Der KeyListener eines Objekts ist nur dann aktiv, wenn dieses Objekt auch den Focus hat. Du setzt den KeyListener in deinem JPanel, der Focus liegt aber auf dem JFrame.

- Alex

[update]

Und weil ich heute wieder so großzügig bin geb ich dir noch n Tipp:

http://forum.java.sun.com/thread.jspa?threadID=560708&tstart=135


----------



## moe_joe (26. Sep 2007)

> a) Nein, das "war" nicht der ganze Code. Das ganze fing ab "public HandMan()" erst an. JETZT ist er komplett da



will soll man auch aus deinem "das ist nur die" häflte sofort schließen könne das du damit den quellcode meinst? hätten genausogut äpfel, birnen, bananen oder sonst was sein können.



> b) Dass du durchblickst mag sein, dann erwarte aber nicht dass andere, die nach einer allgemein üblichen Java-Code-Convention arbeiten durch seinen Kraut-und-Rüben-Acker durchsteigen bzw. sich da einarbeiten wollen



wurde rom von heute auf morgen erbaut? NEIN! seit 2 wochen beschäftige ich mich mit java da kann doch wohl keiner erwarten das ich ihm den quellcode so perfekt schreibe das ihn jeder lesen kann. gut ding will weile haben



> c) Deine Lehrer sind hier nicht dran schuld. In Eclipse muss man sich ja schon fast Mühe geben den Code zu verunstalten ...



also ich find das war ganz einfach!!!



> d) Ein Debugger liefrt auf keine Fehlermeldungen.. Ein Debugger ist dazu da, während der Laufzeit des Programms einsicht in diverse Variablen und Vorgänge zu haben. Wenn du den Debugger richtig einsetzen würdest, hättest du den Fehler wohlmöglich schon gefunden. Und selbst wenn du den Debugger nicht richtig benutzen kannst, gibts immer nocht "System.out.println()" mit dem man sich ebenfalls, mehr oder weniger gut, während der Laufzeit wichtige Informationen ausgeben kann die einem sonst verborgen blieben.



Entschuldige das ich kein Profi bin!!! das ist ja auch so einfach alles zu verstehen, habs auch beim ersten mal sofort 100%ig verstanden. tut mir echt leid...


mal ganz ehrlich, diese ganze grundsatzdiskussion bringt hier keinen weiter, anstatt deine zeit darein zu investieren einmal klare(!) antworten über die fehler/fehlerursache zu geben, diskutieren wier hier über die formatierung des qullcodes, das ganze ist doch "geschmackssache" und hat rein garnichts mit der funktion des quellcodes zutun. und wenn du mal ein bischen  guten willen zeigen würdest, hättest du den code auch innerhalb kurzer zeit verstanden.


----------



## moe_joe (26. Sep 2007)

ich hab dem panel doch den focus zugewiesen:

```
Jpanel.requestFocusInWindow();
```


----------



## moe_joe (26. Sep 2007)

so, jetzt geht's aber dem panel hatte ich den focus zugewiesen!!! es fehlte lediglich das 

```
Jpanel.setFocusable(true);
```

das ja was anderes


----------



## ms (26. Sep 2007)

In Eclipse kannst du mit Strg+Shift+F den Code automatisch formatieren lassen.
Und wenn wir von Code sprechen (hier in diesem Forum) dann ist damit ausschließlich Java-Code gemeint.

Hauptsache dein Programm läuft jetzt.

ms


----------



## tuxedo (26. Sep 2007)

Da du hier ständig Code postest isz es doch naheliegend dass ich den Code gemeint habe und nicht irgendwelche Äpfel oder Birnen. Schließlich sind wir in einem Java-Forum und nicht in einer Agrar-Community. 

Nochmal zu deiner Auffassung Java gegenüber:

Die Sache mit der Codeformatierung: Ich versuche dir nur zu helfen. Wenn du keinen sauberen Code postest wird dir keiner helfen. So einfach ist das. Sauberer Code -> Hilfe kommt; verhunzte Codeformatierung -> have some fun without us

Quellcode "perfekt" schreiben hat nix mit "ich beschäftige mich erst seit 2 wochen mit Java" oder "ich kann seit 15 Jahren programmieren" zu tun. 
In der Schule hast du deinen Aufsatz ja auch nicht quer über die Seite geschrieben oder hast hier und da einfach so mal ne halbe Zeile ausgelassen. Man muss für sauberen Code auch nicht DIE Code-Convention einhalten. Wichtig ist vor allem dass der Code von oben bis unten einheitlich ist. Und "einheitlich schlecht formatiert" ist nunmal nicht optimal. Das wichtigste Code-Formatierungsmittel besteht aus 2 Tasten: Die Entertaste und die Tabulator-Taste. Und die wirst du ja wohl bedienen können? Wobei dir Eclipse die Tabulatortaste in den allermeisten Fällensogar abnimmt und du nur noch an der richtigen Stelle Enter drücken musst. 

Zu der Sache mit dem Debugger: Nein, das muss man nicht sofort verstehen. Deshalb hab ich ja auch schon mehrfach geschrieben dass du System.out.println benutzen sollst um während der Laufzeit einsicht in Variablen zu haben. Aber du scheinst diesen Vorschlag gekonnt zu ignorieren und dich weiter an der Sache mit der Codeconvention aufzuhalten bzw. darüber zu ärgern. 

Zu der Sache mit dem Focus: Schau dir den Link den ich dir gegeben hab nochmal an. Du musst nur eine Zeile ergänzen, dann gehts. Aber dazu muss man erstmal den zweiten Post in dem verlinkten Thread aufmerksam von Anfang bis Ende lesen. Und wir wissen ja wie gerne du liest.


----------

