java - 为什么我的KeyListener不会做任何事情?
问题描述:
当我尝试点击空格键时,没有任何反应。我用不同的钥匙试过,但没有任何效果。有人能告诉我我做错了什么吗?或为什么这不工作?java - 为什么我的KeyListener不会做任何事情?
另外我正在使用Java SE 1.6来编译这个。
这里是我的代码:
package bigbass1997;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.*;
@SuppressWarnings("serial")
public class Main extends JFrame implements KeyListener, MouseListener, MouseMotionListener{
// VARIABLES
public static String title = "Royal Casino";
public static String author = "bigbass1997";
public static String version = "0.0.0";
GamePanel gp;
public Main(){
gp = new GamePanel();
this.setSize(GamePanel.gameDim);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
this.setTitle(title + " " + version);
this.setResizable(false);
this.setLocationRelativeTo(null);
this.addKeyListener(this);
this.addMouseListener(this);
this.addMouseMotionListener(this);
this.add(gp);
}
@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if(key == KeyEvent.VK_SPACE){
Slots.slotsThread.start();
System.out.println("Slot THREAD Started");
GamePanel.slotsplaying = true;
}
}
public static void main(String[] args) {
@SuppressWarnings("unused")
Main m = new Main();
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseDragged(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseMoved(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseClicked(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub
}
}
答
这是一个焦点问题 - KeyListeners只工作如果正在听取组件具有焦点。改为使用密钥绑定。 Java Swing教程中有关于这个主题的体面的Key Bindings tutorial。
例如:
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.*;
@SuppressWarnings("serial")
public class BigBassMain extends JFrame {
private static final String SPACE_BAR = "space bar";
// VARIABLES
public static String title = "Royal Casino";
public static String author = "bigbass1997";
public static String version = "0.0.0";
GamePanel gp;
public BigBassMain(){
gp = new GamePanel();
this.setSize(GamePanel.gameDim);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
this.setTitle(title + " " + version);
this.setResizable(false);
this.setLocationRelativeTo(null);
this.add(gp);
ActionMap actionMap = gp.getActionMap();
InputMap inputMap = gp.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), SPACE_BAR);
actionMap.put(SPACE_BAR, new AbstractAction() {
@Override
public void actionPerformed(ActionEvent arg0) {
Slots.slotsThread.start();
System.out.println("Slot THREAD Started");
GamePanel.slotsplaying = true;
}
});
}
public static void main(String[] args) {
@SuppressWarnings("unused")
BigBassMain m = new BigBassMain();
}
}
另外,你真的不希望有你的GUI类实现你的听众,因为它是一个问可怜的小类的事太多了。相反,要么为您的听众使用匿名内部类,要么使用单独的类。
答
您正在将KeyListener添加到错误的JComponent中。试试这个:
this.getGlassPane().addKeyListener(this);
更多有关如何就这一问题的Swing库的作品可以在这里找到的信息:http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html
如何添加一个KeyListener的玻璃面板要解决的任择议定书的问题? – 2012-01-16 02:45:06
-1,在问题中甚至建议用户使用玻璃窗格? KeyEvents转到具有焦点的组件。玻璃窗格默认是不可见的,所以它不会收到关键事件。这很好,你链接到Swing教程,但是,你应该链接到的部分是关于“如何使用键绑定”的部分。 Swing被设计为使用键绑定,而不是键监听器。 – camickr 2012-01-16 03:02:10
'在问题中,它甚至暗示用户正在使用玻璃窗? Swing的基本知识告诉你,每个JFrame都有一个玻璃窗格。此外,将事件监听器添加到玻璃窗格将使他们捕捉输入事件。所以我为什么这样回答。 – Flaise 2012-01-16 14:31:26