KeyListener reagiert nicht

Isolated

Grünschnabel
Hi

Ich programmiere an einem Spiel. Es gibt eine Art Startmenü wovon aus sich das eigentliche Spiel starten lässt. Nun möchte ich, dass man während dem Spiel durch drücken irgendeiner Taste wieder ins Menü zurück kommt. Ich habe dazu ein KeyListener eingebaut. Der reagiert aber nicht =(

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

/**
  *
  * Fenster
  *
  * @version 1.0 vom 20.11.2006
  * @author Florian Ferg
  */

public class Fenster extends Frame {
  private Robot rob;

  private int breite;
  private int hoehe;
  private Panel menu;
  private Spielfeld spl;
  private Button start;
  private Button exit;
  // Ende Variablen

  public Fenster() {
    super( "GNOP" );
    
    try {
      rob = new Robot();
    }
    
    catch(AWTException e) {

    }
    
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    breite = (int)d.getWidth();
    hoehe = (int)d.getHeight();
    setSize(breite, hoehe);
    setLayout(null);
    
    menu = new Panel();
    menu.setSize(100, 100);
    menu.setLocation((breite / 2) - (menu.getWidth() / 2), (hoehe / 2) - (menu.getHeight() / 2));
    menu.setLayout(new GridLayout(2, 1, 0, 10));
    start = new Button( "Start" );
    menu.add(start);
    start.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        startActionPerformed(evt);
      }
    });
    
    exit = new Button( "Exit" );
    menu.add(exit);
    exit.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        exitActionPerformed();
      }
    });
    add(menu);
    
    addKeyListener(new KeyAdapter() {
      public void keyTyped(KeyEvent evt) {
        System.out.println("" + evt.getKeyChar());
        goToMenu();
      }
    });
    
    setResizable(false);
    setUndecorated( true );
    setBackground( new Color( 25, 25, 112 ) );
    setVisible(true);
  }

  public void goToMenu() {
    setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
    menu.setVisible(true);
  }

  public void startActionPerformed(ActionEvent evt) {
    menu.setVisible(false);
    spl = new Spielfeld();
    spl.setLocation( ( breite / 2 ) - ( spl.getWidth() / 2 ), ( hoehe / 2 ) - ( spl.getHeight() / 2 )  );
    add( spl );
    setCursor(Toolkit.getDefaultToolkit().createCustomCursor(Toolkit.getDefaultToolkit().getImage(""), new Point(0,0), "invisible"));
    addMouseMotionListener( new MouseMotionAdapter() {
      public void mouseMoved( MouseEvent evt ) {
        if(evt.getX() < spl.getX()) {
          rob.mouseMove(spl.getX(), spl.getY());
        }
        
        else if(evt.getX() > spl.getX() + spl.getWidth()) {
          rob.mouseMove(spl.getX() + spl.getWidth(), spl.getY());
        }
        
        else if(evt.getY() < spl.getY() || evt.getY() > spl.getY() + spl.getHeight()) {
          rob.mouseMove(evt.getX(), spl.getY());
        }
      }
    });
  }
  
  public void exitActionPerformed() {
    System.exit(0);
  }
}

Kann mir irgendwer weiterhelfen?

Danke im Vorraus =)

Gruß, Flo
 
Nabend!
Das Problem ist, dass du den Focus auf dem Button hast.
Du weist ja nen KeyListener dem Fenster zu, das hat aber nicht den Focus.
2 Möglichkeiten:
1) start.setFocusable(false) und exit.setFocusable(false)
2) ein "Globaler" keylistener, der alle Tastatureingaben abfängt, unabhängig, welches element den Focus hat (halte ich persönlich auhc für die bessere Lösung;)


mfg,
Muddin
 
Im Konstruktor des Fensters:
Code:
AWTEventListener ael = new AWTEventListener() 
	{
  		public void eventDispatched( AWTEvent event ) 
  		{  				
  			if(event.getID() == KeyEvent.KEY_TYPED)
  			{
  				keyTyped((KeyEvent)event);  					
  			}
  		}
	};
	Toolkit.getDefaultToolkit().addAWTEventListener( ael, AWTEvent.KEY_EVENT_MASK);
Dann brauchst du noch die Methode, die bei dem event aufgerufen wird - in diesem fall keyTyped()
Code:
	public void keyTyped(KeyEvent k)
	{
		//.......
	}

mfg, Muddin
 
mh.. hat ned funktioniert =(

also so wie ich das verstanden hab ist das jetz ein KeyListener der reagiert, egal welches Objekt gerade den Focus hat. Kann es vllt sein dass es daran liegt dass mein Spielfeld ein Canvas ist Die Sache mit dem Focus musst ich noch nie wirklich beachten. Hab ich also noch keine Erfahrung mit. Kann ein Canvas überhaupt den Focus haben?
 
Also , ich habs mal in nem einfachen fenster ausprobiert und der eine geht genauso , wie der andere.
Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 07.03.2007
  * @author
  */

public class testframe extends JFrame {
  // Anfang Variablen
  // Ende Variablen

  public testframe(String title) {
    // Frame-Initialisierung
    super(title);
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent evt) { System.exit(0); }
    });
    int frameWidth = 300;
    int frameHeight = 300;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2 ;
    setLocation(x, y);
    Panel cp = new Panel(null);
    add(cp);
    // Anfang Komponenten
    this.addKeyListener(new KeyAdapter() {
      public void keyTyped(KeyEvent evt){System.out.println(evt); }});

    // Ende Komponenten

    setResizable(false);
    setVisible(true);
  }

  // Anfang Ereignisprozeduren
  // Ende Ereignisprozeduren

}
 
Ok, dann versteh ich nich, warum er bei mir ned will ^^
Ist es eigentlich für den KeyListener von bedeutung, wo die Maus sich grade befindet?
Das wär blöd ^^ weil mein Robot ständig verhindert, dass die Maus das Spielfeld verlässt.
 
Ja , ich musste erst einmal ins Fenster klicken , dammit der auf die Events ansprach.
Weiss nicht ob das von bedeutung ist.

Andere Frage:
Wie krieg ich die Nicht-Standart-Tasten wie z.b. Strg ausgelesen?
 
Ok, dann versteh ich nich, warum er bei mir ned will ^^
Ist es eigentlich für den KeyListener von bedeutung, wo die Maus sich grade befindet?
Das wär blöd ^^ weil mein Robot ständig verhindert, dass die Maus das Spielfeld verlässt.

Guck mal , hast du das schon mal auf diese weise verarbeitet?
Code:
String str = "" + k;
if(str.equals("java.awt.event.KeyEvent[KEY_TYPED,keyCode=0,keyText=Unknown keyCode: 0x0,keyChar=Eingabe,keyLocation=KEY_LOCATION_UNKNOWN] on panel0"))
/*Wobei k das Ereignissobjekt ist*/
wenn am Ende panel0 steht , ist das der Layout-Panel , steht da frame0 , ist das Fenster gemeint und vieleicht musst du da bloss deinen Canvas als canvas0 eintragen :rolleyes:
 
Ich hab mir das mit der Tastatur wohl zu einfach vorgestellt....
Da muss man so viel beachten.. ich werde das Menü jetzt wohl einfach über MouseClicked aufrufen ;)

Ich hätt trotzdem gern noch deine icq oder msn adresse =P
 
Zurück