【问题标题】:Does Swing keep scanning for keyboard input (java)?Swing 是否继续扫描键盘输入(java)?
【发布时间】:2013-05-27 12:17:28
【问题描述】:

我正在尝试使用 g.drawImage() 将我绘制的图像移动到 Jpanel 上。我需要知道为什么这段代码不起作用(我正在尝试使用 w 键重新定位图像以将其向上移动)

int CharX = 1;
int CharY = 30;

public void keyPressed(KeyEvent w) {
    CharY = CharY + 1;
    repaint();
}
public void keyReleased(KeyEvent w) {
    CharY = CharY + 1;
    repaint();
}

【问题讨论】:

  • 你也可以把CharY = CharY + 1;改成CharY += 1;

标签: java swing input keyboard


【解决方案1】:
  1. 您实际上并没有通过命名 KeyEvent w 来检查 w 键。你需要检查if (w.getKeyCode() == KeyEvent.VK_W)
  2. Java 中的 Y 坐标从顶部的 0 开始,因此您可能需要从 CharY 中减去以使其上升。
  3. 这将更新两次,一次是按下键时,另一次是松开键时。不确定这是否是您真正想要的。
  4. 如果不知道你的 paint 函数里面有什么,或者你什至实现了它,很难说问题是否真的存在,但它应该看起来像

    public void paint(Graphics g) { g.drawImage(yourImage, CharX, CharY, null); }

【讨论】:

  • 我应该把 repaint(); 放在哪里?
  • 虽然它比implement Runnable 更可取,并将repaint(); 放在run 函数中,以便您可以管理它发生的频率,但我看不出有什么理由不应该这样做在keyPressed 内工作。我在mouseMove 中使用它没有任何问题,所以keyPressed 也应该可以工作。
  • 你的代码最大的问题是你没有implements KeyListener。添加后,您需要创建一个构造函数并将其放入addKeyListener(this);。那么你的 keyPressed 函数应该会被调用。
  • 构造函数是在创建对象时自动调用的函数。它可用于设置其初始状态。现在,你的构造函数应该看起来像public MyComponents() { addKeyListener(this); }
  • 我放那个时出错,它建议放这个 addKeyListener((KeyListener) this);
【解决方案2】:

您不应在 keyPressed() 或 keyReleased() 方法中调用 repaint()。

public void keyPressed(w.getKeyCode() == KeyEvent.VK_W) {
    CharY = CharY + 1;
}

稍后调用 repaint()。

【讨论】:

  • @user1952565 查看您帖子中的 cmets,了解它为什么没有执行任何操作。
  • 那不会编译,因为 w 是未知的。
猜你喜欢
  • 1970-01-01
  • 2013-11-29
  • 2011-08-03
  • 1970-01-01
  • 2015-06-27
  • 1970-01-01
  • 2014-09-19
  • 1970-01-01
  • 2019-01-08
相关资源
最近更新 更多