2016-06-06 23 views
0

Ich war in der Mitte der Erstellung eines Low-Level-Spiel, das Schlüsseleingabe erfordert. Wie üblich importierte ich die Bibliotheken KeyListener und KeyEvent. Ich habe die drei erforderlichen Methoden erstellt: keyPressed, keyReleased, . Dann fügte ich der Klasse "testJPanel" einen keyListener hinzu und in der keyPressed Methode erstellte ich einen switch, um zu überprüfen, ob eine bestimmte Taste gedrückt wurde oder nicht. Wie bei den Methoden keyReleased und habe ich beschlossen, sie leer/leer zu lassen. Für mich scheint alles in Ordnung und Dandy aber Java scheint nicht meine Tastatureingaben zu registrieren: wenn ich die Pfeiltaste nach oben drücke, sollte das Programm "Test" drucken, aber leider tut es das nicht. Warum ist das? Jede und jede Hilfe würde geschätzt werden.Eingabe von KeyListener wird nicht erkannt

testJFrame.java

import java.awt.Color; 

import javax.swing.JFrame; 

public class testJFrame extends JFrame { 

    public testJFrame() { 
     setTitle("A test application"); 
     setSize(500, 500); 
     setBackground(Color.black); 
     setResizable(false); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 
     setFocusable(true); 

     add(new testJPanel()); 
    } 

    public static void main(String[] args) { 
     testJFrame testJFrame = new testJFrame(); 
    } 

} 

testJPanel.java

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JPanel; 
import javax.swing.Timer; 

public class testJPanel extends JPanel implements KeyListener, ActionListener { 

    public testJPanel() { 
     Timer timer = new Timer(15, this); 
     timer.start(); 
     addKeyListener(this); 
    } 

    public void update() { 
    } 

    @Override 
    public void actionPerformed(ActionEvent a) { 
     update(); 
    } 

    @Override 
    public void keyPressed(KeyEvent k) { 
     switch(k.getKeyCode()) { 
     case KeyEvent.VK_UP: 
      System.out.println("Test"); 
     } 
    } 

    @Override 
    public void keyReleased(KeyEvent k) { 
    } 

    @Override 
    public void keyTyped(KeyEvent k) { 
    } 

} 

Antwort

0

Ihr Panel fokussierbar sein und es hat Fokus haben, um KeyEvent zu erhalten speichert. hinzufügen

setFocusable(true);

zu Ihrem Panel Konstruktor und Ihre testFrame Konstruktor ändern wie dieser

testPanel = new testJPanel(); 
add(testPanel); 
testPanel.requestFocusInWindow(); 

requestFocusInWindow() muss aufgerufen werden, nachdem Sie das Panel hinzufügen.

1

Sie müssen die JPanel fokussierbar machen:

testPanel.setFocusable(true); 
testPanel.requestFocusInWindow(); 

Auch wenn Sie nur die keyPressed Methode() aus der KeyListener verwenden möchten. Sie können stattdessen die KeyAdapter-Klasse verwenden:

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 

public class TestJFrame extends JFrame { 

    public TestJFrame() { 

     setTitle("A test application"); 
     setPreferredSize(new Dimension(500, 500)); 
     setBackground(Color.black); 
     setResizable(false); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 

     JPanel testPanel = new JPanel(); 
     testPanel.addKeyListener(new KeyAdapter() { 
      @Override 
      public void keyPressed(KeyEvent e) { 
       super.keyPressed(e); 
       switch(e.getKeyCode()) { 
        case KeyEvent.VK_UP: 
         System.out.println("Test"); 
       } 
      } 
     }); 
     add(testPanel); 
     testPanel.setFocusable(true); 
     testPanel.requestFocusInWindow(); 

     pack(); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     new TestJFrame(); 
    } 
}