Einfaches Menü erstellen

Status
Nicht offen für weitere Antworten.

Murray

Top Contributor
moe_joe hat gesagt.:
Murray hat gesagt.:
Code:
catch ( Exception e) 
   { //--- besser: genau angeben, welche Art von Exception man catchen will
      wie meisnt du das jetzt genau? komm grad nich hinterher
   }

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.
 
T

tuxedo

Gast
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).

Code:
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

Aktives Mitglied
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
 
T

tuxedo

Gast
Also ich hab mir folgende hangman.dat gebaut:

Code:
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)
at Hangman.<init>(Hangman.java:47)
at Hangman.main(Hangman.java:151)

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

Aktives Mitglied
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
 
T

tuxedo

Gast
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

Aktives Mitglied
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 ;-)
 
T

tuxedo

Gast
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

Aktives Mitglied
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
 
T

tuxedo

Gast
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

Aktives Mitglied
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....
 
T

tuxedo

Gast
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

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

tuxedo

Gast
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

Aktives Mitglied
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...
 
T

tuxedo

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

moe_joe

Aktives Mitglied
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

Top Contributor
:lol: :applaus:

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

moe_joe

Aktives Mitglied
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?
 
T

tuxedo

Gast
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

Aktives Mitglied
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...
 
T

tuxedo

Gast
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

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

tuxedo

Gast
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

Aktives Mitglied
: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

Top Contributor
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

Aktives Mitglied
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.
 
T

tuxedo

Gast
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

Top Contributor
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

Aktives Mitglied
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:
Code:
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]
 
G

Guest

Gast
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
 
T

tuxedo

Gast
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

Aktives Mitglied
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

Aktives Mitglied
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)

Code:
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?
 
T

tuxedo

Gast
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

Aktives Mitglied
das in den zeilen was falsch ist verstehe ich schon, aber z.B. der erste fehler Z. 89 da steh
Code:
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.....
 

Murray

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

moe_joe

Aktives Mitglied
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

Code:
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
 
T

tuxedo

Gast
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

Top Contributor
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

Aktives Mitglied
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. :D (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^^) :?:

Code:
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!
 
T

tuxedo

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

Ii Zeile 51:

Code:
CONTROL=new KL()

Ich hab nirgens ein

Code:
KL CONTROL;
oder
Code:
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

Aktives Mitglied
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?
 
T

tuxedo

Gast
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

Aktives Mitglied
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
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
R OOP Einfaches Programmierbeispiel für Assoziation, Aggregation und Komposition gesucht Java Basics - Anfänger-Themen 10
Kamy Ein einfaches "Vier Gewinnt" Spiel für Anfängerin Java Basics - Anfänger-Themen 51
J Einfaches Quadrat auf der Console ausgeben lassen Java Basics - Anfänger-Themen 7
H ein einfaches Tic Tac Toe Spiel Java Basics - Anfänger-Themen 1
L Einfaches Kartenspiel (Spieler Klasse) Java Basics - Anfänger-Themen 14
R Einfaches refresh während runtime Java Basics - Anfänger-Themen 4
M JSP-Einfaches Bild anzeigen Java Basics - Anfänger-Themen 4
F Einfaches Threadbeispiel.. Java Basics - Anfänger-Themen 7
S Referentielle Integrität ? (Einfaches Bsp) Java Basics - Anfänger-Themen 2
G Erste Schritte Einfaches Gästebuch erstellen mit Array Java Basics - Anfänger-Themen 7
V Klassen import - einfaches Umleiten auf eigene Klassen? Java Basics - Anfänger-Themen 8
H Erste Schritte Einfaches Programm und GUI zusammen bringen Java Basics - Anfänger-Themen 3
A Android Datenbank gaaanz einfaches Insert geht nicht - warum? Java Basics - Anfänger-Themen 4
B OOP einfaches regex Java Basics - Anfänger-Themen 10
K einfaches Drucken von Text (und ggf Bildern,gemischt) Java Basics - Anfänger-Themen 11
M Ganz einfaches Beispiel, finde den Fehler aber nicht :( Java Basics - Anfänger-Themen 2
S Einfaches Regulaerer Ausdruck Problem Java Basics - Anfänger-Themen 7
E einfaches Schachbrett generieren Java Basics - Anfänger-Themen 9
M Einfaches TicTacToe Programm Java Basics - Anfänger-Themen 19
S einfaches Pokerprogramm Java Basics - Anfänger-Themen 52
S KeyListener für einfaches Programm Java Basics - Anfänger-Themen 3
H einfaches Array -> ']' expected Java Basics - Anfänger-Themen 9
H Webservice - Einfaches Beispiel Java Basics - Anfänger-Themen 2
F Ich raffs nicht! - Wie mache ich ein einfaches Java-window? Java Basics - Anfänger-Themen 54
S Einfaches int Array gibt über System.out.println merkwürden Wert aus Java Basics - Anfänger-Themen 9
K Einfaches Bubblesort Java Basics - Anfänger-Themen 11
O einfaches rechnen mit zahlen Java Basics - Anfänger-Themen 4
H Einfaches Date-parse problem Java Basics - Anfänger-Themen 2
T Array auf einfaches Element umwandeln Java Basics - Anfänger-Themen 8
G einfaches Regex Problem Java Basics - Anfänger-Themen 4
M EInfaches Addieren mit Abbruchbedingung Java Basics - Anfänger-Themen 9
M [Einfaches Beispiel] Problem mit innere Klassen Java Basics - Anfänger-Themen 4
S Einfaches Rechenprogramm Java Basics - Anfänger-Themen 2
G Einfaches Rechenprogramm schreiben! Java Basics - Anfänger-Themen 8
A ausgabe eines arrays - einfaches beispiel Java Basics - Anfänger-Themen 4
D was ist denn nun schon wieder? Einfaches JSP. Java Basics - Anfänger-Themen 6
D Ein einfaches Problem aber ich brauche einen TIP Java Basics - Anfänger-Themen 2
R einfaches Programm, viele Probleme Java Basics - Anfänger-Themen 29
C Einfaches Paint-Programm Java Basics - Anfänger-Themen 9
P Ein einfaches Spiel: TicTacToe. Fehler und Vorschläge Java Basics - Anfänger-Themen 3
F einfaches Menue in einer Textkonsole Java Basics - Anfänger-Themen 4
W einfaches Frame öffnen Java Basics - Anfänger-Themen 2
N Wahrscheinlich ganz einfaches Problem, aber unverständlich! Java Basics - Anfänger-Themen 3
S einfaches script mit Eingabeaufforderung starten (javac) Java Basics - Anfänger-Themen 8
B Einfaches Speichern und Laden in Java? Java Basics - Anfänger-Themen 3
L Einfaches Warten in eine Schleife Java Basics - Anfänger-Themen 9
P einfaches Perl-Skript aufrufen Java Basics - Anfänger-Themen 7
G einfaches jdialog beispiel Java Basics - Anfänger-Themen 1
B Oberflaecheprog einfaches beispiel (button action listener) Java Basics - Anfänger-Themen 5
N Vermutlich einfaches Problem.. Java Basics - Anfänger-Themen 3
J Wert in Dropdown Menü kursiv schrieben Java Basics - Anfänger-Themen 19
M Von einem Menü Methode aus anderer Klasse ausführen, die errechnete Werte in Datei schreibt. Java Basics - Anfänger-Themen 8
H Befehle in einem Menü aktivieren Java Basics - Anfänger-Themen 1
O Popoup Menü im JTable richtig anzeigen Java Basics - Anfänger-Themen 6
J Zusätzliches Menü in einem Terminal erstellen Java Basics - Anfänger-Themen 0
J Panel und Menü Java Basics - Anfänger-Themen 6
J Java Anwendungs-Menü Java Basics - Anfänger-Themen 8
S Hallo und Fragen zu Arbeitsverzeichnis und Menü Java Basics - Anfänger-Themen 8
J Menü mit mehreren Bildern Java Basics - Anfänger-Themen 5
R Switch: Nach durchlaufen des Case wieder zum Menü Java Basics - Anfänger-Themen 3
K Erste Schritte Wie mache ich weiter? (Spiel-Menü) Java Basics - Anfänger-Themen 9
G menü in simulation Java Basics - Anfänger-Themen 3
K Drop-down Menü (swing) Java Basics - Anfänger-Themen 4
1 Menü mit Buttons erstellen Java Basics - Anfänger-Themen 10
M Login-Menü Java Basics - Anfänger-Themen 7
MisterSeven Netbeans - Dropdown Menü erstellen? Java Basics - Anfänger-Themen 4
A Menü Java Basics - Anfänger-Themen 7
C kleines Menü erzeugen und anzeigen Java Basics - Anfänger-Themen 11
M Problem beim Ereignishandling mit Menü Java Basics - Anfänger-Themen 2
TheKing Java-Menü Machen Java Basics - Anfänger-Themen 7
P Baum-Menü in Java Java Basics - Anfänger-Themen 5
J Java-Menü Machen Java Basics - Anfänger-Themen 7
Antoras Tab über Menü ansteuern Java Basics - Anfänger-Themen 2
G Rechtsklick Menü? Java Basics - Anfänger-Themen 2
G Strich im Menü Java Basics - Anfänger-Themen 2
D JApplet menü Java Basics - Anfänger-Themen 8
A Menü aktivieren Java Basics - Anfänger-Themen 5
N Von einem Menü in Untermenü Java Basics - Anfänger-Themen 3
M Menü Programmieren Java Basics - Anfänger-Themen 2
T Wie kann ich andere Programme in Java über ein Menü öffnen? Java Basics - Anfänger-Themen 12
M Dialog aus Menü aufrufen Java Basics - Anfänger-Themen 13
T Rechsklick menü erstellen Java Basics - Anfänger-Themen 2
J Menü-strip beenden-knopf mit Ende des Programms belegen ? Java Basics - Anfänger-Themen 2
D Menü soll immer da bleiben - Frames sollen wechseln Java Basics - Anfänger-Themen 3
S RadioButtons im Menü Java Basics - Anfänger-Themen 5
M statt drop down menü - buttons Java Basics - Anfänger-Themen 5
S Menü addActionListener Java Basics - Anfänger-Themen 11
A Java-Konsolen Menü Java Basics - Anfänger-Themen 6
A Aus dem menü heraus andere Felder bearbeiten Java Basics - Anfänger-Themen 2
C Swing-Fenster mit Menü- und Toolbar Java Basics - Anfänger-Themen 3
F Menü erstellen Java Basics - Anfänger-Themen 14
G PopupMenu; Welches Menü war's denn nun? Java Basics - Anfänger-Themen 6
B Was mach ich falsch mit einem Menü in Swing Java Basics - Anfänger-Themen 2
T Problem bei Menü Java Basics - Anfänger-Themen 2
XWing Int erstellen lassen? Java Basics - Anfänger-Themen 11
onlyxlia Schlüsselworte Was meint man mit "einen Typ" in Java erstellen? Java Basics - Anfänger-Themen 2
A exe Datei erstellen Java Basics - Anfänger-Themen 8
J Packages erstellen Java Basics - Anfänger-Themen 7
Athro-Hiro Weißes Bild in Java erstellen Java Basics - Anfänger-Themen 3
H Excel-Tabellen mit Java erstellen Java Basics - Anfänger-Themen 4

Ähnliche Java Themen


Oben