KeyListener auf JPanel

Status
Nicht offen für weitere Antworten.

---

Aktives Mitglied
Hallo,

ich möchte ein image entsprechend der Tastatureingabe bewegen. Das funktioniert auch, solange ich den KeyListener an den Frame hänge.

Auf dem Frame werden später aber noch andere Listener sein, so dass ich einen KeyListener für ein JPanel brauche.

Beim googeln habe ich gesehn, dass man das JPanel focussieren muss:

setFocusTraversalKeysEnabled ( true );
isRequestFocusEnabled();

Nutzt aber nix bei mir.

Code:
class Test extends JPanel
{
   BufferedImage bar;
   BufferedImage backgr;
  
   static JFrame f;

    public Test()
    {
       setPreferredSize(new Dimension(800, 574));
        try {
 //       	if (offImage != null)
 //               g.drawImage(offImage, 0, 0, this); 
        	bar = ImageIO.read(new File("client.png"));
           System.out.println(new File("client.png").exists()); 
           backgr = ImageIO.read(new File("schedule.jpg"));
   
           }
           catch(IOException e)
              {
              System.err.println(e.getMessage());
               }
    }

    public void paint(Graphics g) {
        super.paint(g);
        
        g.drawImage(backgr, 230, 80, this);
        g.drawImage(bar, p1x, p1y, this);
 
        System.out.println("ZEICHNE! "+p1x);
     }
   
    public static void main( String args[] ) {
    f = new JFrame();
        f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
      f.setSize ( 800, 574 );
        JPanel p = new JPanel();  
 
        BorderLayout layout = new BorderLayout();
      
        p.setLayout ( layout );
        p.add ( new test() );
        p.addKeyListener(new Keyboard());
        p.setVisible( true );
    //  System.out.println( "getParent" + p.getParent ());   
  //      p.setFocusTraversalKeysEnabled ( true );
        p.isRequestFocusEnabled();
    
        
        f.getContentPane().add ( p );
        f.setVisible( true );
     //   f.addKeyListener(new Keyboard());
 //       f.repaint();
    
        }
   

    public static int p1x = 230;
    public static int p1y = 80;
    
}

Listener:

Code:
public class Keyboard implements KeyListener {   
   
   String aktion="nix";
   public boolean isFocusTraversable() { 
      
      return true; 
  } 

public void keyTyped(KeyEvent e) {}
   
public void keyReleased(KeyEvent e){}

public void keyPressed(KeyEvent e) {
   int pressed=e.getKeyCode();

   if (e.getKeyCode() == KeyEvent.VK_RIGHT) 
   {
      aktion = "Oben";
      test.p1x = test.p1x + 5;
      System.out.println("WERT X-ACHSE: "+test.p1x);

      test.f.repaint();
   }
   if (e.getKeyCode() == KeyEvent.VK_LEFT)//40)
   {
      aktion = "Unten";
      test.p1x = test.p1x - 5;
      System.out.println("WERT X-ACHSE: "+test.p1x);
      test.f.repaint();
      
   }
   
   if (e.getKeyCode() == KeyEvent.VK_DOWN) 
   {
      aktion = "Oben";
      test.p1y = test.p1y + 5;
      System.out.println("WERT y-ACHSE: "+test.p1y);

      test.f.repaint();
   }
   if (e.getKeyCode() == KeyEvent.VK_UP)
   {
      aktion = "Unten";
      test.p1y = test.p1y - 5;
      System.out.println("WERT y-ACHSE: "+test.p1y);
      test.f.repaint();
      
   }
   
  
}

}

Hat jemand ne Idee?
schon mal vielen Dank!
 
Hier zwei Ausschnitte:


2)

class RaceListener implements KeyListener, ActionListener
{

public void keyReleased(KeyEvent e)
{

if (e.getKeyCode() == 32)
{

System.out.println("Es geht!");
}

--> Kommt hier noch was dazu ?? (Außer die fürs Interface zu implementierende Methoden ?)
____________________________________________________________________________________________

1)

JPanel innerpanel = new JPanel();
innerpanel.setLayout(null);
innerpanel.setBackground(Color.white);

innerpanel.setFocusable(true); <-- Wo wird diese Methode hingeschrieben ?

innerpanel.addKeyListener(new RaceListener());
this.add(innerpanel);

}


wo wird diese Methode setFocusable(true); hingeschrieben ?? Hab schon zig Seiten zu diesem Thema durchgelesen aber verstehen tu ich es immer noch nicht!
Das Listener Konzept hab ich mit Buttons verstanden aber hier mit dem Fokus ist ein wenig komisch!

Der innerpanel befindet sich in einem Panel das ein CardLayout beinhaltet! Falls das einen unterschied machen sollte!
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben