Не удается переместить мое изображение с помощью KeyListner

Я делаю игру pokemon, и этот класс просто должен нарисовать карту на экран и перемещать персонажа в соответствии с нажатиями клавиш, обнаруженными на клавишах со стрелками, но keyPressedметод не обнаруживает нажатия клавиш, и мой персонаж не будет двигаться. Я не могу понять.

import java.awt.*;
import java.applet.*;
import java.io.*;
import javax.swing.*;
import java.awt.event.*;
import java.lang.Math.*;
import java.util.*;
import java.util.ArrayList;
import java.awt.Image.*;
import java.awt.event.KeyEvent;

public class map extends JApplet implements KeyListener
{
Image grass;
Image Sgrass;
Image sand;
Image CharDown, CharUp, CharLeft, CharRight;
Image finalboss;
Image drawn;
Image[][] gr = new Image[13][15];
public int X;
public int Y;
javax.swing.Timer t;
double ttt = 0;
double B = 0;
public void init()
{
    addKeyListener (this);
    grass = getImage(getCodeBase(),"Grass.jpg");
    Sgrass = getImage(getCodeBase(),"Non-Grass.jpg");
    sand = getImage(getCodeBase(),"Sand.jpg");
    finalboss = getImage(getCodeBase(), "PLeft.jpg");
    CharDown = getImage(getCodeBase(), "CharDown.gif");
    CharUp = getImage(getCodeBase(), "CharUp.gif");
    CharLeft = getImage(getCodeBase(), "CharLeft.gif");
    CharRight = getImage(getCodeBase(), "CharRight.gif");
    drawn = CharDown;
    grid();
}
public void grid()
{
    for(int i = 0; i<13; i++)
    {
        for(int j = 0; j<15; j++)
        {
            double x = Math.random();
            if(x<=0.70)
            {
                gr[i][j] = grass;
            }
            else if(x>0.70 && x<=0.90)
            {
                gr[i][j] = Sgrass;
            }
            else if (x>0.90)
            {
                gr[i][j] = sand;
            }
        }
    }
}  
public void paint(Graphics g)
{
    int a = 0;
    int b = 0;
    for(int z = 0; z<13; z++)
    {
        for(int w = 0; w<15; w++)
        {
            g.drawImage(gr[z][w],a,b,50,50,this);
            a+=50;            
            if (a > 750)
            break;
        }
        b+=50;
        a = 0;
        if (b > 650)
        break;
    }
    g.drawImage(drawn, X, Y, 50, 50, this);
    g.drawImage(finalboss, 700, 600, 50, 50, this);
}
public void keyPressed(KeyEvent e)
{
    JOptionPane.showMessageDialog(null, "Key was pressed");
    int key = e.getKeyCode();
    if (key == 37)
    {
        //left
        X=X-50;
        drawn = CharLeft;
    }
    else if (key == 39)
    {
        //right
        X=X+50;
        drawn = CharRight;
    }
    else if (key == 38)
    {
        //up
        Y=Y-50;
        drawn = CharUp;
    }
    else if (key == 40)
    {
        //down
        Y=Y+50;
        drawn = CharDown;
    }
    repaint();
}
public void keyTyped(KeyEvent e) { }
public void keyReleased(KeyEvent e) { }
}

1 ответ

  1. Наиболее вероятная проблема заключается в том, что ваш JApplet не имеет фокуса, поэтому события доставляются в другой компонент. Есть несколько обходных путей, которые вы можете попробовать. Во-первых, вы можете попробовать добавить строку setFocusable(true);в init()свой метод JApplet. Это не самое надежное решение, но я успешно использовал его в прошлом. Кроме того, можно использовать привязки клавиш, как предложено в этом вопросе .