又一个KeyListener / KeyBinding问题

唉,我很抱歉MadProgrammer,但我无法让KeyBinding以我想要的方式工作:(。但是我会继续看一些教程,直到我弄明白。现在虽然我已经卡住了到了一个KeyListener并且它可以正常工作。但是现在我遇到了一个问题,其中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; } ) 

玩家类(这可能是出错的地方):

 import javax.swing.*; import java.awt.*; 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; } ) 

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

使用Key Bindings示例进行更新

 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); } } }