Java 我的键盘监听器不工作

Java 我的键盘监听器不工作,java,keyevent,Java,Keyevent,请帮帮我,伙计们。我就是不能运行KeyListener。但是我已经添加了你所需要的一切(我想)。我真的不知道这个代码出了什么问题。我添加了一个键侦听器,实现了一个键侦听器并包含了所有类,那么我忘记了什么/ import java.awt.Button; import java.awt.CardLayout; import java.awt.Color; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.Gr

请帮帮我,伙计们。我就是不能运行KeyListener。但是我已经添加了你所需要的一切(我想)。我真的不知道这个代码出了什么问题。我添加了一个键侦听器,实现了一个键侦听器并包含了所有类,那么我忘记了什么/

import java.awt.Button;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Rectangle;

/******Key classes are included*********/
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.IOException;

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

/********Key listener is Implemented********/
public class Game extends JPanel implements KeyListener,Runnable
{

    JPanel m_mainPanel;
    Thread moveBall = new Thread();
    Timer t = new Timer(5, this);

    int radius = 50;

    int posx = 400;
    int posy = 400;

    int RectPosX = 10;
    int RectPosY = 400;

    int velocityX = 0;
    int velocityY = 0;

    //Konstruktor
    public Game(JPanel mainPanel) {
        m_mainPanel = mainPanel;
        setLayout(new GridLayout(3, 1));

        JPanel north_panel = new JPanel();
        north_panel.setLayout(new FlowLayout(FlowLayout.LEFT));

        /**********I didn't forget this********/
        this.addKeyListener(this);


        /*******Focus is set**********/
        setFocusable(true);
        setFocusTraversalKeysEnabled(false);

        add(north_panel);

    }

    //Painting rectangle
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.setColor(Color.BLACK);
        g.fillRect(RectPosX, RectPosY, radius, radius);
    }



    //the key event wich isn't called
    @Override
    public void keyPressed(KeyEvent e) 
    {
        System.out.println("Key pressed");

        if(e.getKeyCode() == KeyEvent.VK_UP)
        {
            velocityY = 10;
        }

        if(e.getKeyCode() == KeyEvent.VK_DOWN)
        {
            velocityY = -10;
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyReleased(KeyEvent e) {

    }

    @Override
    public void run() 
    {
        while(true)
        {
            repaint();
        }
    }
}

以下是MCVE的一个小示例:

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

import javax.swing.JFrame;
import javax.swing.JPanel;



public class Main extends JPanel{


    public Main(){
        addKeyListener(new KeyListener(){

            @Override
            public void keyTyped(KeyEvent e) {
                System.out.println("Typed: " + e.getKeyChar());
            }

            @Override
            public void keyPressed(KeyEvent e) {
                System.out.println("Pressed: " + e.getKeyChar());
            }

            @Override
            public void keyReleased(KeyEvent e) {
                System.out.println("Released: " + e.getKeyChar());
            }

        });
    }

    public static void main(String[] args){
        JFrame frame = new JFrame("test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new Main());
        frame.setSize(300, 300);
        frame.setVisible(true);
    }
}
此程序显示出与您相同的问题:从未调用密钥侦听器!这是因为焦点在JFrame上,而不是JPanel上

要改变这一点,您必须使JPanel可聚焦。只需调用setFocusable()方法即可实现这一点。现在,您的JPanel将重点关注:

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

import javax.swing.JFrame;
import javax.swing.JPanel;



public class Main extends JPanel{


    public Main(){
        addKeyListener(new KeyListener(){

            @Override
            public void keyTyped(KeyEvent e) {
                System.out.println("Typed: " + e.getKeyChar());
            }

            @Override
            public void keyPressed(KeyEvent e) {
                System.out.println("Pressed: " + e.getKeyChar());
            }

            @Override
            public void keyReleased(KeyEvent e) {
                System.out.println("Released: " + e.getKeyChar());
            }

        });

        setFocusable(true);
    }

    public static void main(String[] args){
        JFrame frame = new JFrame("test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new Main());
        frame.setSize(300, 300);
        frame.setVisible(true);
    }
}

更复杂的程序可能需要requestFocusInWindow()函数。或者您可能希望研究使用键绑定。但是你的主要问题是由焦点问题引起的。

焦点是什么?我跟你赌5美元,这是JFrame而不是JPanel。要么将KeyListener添加到JFrame,要么将焦点赋予JPanel。如何更改焦点?编辑:JFrame没有实现KeyListener Google是您的朋友,但是requestFocusInWindow()是一个很好的开始。我拒绝了焦点请求:/I我准备在构造函数中实现设置的焦点:有MCVE:Game类:Menu类;菜单项类:菜单按钮类: