【问题标题】:Input from KeyListener isn't recognized无法识别来自 KeyListener 的输入
【发布时间】:2016-06-06 12:42:53
【问题描述】:

我正在创建一个需要按键输入的低级游戏。所以,像往常一样,我导入了KeyListenerKeyEvent 库。我创建了三个必需的方法:keyPressedkeyReleasedkeyTyped。然后我在类“testJPanel”中添加了一个keyListener,并且在keyPressed 方法中,我创建了一个switch 来检查某个按钮是否被按下。至于keyReleasedkeyTyped 方法,我选择将它们留空。对我来说,一切似乎都很好,但Java 似乎不想注册我的键盘输入:当我按下向上箭头键时,程序应该打印“测试”,但遗憾的是,它没有。为什么?任何和所有的帮助将不胜感激。

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) {
    }

}

【问题讨论】:

    标签: java input jframe jpanel keylistener


    【解决方案1】:

    您需要使 JPanel 具有焦点:

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

    此外,如果您只想使用 KeyListener 中的 keyPressed 方法()。您可以改用 KeyAdapter 类:

    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();
        }
    }
    

    【讨论】:

      【解决方案2】:

      您的面板必须是可聚焦的,并且它必须具有焦点才能接收 KeyEvent。添加

      setFocusable(true);

      到您的面板构造函数并像这样更改您的 testFrame 构造函数

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

      requestFocusInWindow() 必须在添加面板后调用。

      【讨论】:

        猜你喜欢
        • 2020-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-09
        • 2014-03-27
        • 1970-01-01
        • 1970-01-01
        • 2013-10-14
        相关资源
        最近更新 更多