tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
9
ZUGRIFFE
3418
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Isolated Isolated ist offline Rookie
    Registriert seit
    Mar 2007
    Ort
    Bad Waldsee (BaWü)
    Beiträge
    9
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    
    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);
        
    [COLOR="Red"]    addKeyListener(new KeyAdapter() {
          public void keyTyped(KeyEvent evt) {
            System.out.println("" + evt.getKeyChar());
            goToMenu();
          }
        });[/COLOR]
        
        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
     

  2. #2
    Avatar von muddin
    muddin muddin ist offline Mitglied Bronze
    Registriert seit
    May 2005
    Ort
    Dortmund
    Beiträge
    26
    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
     
    HipHop hört sich am besten an, wenn man sich stattdessen Slayer reinzieht :D

  3. #3
    Isolated Isolated ist offline Rookie
    Registriert seit
    Mar 2007
    Ort
    Bad Waldsee (BaWü)
    Beiträge
    9
    Ok, wie realisiere ich so nen globalen KeyListener?
     

  4. #4
    Avatar von muddin
    muddin muddin ist offline Mitglied Bronze
    Registriert seit
    May 2005
    Ort
    Dortmund
    Beiträge
    26
    Im Konstruktor des Fensters:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    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 :
    1
    2
    3
    4
    
        public void keyTyped(KeyEvent k)
        {
            //.......
        }

    mfg, Muddin
     
    HipHop hört sich am besten an, wenn man sich stattdessen Slayer reinzieht :D

  5. #5
    Isolated Isolated ist offline Rookie
    Registriert seit
    Mar 2007
    Ort
    Bad Waldsee (BaWü)
    Beiträge
    9
    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?
     

  6. #6
    pria pria ist offline Mitglied Silber
    Registriert seit
    Mar 2007
    Beiträge
    85
    Also , ich habs mal in nem einfachen fenster ausprobiert und der eine geht genauso , wie der andere.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    
    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
     
    }
     

  7. #7
    Isolated Isolated ist offline Rookie
    Registriert seit
    Mar 2007
    Ort
    Bad Waldsee (BaWü)
    Beiträge
    9
    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.
     

  8. #8
    pria pria ist offline Mitglied Silber
    Registriert seit
    Mar 2007
    Beiträge
    85
    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?
     

  9. #9
    pria pria ist offline Mitglied Silber
    Registriert seit
    Mar 2007
    Beiträge
    85
    Zitat Zitat von Isolated Beitrag anzeigen
    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 :
    1
    2
    
    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
     

  10. #10
    Isolated Isolated ist offline Rookie
    Registriert seit
    Mar 2007
    Ort
    Bad Waldsee (BaWü)
    Beiträge
    9
    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
     

Ähnliche Themen

  1. KeyListener reagiert teils nicht auf die Leertaste
    Von mr12345 im Forum Java Grundlagen
    Antworten: 6
    Letzter Beitrag: 20.07.10, 09:42
  2. Antworten: 8
    Letzter Beitrag: 16.09.08, 12:50
  3. KeyListener reagiert nicht!
    Von Pichel im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 2
    Letzter Beitrag: 03.09.08, 14:14
  4. KeyListener funktioniert auf Os X nicht
    Von vaporizer im Forum Java
    Antworten: 2
    Letzter Beitrag: 16.06.04, 01:24
  5. KeyListener bei Window funktioniert nicht
    Von vaporizer im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 3
    Letzter Beitrag: 10.04.04, 16:09