我的Java KeyListener类似乎没有监听keybpard事件

问题描述 投票:0回答:1

我创建了一个 KeyL.java 类来监听键盘事件:

package game.listener;

import java.awt.event.KeyAdapter;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;

/**
 *
 * @author paul
 */
public class KeyL extends KeyAdapter implements KeyListener {
    private boolean keyPressed[] = new boolean[128];
    
    @Override
    public void keyTyped(KeyEvent keyEvent) {System.out.println("test key typed");}
    
    @Override
    public void keyPressed(KeyEvent keyEvent) {
        System.out.println("test key pressed");
        keyPressed[keyEvent.getKeyCode()] = true;
    }

    @Override
    public void keyReleased(KeyEvent keyEvent) {
        System.out.println("test key released");
        keyPressed[keyEvent.getKeyCode()] = false;
    }

    public boolean isKeyPressed(int keyCode) {
        return keyPressed[keyCode];
    }
}

我尝试在我的 Game.java 类中使用这个类:

package game;

import game.listener.KeyL;
import game.listener.MouseL;
import game.listener.WindowL;

import javax.swing.JFrame;
import java.awt.event.KeyEvent;

/**
 *
 * @author paul
 */
public class Game extends JFrame {
    private final KeyL keyListener = new KeyL();
    private final MouseL mouseListener = new MouseL();
    private final WindowL windowListener = new WindowL();
    
    private boolean isRunning = false;
    private long lastTime;
    
    public Game() {
        
        this.setSize(Constants.WINDOW_WIDTH, Constants.WINDOW_HEIGHT);
        this.setTitle(Constants.WINDOW_TITLE);
        this.setResizable(Constants.IS_RESIZABLE);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.addKeyListener(keyListener);
        this.addMouseListener(mouseListener);
        this.addMouseMotionListener(mouseListener);
        this.addWindowListener(windowListener);
        this.setLocationRelativeTo(null);
        this.setFocusable(true);
        
    }
    
    public void update(double deltaTime) {
        
    }
    
    public void run() {
        this.isRunning = true;
        
        while(this.isRunning) {
            
            long current = System.nanoTime();
            double deltaTime = (current - this.lastTime) / 1e9;
            
            this.lastTime = current;
            
            this.update(deltaTime);
            
            if (keyListener.isKeyPressed(KeyEvent.VK_ENTER)) {
                this.isRunning = false;
                System.out.println("ENTER");
            }
            
        }
        this.dispose();
    }
}

当我按下键盘上的按键时,来自 KeyL 类的测试消息甚至不会出现在控制台中。当我尝试测试运行函数中是否按下“enter”键时,它也不起作用。

java swing graphics awt keyboard-events
1个回答
0
投票

这样做是好的做法吗?

package game;

import game.listener.KeyL;
import game.listener.MouseL;
import game.listener.WindowL;

import javax.swing.JFrame;
import javax.swing.Timer;
import java.awt.event.KeyEvent;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 *
 * @author paul
 */
public class Game extends JFrame implements ActionListener {
    private final KeyL keyListener = new KeyL();
    private final MouseL mouseListener = new MouseL();
    private final WindowL windowListener = new WindowL();
    
    private Timer timer;
    
    private long lastTime;
    
    public Game() {
        
        this.setSize(Constants.WINDOW_WIDTH, Constants.WINDOW_HEIGHT);
        this.setTitle(Constants.WINDOW_TITLE);
        this.setResizable(Constants.IS_RESIZABLE);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.addKeyListener(keyListener);
        this.addMouseListener(mouseListener);
        this.addMouseMotionListener(mouseListener);
        this.addWindowListener(windowListener);
        this.setLocationRelativeTo(null);
        this.setFocusable(true);
        
        timer = new Timer(1000/60, this);
        timer.start();
    }
    
    @Override
    public void actionPerformed(ActionEvent e) {
        long current = System.nanoTime();
        double deltaTime = (current - this.lastTime)/1e9;
        
        this.lastTime = current;
        update(deltaTime);
    }
    
    public void update(double deltaTime) {
        
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.