【问题标题】:keyPressed method not working JavakeyPressed方法不起作用Java
【发布时间】:2016-04-15 13:36:11
【问题描述】:

您好,我是 Java 新手,我正在尝试使用箭头键在 JFrame 上移动 JPanel(播放器),但由于某种原因它无法正常工作。我相信这是因为 keyPressed 方法在按下某个键时没有响应,但我真的不知道。

这是 Player 类的代码:

import java.awt.Color;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JPanel;

public class Player extends JPanel implements KeyListener{
    int x=0,y=0;
    public Player(){
        this.setBounds(x, y, 9, 9);
        this.setOpaque(true);
        this.setBackground(Color.red);
        this.setFocusable(true);
        addKeyListener(this);
    }

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

        if(key == KeyEvent.VK_UP){
            this.setBounds(x, x-9, 9, 9);
        }else if(key == KeyEvent.VK_DOWN){
            this.setBounds(x, y+9, 9, 9);
        }else if(key == KeyEvent.VK_RIGHT){
            this.setBounds(x+9, y, 9, 9);
        }else if(key == KeyEvent.VK_LEFT){
            this.setBounds(x-9, y, 9, 9);
        }

    }
    public void keyReleased(KeyEvent arg0) {}

    public void keyTyped(KeyEvent arg0) {}


}

提前致谢!

编辑: 这是 JFrame 的代码: 导入 javax.swing.JFrame;

public class Cave {


    public static void main(String[] args) {
        JFrame frame = new JFrame("Cave Generator");
        frame.setBounds(0, 0, 0, 0);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

            Player p = new Player();
        frame.getContentPane().add(p);

    }

}

【问题讨论】:

  • 看来您可能需要 repaint 框架以反映更改。
  • 那你调试了吗?是否调用了该方法,但使用了意外的键码?你打电话 setBounds 但什么也没发生?你真的需要自己做诊断工作。
  • 我做了调试,方法没有被调用
  • 如何将JPanel 添加到您的框架中?你能把那个代码也包括进去吗?
  • @OfriAdiv 真的吗?我尝试了您的代码,并且调用了 keyPressed,它只是没有正确计算坐标。 -> 看看我的答案...

标签: java jframe jpanel keypress keyevent


【解决方案1】:

您的代码有两个问题。

  1. 第一个问题是,一旦您在框架上调用可见调用,就会在框架上添加播放器组件。
  2. 您没有存储播放器的最后位置。

在您的代码中进行以下更改,它应该会运行:

洞穴

public class Cave {

    public static void main(String[] args) {
        JFrame frame = new JFrame("Cave Generator");
        frame.setBounds(0, 0, 0, 0);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Player p = new Player();
        frame.getContentPane().add(p);
        frame.setVisible(true);
    }

}

播放器#keyPressed

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

    if(key == KeyEvent.VK_UP){
        y = y-9;
    }else if(key == KeyEvent.VK_DOWN){
        y = y+9;
    }else if(key == KeyEvent.VK_RIGHT){
        x = x+9;
    }else if(key == KeyEvent.VK_LEFT){
        x = x-9;
    }
    this.setBounds(x, y, 9, 9);
}

【讨论】:

  • 效果很好!非常感谢!
猜你喜欢
  • 1970-01-01
  • 2018-10-06
  • 2016-12-21
  • 2018-06-24
  • 2014-04-09
  • 2018-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多