【问题标题】:Key inputs not recognized though use of KeyEvent,KeyListener and much more使用 KeyEvent、KeyListener 等无法识别按键输入
【发布时间】:2016-03-13 01:05:35
【问题描述】:

我正在使用以下代码尝试打印出一个数组并通过 xaxis 和 yaxis 的变量移动一个 BufferedPicture ( test )。

还有一个额外的类叫做“Screen”,但是应该和这个问题无关。

package main.main.start;
import javax.swing.JTextField;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
import java.io.File;
import java.io.IOException;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.KeyEventDispatcher;
import java.awt.KeyboardFocusManager;
import javax.imageio.ImageIO;
import javax.swing.JFrame;

import main.main.start.graphics.Screen;

public class start extends Canvas implements Runnable{

    private static final long serialVersionUID = 1L;

    public static int width = 320;
    public static int height = width / 16 * 9;
    public static int scale = 3;
    public boolean up,left,right,down;
    public BufferedImage keine,floor,wall,test;
    public int xaxis,yaxis;{
    xaxis = 50;
    yaxis = 50;
    }


    private Thread thread;
    private JFrame frame;
    private BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB );
    private int[] pixels = ((DataBufferInt)image.getRaster().getDataBuffer()).getData();
    private boolean running = false;

    private Screen screen;


    public start (){
        Dimension size = new Dimension(width*scale,height*scale);
        setPreferredSize (size);

        screen = new Screen(width, height);

        frame = new JFrame();
    }

    public synchronized void start() {
        running = true;
        thread = new Thread(this, "Display");
        thread.start();

    }
    public synchronized void stop(){
    running = false;
    try {
    thread.join();

    } 
    catch (InterruptedException e) {
        e.printStackTrace();
    }
    }

    public void run(){
        while(running == true){
            //rendering&updating

            //System.out.println("running...");


            update();
            render();

        }
    }

    public void update() {
    }

    public void render() {
        BufferStrategy bs = getBufferStrategy();
        if(bs == null){

            createBufferStrategy(3);
            return;
        }
        screen.clear();
        screen.render();

        for(int i = 0; i < pixels.length; i++){
            pixels[i] = screen.pixels[i];
        }

        Graphics g = bs.getDrawGraphics();
            g.setColor(Color.BLUE);
            g.fillRect(0,0,getWidth(), getHeight() );


        g.drawImage(image, 0, 0, getWidth(),getHeight(),null);
        //playercontrollerstart

        //playercontrollerend

        //map

        int[][] map=
            {
                    {10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10},
                    {10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10},
                    {10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10},
                    {10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10},
                    {10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10},
                    {10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10},
                    {10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10},
                    {10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10},
                    {10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10},
                    {10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10},
                    {10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10},
                    {10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10},
                    {10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10},
                    {10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10},
                    {10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10},
                    {10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10},
                    {10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10},
                    {10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10},
                    {10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10},
                    {10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10}

            };
        int rows = 20;
        int cols = 20;
        int i, j;
        try {
            keine = ImageIO.read(new File("keine.png"));
            floor = ImageIO.read(new File("floor.png"));
            wall = ImageIO.read(new File("wall.png"));
            test = ImageIO.read(new File("test.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }

        for (i = 0; i < rows; i++) {
          for (j = 0; j < cols; j++) {
                if(map[i][j] == 10){
                g.drawImage(keine,i*32,j*32,this);
            }
                if(map[i][j] == 11){
                    g.drawImage(wall,i*32,j*32,this);
                }
                if(map[i][j] == 12){
                    g.drawImage(floor,i*32,j*32,this);
                }
          }
          g.drawImage(test,xaxis,yaxis,this);
        }

        //mapend
        g.dispose();
        bs.show();
    }


    public static void main(String[] args) {
        start game = new start();
        game.frame.setResizable(false);
        game.frame.setTitle("TestWindowName");
        game.frame.add(game);
        game.frame.pack();
        game.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        game.frame.setLocationRelativeTo(null);
        game.frame.setVisible(true);

        game.start();
    }

然后是问题代码(从 } 到 //StartController 的代码没有中断

    //StartController
    public void keyPressed(KeyEvent q) {
        if(q.getKeyCode() ==37){
            left = true;
        }
        if(q.getKeyCode() ==38){
            up = true;
        }
        if(q.getKeyCode() ==39){
            right = true;
        }
        if(q.getKeyCode() ==40){
            down = true;
        }
         }
    public void keyReleased(KeyEvent q) {
        if(q.getKeyCode() == 37){
            left = false;
        }
        if(q.getKeyCode() == 38){
            up = false;
        }
        if(q.getKeyCode() == 39){
            right = false;
        }
        if(q.getKeyCode() == 40){
            down = false;

    }
}
    //EndController
}

【问题讨论】:

    标签: java debugging keylistener


    【解决方案1】:

    我认为问题在于您尚未在应用程序中实现或添加 KeyListener。您必须实现 KeyListener,并继承所有方法。

    像这样:

    import javax.swing.*;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    
    /**
     * Simple Canvas with KeyListener
     */
    public class TestCanvas extends Canvas implements KeyListener, Runnable {
    
        public TestCanvas() {
            addKeyListener(this);
        }
    
        @Override
        public void keyTyped(KeyEvent e) {
            //Do Stuff    
        }
    
        @Override
        public void keyPressed(KeyEvent e) {
            //Do Stuff
        }
    
        @Override
        public void keyReleased(KeyEvent e) {
            //Do Stuff
        }
    }
    

    其次,我建议使用 KeyEvent.VK_(some key) 来比较键码值,这样您就不必依赖于假设您的常量对于每个键盘都始终为真。

    【讨论】:

      猜你喜欢
      • 2020-06-04
      • 1970-01-01
      • 2021-05-07
      • 2018-12-29
      • 1970-01-01
      • 1970-01-01
      • 2015-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多