【问题标题】:java - Why wont my KeyListener do anything?java - 为什么我的 KeyListener 不做任何事情?
【发布时间】:2012-01-16 02:11:31
【问题描述】:

当我尝试按空格键时,没有任何反应。我用不同的键尝试了这个,但没有任何效果。有人可以告诉我我做错了什么吗?或者为什么这不起作用?

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

    }

}

【问题讨论】:

    标签: java swing jpanel key-bindings keylistener


    【解决方案1】:

    这是一个焦点问题—— 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 类实现你的监听器,因为它要求一个可怜的小类做太多事情。而是为您的侦听器使用匿名内部类或单独的类。

    【讨论】:

      【解决方案2】:

      您将 KeyListener 添加到错误的 JComponent。试试这个:

      this.getGlassPane().addKeyListener(this);
      

      可以在此处找到有关 Swing 库如何处理此问题的更多信息:http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html

      【讨论】:

      • 如何在玻璃窗格中添加 KeyListener 来解决 OP 的问题?
      • -1,它在问题的什么地方甚至暗示用户正在使用玻璃窗格? KeyEvents 转到具有焦点的组件。默认情况下,玻璃窗格甚至不可见,因此它不会接收关键事件。很高兴您链接到 Swing 教程,但是,您应该链接到的部分是关于“如何使用键绑定”的部分。 Swing 旨在使用键绑定,而不是键侦听器。
      • '在问题的什么地方,它甚至暗示用户正在使用玻璃窗格?' Swing 的基础知识告诉你,每个 JFrame 都有一个玻璃窗格。此外,将事件侦听器添加到玻璃窗格将使它们捕获输入事件。这就是为什么我这样回答。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-11
      相关资源
      最近更新 更多