Anzeigefehler der Menüleiste

moe_joe

Mitglied
hab da so nen problem.... hab mir bei meinem Programm ein JMenü erstellt. Das läuft auch soweit! Wenn ich das Programm starte wird die Leiste aber manchmal nicht angezeigt. Meistens ist es so wenn ich das programm zum 1. mal starte wird die leiste nicht angezeigt. schließe ich es dann wieder und öffne es erneut wird die menüleiste angezeigt.... is immer ne glückssache ob sie angezeigt wird oder nicht. kennt vielleicht jemand das problem, hat damit schon erfahrungen gemacht oder weis wie man das beheben kann?

mfg moe_joe
 
Hallo,

Ohne Quelltext, wird man dir nicht helfen können.

Ich vermute mal, dass die Menüleiste nicht angezeigt wird, weil sie durch eine andere Komponente überdeckt wird.

MFG

zEriX
 
Code:
import java.awt.*;
import java.awt.event.*;
import java.io.*;

import javax.swing.AbstractAction;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class Hangman extends JPanel implements ActionListener {

	private static final long serialVersionUID = 1L;
	// Globale Variablen
	final static int WND_B = 425, 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];
		}
	}// Ende Public Hangman () Hauptroutine

	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);
		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 grafikdateien

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

			int i;
			boolean status = false;
			boolean check = false;

			for (i = 0; i < alphab.length; i++) {
				if (c == alphab[i]) {
					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) // Main
	{
		Hangman Jpanel = new Hangman(); // Neuer Panel
		final JFrame frame = new JFrame("JFrame"); // Frame vereinbaren
		JMenuBar menuBar = new JMenuBar();// Menübar erstellen
		Jpanel.setFocusable(true);
		Jpanel.requestFocusInWindow(); // Focus in Panel setzen
		frame.setTitle(".:Hangman:."); // Titel setzen
		frame.add(Jpanel, BorderLayout.CENTER); // Frame den Panel zuweisen
		frame.setSize(425, 360); // Größe setzen
		frame.setResizable(false);
		frame.setBackground(Color.white); // Hintergrund schwarz
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// Beim Klicken
		frame.setVisible(true);// Frame sichtbar machen
		frame.setJMenuBar(menuBar);// Menü dem Frame zuweisen
		JMenu datei = new JMenu("Datei");// Menüpunkt "Datei" Vereinbaren
		menuBar.add(datei);// Menüpunkt "Datei" der Menübar hinzufügen
		JMenu hilfe = new JMenu("Hilfe");// Menüpunkt "Hilfe" vereinbaren
		menuBar.add(hilfe);// Menüpunkt "Hilfe" der Menübar hinzufügen
		datei.add(new AbstractAction("Nochmal") {
			public void actionPerformed(ActionEvent arg0) {
				System.out.print("Nochmal...");
				frame.dispose();
                initializeNewWindow();
			}

			private void initializeNewWindow() {
				// TODO Auto-generated method stub
				
			}
		});

		datei.add(new AbstractAction("Beenden") {
			public void actionPerformed(ActionEvent e) {
				System.out.println("Beenden...");
				System.exit(0);
			}
		});
		hilfe.add(new AbstractAction("Spielregeln") {
			public void actionPerformed(ActionEvent e){
				System.out.println("Spielregeln...");
				JDialog d = new JDialog(); 
				JTextArea ta = new JTextArea();
				ta.setEditable(false);
				ta.setLineWrap(true);
				ta.setBackground(Color.black);
				ta.setWrapStyleWord(true);
				ta.setForeground(Color.white);
				ta.setText("                          .:Hangman:. Spielregeln")
				d.add(ta);
				d.setTitle(".:Hangman:. - Spielregeln");
				d.setSize( 300, 450 ); 
				d.setResizable(false);
				d.setLocation (450, 0);
				d.setVisible( true );
			}

		});
	}// Ende Main

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub

	}
}// Ende public class Hangman
 
Guck dir deinen Quellcode noch einmal genau an und erzeuge das Menü am besten erst nach den anderen Komponenten. Vermute auch mal, dass die Leiste überlagert wird.
 
Nur mal so als kleiner Tipp, man sollte ein Fenster erst sichtbar machen, wenn alles schon hinzugefügt wurde. Das ist nämlich das Problem. Du machst dein Fenster schon sichtbar, bevor deine Menuleiste im Fenster ist. Danach wird der Fensterinhalt auch nicht mehr neu gezeichnet. Setz einfach frame.setVisible(true) ans Ende und dann sollte es funktionieren.

MFG

zEriX
 
Zurück