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

+2

如何添加一个KeyListener的玻璃面板要解决的任择议定书的问题? – 2012-01-16 02:45:06

+2

-1,在问题中甚至建议用户使用玻璃窗格? KeyEvents转到具有焦点的组件。玻璃窗格默认是不可见的,所以它不会收到关键事件。这很好,你链接到Swing教程,但是,你应该链接到的部分是关于“如何使用键绑定”的部分。 Swing被设计为使用键绑定,而不是键监听器。 – camickr 2012-01-16 03:02:10

+0

'在问题中,它甚至暗示用户正在使用玻璃窗? Swing的基本知识告诉你,每个JFrame都有一个玻璃窗格。此外,将事件监听器添加到玻璃窗格将使他们捕捉输入事件。所以我为什么这样回答。 – Flaise 2012-01-16 14:31:26