无法识别来自 KeyListener 的输入
Input from KeyListener isn't recognized
我正在创建一个需要按键输入的低级游戏。因此,像往常一样,我导入了 KeyListener
和 KeyEvent
库。我创建了三个必需的方法:keyPressed
、keyReleased
、keyTyped
。然后我在 class "testJPanel" 中添加了一个 keyListener
并且在 keyPressed
方法中,我创建了一个 switch
来检查某个按钮是否被按下或不是。至于keyReleased
和keyTyped
方法,我选择留下empty/blank。对我来说,一切似乎都很好,但 Java
似乎不想注册我的键盘输入:当我按下向上箭头键时,程序应该打印 "Test",但遗憾的是,它没有't。为什么?任何帮助将不胜感激。
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) {
}
}
您的面板必须是可聚焦的,并且必须具有焦点才能接收 KeyEvent。添加
setFocusable(true);
到您的面板构造函数并像这样更改您的 testFrame 构造函数
testPanel = new testJPanel();
add(testPanel);
testPanel.requestFocusInWindow();
添加面板后必须调用 requestFocusInWindow()。
您需要使 JPanel 可聚焦:
testPanel.setFocusable(true);
testPanel.requestFocusInWindow();
此外,如果您只想使用 KeyListener 中的 keyPressed 方法 ()。您可以改用 KeyAdapter class:
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();
}
}
我正在创建一个需要按键输入的低级游戏。因此,像往常一样,我导入了 KeyListener
和 KeyEvent
库。我创建了三个必需的方法:keyPressed
、keyReleased
、keyTyped
。然后我在 class "testJPanel" 中添加了一个 keyListener
并且在 keyPressed
方法中,我创建了一个 switch
来检查某个按钮是否被按下或不是。至于keyReleased
和keyTyped
方法,我选择留下empty/blank。对我来说,一切似乎都很好,但 Java
似乎不想注册我的键盘输入:当我按下向上箭头键时,程序应该打印 "Test",但遗憾的是,它没有't。为什么?任何帮助将不胜感激。
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) {
}
}
您的面板必须是可聚焦的,并且必须具有焦点才能接收 KeyEvent。添加
setFocusable(true);
到您的面板构造函数并像这样更改您的 testFrame 构造函数
testPanel = new testJPanel();
add(testPanel);
testPanel.requestFocusInWindow();
添加面板后必须调用 requestFocusInWindow()。
您需要使 JPanel 可聚焦:
testPanel.setFocusable(true);
testPanel.requestFocusInWindow();
此外,如果您只想使用 KeyListener 中的 keyPressed 方法 ()。您可以改用 KeyAdapter class:
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();
}
}