Java 我的键盘监听器不工作
请帮帮我,伙计们。我就是不能运行KeyListener。但是我已经添加了你所需要的一切(我想)。我真的不知道这个代码出了什么问题。我添加了一个键侦听器,实现了一个键侦听器并包含了所有类,那么我忘记了什么/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
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类;菜单项类:菜单按钮类: