有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

eclipse Java JFrame按键似乎没有注册

我正在使用JavaAWT图形和JFrame来制作一个gui应用程序。我需要获得键输入,而keystener实现似乎没有工作,因为我的System.out.println("hello")似乎没有触发。我在互联网的其他地方找不到这个问题的答案,所以我来到这里

我使用的是eclipse,它似乎没有为我提供任何与该问题相关的洞察、错误、警告等信息,我对Java也相当陌生,但我对更高级的语言(包括JavaScript)有经验

除了前面提到的问题,应用程序按预期工作,将矩形从屏幕的左上角移动到右上角,然后再移动

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Main extends JPanel implements ActionListener, KeyListener{

    static int WIDTH;
    static int HEIGHT;

    int x = 0;
    int y = 0;

    int targetFPS = 60;
    int currentFPS = targetFPS;

    Timer timer = new Timer(1000/targetFPS, this);

    public Main(){
        timer.start();
        addKeyListener(this);
        setFocusable(true);
        setFocusTraversalKeysEnabled(false);
    }
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.fillRect(x-25, y-25, 50, 50);
    }
    public static void main(String[] args){
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        WIDTH = (int) screenSize.getWidth();
        HEIGHT = (int) screenSize.getHeight();
        Main main = new Main();
        JFrame frame = new JFrame();
        frame.setTitle("Hello");
        frame.setSize(WIDTH, HEIGHT);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(main);
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        x++;
        repaint();
    }
    @Override
    public void keyPressed(KeyEvent e) {
        int c = e.getKeyCode();
        System.out.println("hello");
    }
    @Override
    public void keyReleased(KeyEvent e) {

    }
    @Override
    public void keyTyped(KeyEvent e) {

    }
}

共 (2) 个答案

  1. # 1 楼答案

    尝试:

    public Main(){
        timer.start();
        addKeyListener(this);
        setFocusable(true);
        setFocusTraversalKeysEnabled(false);
    ==> requestFocus();
    }
    
  2. # 2 楼答案

    KeyListener存在与焦点相关的问题,在这方面不可靠,相反,您应该使用密钥绑定API,该API旨在帮助解决此问题

    有关更多详细信息,请查看How to Use Key Bindings