Thorsten F.: Key Ereignisse funzen nicht

Hi Leute,
folgendes Problem.

Habe eine Java Klasse die den KeyListener und den MouseListener implementiert.

Der MouseListener in Bezug auf MousePressed, MouseReleased usw. funktioniert.
Aber bei keyPressed oder keyTyped passiert nichts.

Ich finde den Fehler auch nicht.

Hier der Source-Code von keyPressed:

public void keyPressed(KeyEvent e)
    {
      int keyCode = e.getKeyCode();
          if (keyCode == e.VK_DOWN)
               System.out.println(keyCode);
          if (keyCode == e.VK_UP)
               System.out.println(keyCode);
          if (keyCode == e.VK_LEFT)
               System.out.println(keyCode);
          if (keyCode == e.VK_RIGHT)
               System.out.println(keyCode);

}

Wo mache ich was falsch?

Folgenden Bibliotheken habe ich einefügt:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.util.*;
import javax.sound.sampled.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

  1. Hallo,

    folgendes Problem.

    Habe eine Java Klasse die den KeyListener und den MouseListener implementiert.
    Aber bei keyPressed oder keyTyped passiert nichts.

    Gibt es ein Element, welches eine Text-Fokus haben kann, also das mit der Tastatur überhaupt erreichbar ist, und bei dem die Methode .addKeyListener(this) aufgerufen wurde?

    Hier der Source-Code von keyPressed:

    public void keyPressed(KeyEvent e)
        {

    System.out.println(e); // Test, ob das hier überhaupt aufgerufen wird.

    int keyCode = e.getKeyCode();
              if (keyCode == e.VK_DOWN)

    ^ Wenn die Methode keyPressed() berhaupt aufgerufen wird, dann probiere hier mal die Konstante KeyEvent.VK_DOWN der Klasse statt der Eigenschaft e.VK_DOWN der Instanz anzusprechen.

    System.out.println(keyCode);

    Folgenden Bibliotheken habe ich einefügt:

    Wenn ein Package fehlen würde, würde schon das Compilieren scheitern.

    viele Grüße

    Axel

    PS: Du kennst http://java.sun.com/docs/books/tutorial/uiswing/events/keylistener.html?

    1. Gibt es ein Element, welches eine Text-Fokus haben kann, also das mit der Tastatur überhaupt erreichbar ist, und bei dem die Methode .addKeyListener(this) aufgerufen wurde?

      Hmmm......habe ein Panel in dem Buttons drinne sind.
      Und wenn ich die Leertaste drücke, dann wird automatich ein Buton gedrückt.

      Ich habe eine Klasse Main ( das eigentliche Proramm ) und dann noch eine andere Klasse, in dem ich das Panel herstelle.

      Der KeyListener wird in der Main aufgerufen.

      Könnte es daran liegen?

      1. Hallo,

        Hmmm......habe ein Panel in dem Buttons drinne sind.
        Und wenn ich die Leertaste drücke, dann wird automatich ein Buton gedrückt.

        Das ist standardmäßiges Verhalten eines focusierten Buttons. Hast Du dem Button mit .addKeyListener() einen KeyListener zugewiesen?

        Ich habe eine Klasse Main ( das eigentliche Proramm ) und dann noch eine andere Klasse, in dem ich das Panel herstelle.
        Der KeyListener wird in der Main aufgerufen.

        Also hast Du getestet, ob
        public void keyPressed(KeyEvent e)
        überhaupt aufgerufen wird, so wie ich es vorgeschlagen habe?

        Die Klasse Main erweitet also einen Container und implementiert das Interface KeyListener und die Components, die überwacht werden sollen, werden in der Klasse Main zu diesem Container hinzugefügt? Dann muss jeder der Components, die überwacht werden sollen mit .addKeyListener(this) der TastaturÜberwacher zugewiesen werden. Dann sollte bei public void keyPressed(KeyEvent e) auch etwas ankommen, wenn auf dem Component eine Taste gedrückt wird.

        viele Grüße

        Axel

        1. Jo, besten Dank!
          Jetzt habe ich es hingebekommen, in dem ich vor jedem zu überwachenden Component addKeyListener vorgeschrieben habe.

          Jetzt kann ich endlich weiterproggen!

          THX:

          1. Könntest du mir eventuell noch sagen, warum ich das Bild1 nur nach oben und nach rechts bewegen kann?

            public void paint(Graphics g)
                {
                    super.paint(g);
                    g.drawImage(Bild1,x,y,100,100,this);
                    g.drawImage(Bild2,400,50,100,100,this);
                }

            public void keyPressed(KeyEvent e)
                {
                  int keyCode = e.getKeyCode();
                  switch(keyCode)
                  {
                      case KeyEvent.VK_S:   //Unten
                           y=y+5;
                      case KeyEvent.VK_W:   //Oben
                           y=y-5;
                      case KeyEvent.VK_A:   //links
                           x=x-5;
                      case KeyEvent.VK_D:   //rechts
                           x=x+5;
                  }//switch

            repaint(); // neu malen, wenn sich was geändert hat

            }

            1. Hmmm....

              so gehts:

              int keyCode = e.getKeyCode();
                    if( e.getKeyCode() == KeyEvent.VK_DOWN )
                        y=y+5;
                    if( e.getKeyCode() == KeyEvent.VK_UP )
                        y=y-5;
                    if( e.getKeyCode() == KeyEvent.VK_LEFT )
                        x=x-5;
                    if( e.getKeyCode() == KeyEvent.VK_RIGHT )
                        x=x+5;

            2. Hallo,

              switch(keyCode)
                    {
                        case KeyEvent.VK_S:   //Unten
                             y=y+5;
                        case KeyEvent.VK_W:   //Oben
                             y=y-5;
                        case KeyEvent.VK_A:   //links
                             x=x-5;
                        case KeyEvent.VK_D:   //rechts
                             x=x+5;
                    }//switch

              http://java.sun.com/docs/books/tutorial/java/nutsandbolts/switch.html

              Achte besonders auf die Bedeutung von break;.

              viele Grüße

              Axel