java - KeyListener 无法与 JFrame Canvas 一起使用

标签 java swing canvas jframe keylistener

我对 java 还是新手,无法让 JFrame 检测按键/释放,以下是使用的类

主要:

package initilizer;
import java.awt.Canvas;

import java.awt.Graphics;
import javax.swing.JFrame;
import input.Keyboard;

public class Main extends Canvas{

    static boolean rRunning = true;

    static int width = 640;
    static int height = 480;
    int cx = width/2;
    int cy = height/2;
    boolean initilized = false;

    Camera cam = new Camera(1.0, 5.0, 3.0);
    Camera cam1 = new Camera(10.0, 50.0, 30.0);
    long lastFpsCheck = System.currentTimeMillis();

    public static JFrame frame = new JFrame("3D Engine");

    Keyboard keyboard = new Keyboard();


    public static void main(String[] args) {
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Canvas canvas = new Main();
        canvas.setSize(width, height);
        frame.add(canvas);
        frame.pack();
        frame.setVisible(true);
    }

    void init() {
        // Nothing currently
    }

    double[] rotate2D(double[] pos,double[] rot) {
        double x = pos[0];
        double y = pos[1];

        double s = rot[0];
        double c = rot[1];

        double[] result = {(x * c) - (y * s), (y * c) + (x * s)};

        return result;
    }


    public void paint(Graphics g) {
        if (initilized == false) {
            initilized = true;
            init();
        }

        // Storing start time for FPS Counting
        long startTime = System.currentTimeMillis();


        g.dispose();

        if (keyboard.getA() == true) {
            System.out.println("A HELD!!");
        }

        // Limiting FPS
        try {
            Thread.sleep(16);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // Calculating FPS
        long endTime = System.currentTimeMillis();
        if ((lastFpsCheck + 1000) < endTime) {
            lastFpsCheck = endTime;
            double delta_time = (endTime - startTime);
            frame.setTitle("3D Engine - FPS: " + (int) (1000/delta_time));
        }

        // Draw next frame
        repaint();
    }

}

键盘:

package input;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import initilizer.Main;

public class Keyboard implements ActionListener, KeyListener{

    public boolean W_HELD = false;
    public boolean A_HELD = false;
    public boolean S_HELD = false;
    public boolean D_HELD = false;

    public boolean E_HELD = false;
    public boolean Q_HELD = false;

    public Keyboard() {
        Main.frame.addKeyListener(this);
    }

    public boolean getW() {
        return W_HELD;
    }

    public boolean getA() {
        //System.out.println(A_HELD);
        return A_HELD;
    }

    public boolean getS() {
        return S_HELD;
    }

    public boolean getD() {
        return S_HELD;
    }

    public boolean getE() {
        return E_HELD;
    }

    public boolean getQ() {
        return Q_HELD;
    }

    public void keyPressed(KeyEvent e) {
        System.out.println("HII");
          int key = e.getKeyCode();

          if (key == KeyEvent.VK_W) {
              W_HELD = true;
          }

          if (key == KeyEvent.VK_A) {
              A_HELD = true;
          }

          if (key == KeyEvent.VK_S) {
              S_HELD = true;
          }

          if (key == KeyEvent.VK_D) {
              D_HELD = true;
          }

          if (key == KeyEvent.VK_E) {
              E_HELD = true;
          }

          if (key == KeyEvent.VK_Q) {
              Q_HELD = true;
          }
    }

    public void keyReleased(KeyEvent e) {
          int key = e.getKeyCode();

          if (key == KeyEvent.VK_W) {
              W_HELD = false;
          }

          if (key == KeyEvent.VK_A) {
              A_HELD = false;
          }

          if (key == KeyEvent.VK_S) {
              S_HELD = false;
          }

          if (key == KeyEvent.VK_D) {
              D_HELD = false;
          }

          if (key == KeyEvent.VK_E) {
              E_HELD = false;
          }

          if (key == KeyEvent.VK_Q) {
              Q_HELD = false;
          }
    }

    public void keyTyped(KeyEvent e) {
        // Unmodified
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
        // TODO Auto-generated method stub

    }

}

我一直在尝试解决这个问题,但无法解决,尝试通过主类添加关键监听器,但这也不起作用,如果您知道问题所在,请告诉我,谢谢。

最佳答案

您必须向 Canvas 添加一个 KeyListener 才能从中接收输入,例如

canvas.add(new Keyboard());

关于java - KeyListener 无法与 JFrame Canvas 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59230596/

相关文章:

java - 我怎样才能把它变成 Java 正则表达式?

java - Cassandra 选择查询中替换 Null 函数

java - 当 ftp 站点未连接时 GUI 被卡住

java - 根据标题中的文本设置JTable的列宽

javascript - HTML5 Canvas 斐波那契螺旋线

javascript - Canvas 元素内的输入表单

java - Apache 弗林克 : Windowed ReduceFunction is never executed

java - 电子邮件缺少图片附件

java - removeMouseListener() 不起作用(Java)

javascript - Canvas toDataUrl 增加图像的文件大小