Java 还有另一个KeyListener/KeyBinding问题

Java 还有另一个KeyListener/KeyBinding问题,java,swing,math,2d,keylistener,Java,Swing,Math,2d,Keylistener,呃,很抱歉,程序员,但我就是不能让键绑定按我希望的方式工作:(.但我会继续看更多教程,直到我弄明白。虽然现在我坚持使用一个键侦听器,它可以工作。但是现在我遇到了一个问题,p.move()实际上并不会移动玩家。除了p.move();之外,我输入的所有其他代码都可以正常工作。我可能不应该问这么多问题,所以如果你想让我停下来就说吧,但是整个so社区都很好。再次,我会发布代码 主要类别: import javax.swing.*; public class Game extends JFrame{

呃,很抱歉,程序员,但我就是不能让键绑定按我希望的方式工作:(.但我会继续看更多教程,直到我弄明白。虽然现在我坚持使用一个键侦听器,它可以工作。但是现在我遇到了一个问题,p.move()实际上并不会移动玩家。除了p.move();之外,我输入的所有其他代码都可以正常工作。我可能不应该问这么多问题,所以如果你想让我停下来就说吧,但是整个so社区都很好。再次,我会发布代码

主要类别:

import javax.swing.*;

public class Game extends JFrame{
public static void main(String[] args){
    new Game();
}
public Game(){

    add(new Board());

    setTitle("Hi mom");
    setSize(555,330);
    setResizable(false);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(3);
    setVisible(true);

}
}
董事会级别:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Board extends JPanel implements ActionListener {

Image background;
Player p;
boolean moving;

public Board() {

    setFocusable(true);
    requestFocus();

    addKeyListener(new KeyInputEvents());

    Timer timer = new Timer(25, this);
    timer.start();

    ImageIcon img = new ImageIcon(getClass().getResource("images/map.png"));
    background = img.getImage();

    p = new Player();

}

public void paint(Graphics g) {
    g.drawImage(background, 0, 0, null);
    g.drawImage(p.getPlayer(), p.getX(), p.getY(), null);
}

public void actionPerformed(ActionEvent e) {
    repaint();
}
public JPanel getBoard(){
    return this;
}
)
玩家类(这可能是出错的地方):

KeyInputEvents类:

import java.awt.event.*;

import javax.swing.*;

public class KeyInputEvents extends KeyAdapter implements ActionListener{
int k;
boolean moving = true;
Player p = new Player();
public KeyInputEvents(){
    Timer timer = new Timer(25,this);
    timer.start();
}
public void keyPressed(KeyEvent e){
    k = e.getKeyCode();
    moving = true;
}
public void keyReleased(KeyEvent e){
    moving = false;
}
public void actionPerformed(ActionEvent e) {
    if(k == 'D' && moving == true){p.move(5,0);}
    if(k == 'A' && moving == true){p.move(-5,0);}
}

}

屏幕上的
Player
与您在
KeyInputEvents
类中移动的
Player
不同

Board
中创建
Player
的实例

public class Board extends JPanel implements ActionListener {
    Player p;
    public Board() {
        //...
        p = new Player();
    }
然后在
KeyInputEvents
中创建另一个事件

public class KeyInputEvents extends KeyAdapter implements ActionListener {
    //....
    Player p = new Player();
这两个例子毫无关联

当我在这里时,您不应该真正重写
paint
,而是重写
paintComponent
,您肯定应该调用
super.paintXxx

使用密钥绑定示例更新

import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.ImageIcon;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.Timer;

public class Game extends JFrame {

    public static void main(String[] args) {
        new Game();
    }

    public Game() {

        add(new Board());

        setTitle("Hi mom");
        setSize(555, 330);
        setResizable(false);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(3);
        setVisible(true);

    }

    public class Board extends JPanel implements ActionListener {

        Image background;
        Player p;
        private int xDelta, yDelta;

        public Board() {

            setFocusable(true);
            requestFocus();

            ImageIcon img = new ImageIcon(getClass().getResource("/images/map.jpg"));
            background = img.getImage();

            p = new Player();

            InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0, false), "Left.move");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0, true), "Left.stop");

            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0, false), "Right.move");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0, true), "Right.stop");

            ActionMap am = getActionMap();
            am.put("Left.move", new MoveLeft(this));
            am.put("Left.stop", new StopAllMovement(this));
            am.put("Right.move", new MoveRight(this));
            am.put("Right.stop", new StopAllMovement(this));

            Timer timer = new Timer(25, this);
            timer.start();

        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g); //To change body of generated methods, choose Tools | Templates.
            g.drawImage(background, 0, 0, null);
            g.drawImage(p.getPlayer(), p.getX(), p.getY(), null);
        }

        protected void setMovement(int xDelta, int yDelta) {
            this.xDelta = xDelta;
            this.yDelta = yDelta;
        }

        public void actionPerformed(ActionEvent e) {
            p.move(xDelta, yDelta);
            repaint();
        }

        public JPanel getBoard() {
            return this;
        }

    }

    public class Player {

        int x = 30;
        int y = 187;
        Image player;

        public Player() {
            ImageIcon img = new ImageIcon(getClass().getResource("/images/player.png"));
            player = img.getImage();
        }

        public Image getPlayer() {
            return player;
        }

        public void move(int x, int y) {
            this.x += x;
            this.y += y;
        }

        public int getX() {
            return x;
        }

        public int getY() {
            return y;
        }
    }

    public abstract class AbstractMove extends AbstractAction {

        private Board board;
        private int xDelta;
        private int yDelta;

        public AbstractMove(Board board, int xDelta, int yDelta) {
            this.board = board;
            this.xDelta = xDelta;
            this.yDelta = yDelta;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            board.setMovement(xDelta, yDelta);
        }

    }

    public class MoveLeft extends AbstractMove {

        public MoveLeft(Board board) {
            super(board, -5, 0);
        }

    }

    public class MoveRight extends AbstractMove {

        public MoveRight(Board board) {
            super(board, 5, 0);
        }

    }

    public class StopAllMovement extends AbstractMove {

        public StopAllMovement(Board board) {
            super(board, 0, 0);
        }

    }

}

1) 为了更快地获得更好的帮助,请发布一个。2) 例如,获取图像的一种方法是热链接到中看到的图像。问题是,由于我不知道错误,我不知道要取出什么。我可以取出与错误有关的东西。“我可以取出与错误有关的东西。”奇怪的是,SSCCE文件明确提到了这种可能性。你读过了吗?顺便问一下,你是齐柏林飞艇的哪位成员?在剩下的3个问题中,我不记得有一个叫“Wumbo”…@Wumbo4Dayz,那么你读了我在上一个问题中提供给你的链接了吗?它提供了工作示例。感谢您的帮助!密钥绑定功能强大且灵活
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.ImageIcon;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.Timer;

public class Game extends JFrame {

    public static void main(String[] args) {
        new Game();
    }

    public Game() {

        add(new Board());

        setTitle("Hi mom");
        setSize(555, 330);
        setResizable(false);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(3);
        setVisible(true);

    }

    public class Board extends JPanel implements ActionListener {

        Image background;
        Player p;
        private int xDelta, yDelta;

        public Board() {

            setFocusable(true);
            requestFocus();

            ImageIcon img = new ImageIcon(getClass().getResource("/images/map.jpg"));
            background = img.getImage();

            p = new Player();

            InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0, false), "Left.move");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0, true), "Left.stop");

            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0, false), "Right.move");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0, true), "Right.stop");

            ActionMap am = getActionMap();
            am.put("Left.move", new MoveLeft(this));
            am.put("Left.stop", new StopAllMovement(this));
            am.put("Right.move", new MoveRight(this));
            am.put("Right.stop", new StopAllMovement(this));

            Timer timer = new Timer(25, this);
            timer.start();

        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g); //To change body of generated methods, choose Tools | Templates.
            g.drawImage(background, 0, 0, null);
            g.drawImage(p.getPlayer(), p.getX(), p.getY(), null);
        }

        protected void setMovement(int xDelta, int yDelta) {
            this.xDelta = xDelta;
            this.yDelta = yDelta;
        }

        public void actionPerformed(ActionEvent e) {
            p.move(xDelta, yDelta);
            repaint();
        }

        public JPanel getBoard() {
            return this;
        }

    }

    public class Player {

        int x = 30;
        int y = 187;
        Image player;

        public Player() {
            ImageIcon img = new ImageIcon(getClass().getResource("/images/player.png"));
            player = img.getImage();
        }

        public Image getPlayer() {
            return player;
        }

        public void move(int x, int y) {
            this.x += x;
            this.y += y;
        }

        public int getX() {
            return x;
        }

        public int getY() {
            return y;
        }
    }

    public abstract class AbstractMove extends AbstractAction {

        private Board board;
        private int xDelta;
        private int yDelta;

        public AbstractMove(Board board, int xDelta, int yDelta) {
            this.board = board;
            this.xDelta = xDelta;
            this.yDelta = yDelta;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            board.setMovement(xDelta, yDelta);
        }

    }

    public class MoveLeft extends AbstractMove {

        public MoveLeft(Board board) {
            super(board, -5, 0);
        }

    }

    public class MoveRight extends AbstractMove {

        public MoveRight(Board board) {
            super(board, 5, 0);
        }

    }

    public class StopAllMovement extends AbstractMove {

        public StopAllMovement(Board board) {
            super(board, 0, 0);
        }

    }

}