java - 为什么我的KeyListener不做任何事情?

big*_*997 2 java swing keylistener key-bindings jpanel

当我尝试击中太空酒吧时没有任何反应.我尝试了不同的键,但没有任何作用.有人可以告诉我我做错了什么吗?或者为什么这不起作用?

我也在使用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

    }

}
Run Code Online (Sandbox Code Playgroud)

Hov*_*els 5

这是一个焦点问题 - 只有正在被侦听的组件具有焦点时,KeyListeners才有效.请改用键绑定.在Java Swing教程中有一个关于这个主题的合适的Key Bindings教程.

例如:

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

}
Run Code Online (Sandbox Code Playgroud)

此外,你真的不希望你的GUI类实现你的听众,因为它要求一个可怜的小班做太多.而是为侦听器或单独的类使用匿名内部类.