在Java中使用KeyListener移动形状

时间:2014-11-08 18:35:18

标签: java keylistener shapes

我正在尝试编写一个程序,允许用户使用箭头键移动形状并使用回车键更改其颜色。我没有接受任何关于GUI或基于事件的编程的知识,所以这是我第一次体验这些。我想我理解它的基础知识,但是我很难完成语法以使一切运行。我在网上找到的教程使用的是我不使用的计时器。这是我目前的代码:

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

public class Lab15Panel extends JPanel
{
    Color[] colors = new Color[]{Color.blue, Color.green, Color.red, Color.orange, Color.yellow};
    int initialX = 90;
    int initialY = 80;

public void paintComponent(Graphics g)
{
    super.paintComponent(g);

    g.setColor(colors[0]);


    g.fillRect(initialX, initialY, 100, 100);


    Lab15Key listen = new Lab15Key();

}

private class Lab15Key implements KeyListener
{
    @Override
    public void keyTyped(KeyEvent event)
    {
        if (event.getKeyChar() == KeyEvent.VK_LEFT)
        {
            initialX++;
        }
    }

    @Override
    public void keyReleased(KeyEvent event)
    {}

    @Override
    public void keyPressed(KeyEvent event)
    {}
}

}

我在另一个班级制作我的画框。现在我不确定两件事: 1.如何将addKeyListener与填充的形状一起使用?有没有办法参考填充的形状? 我的想法是“移动”正确的形状吗?也就是说,在形状位置的方法之外创建变量,然后使用我的KeyEvents来更改这些数字?或者在这种情况下不会移动形状? (注意我只编写了up键事件的代码。)

您可以给我任何帮助,我们将不胜感激。我绝对是一个Java新手,我只是想了解这些基本概念,但我所掌握的资源并没有帮助。

2 个答案:

答案 0 :(得分:0)

您需要将KeyListener添加到面板中,以实际让它听取按键操作。这称为注册监听器。我会把它放在构造函数中:

public Lab15Panel()
{
    Lab15Key listen = new Lab15Key();
    this.addKeyListener(listen);
}

如果没有这个步骤,你就是在创建一个监听器,但它什么时候听不到任何东西。

如果您只想在每次按下键时重新绘制面板,那么您可以在KeyListener中执行类似的操作:

@Override
public void keyTyped(KeyEvent event)
{
    if (event.getKeyChar() == KeyEvent.VK_LEFT)
    {
        initialX++;
    }
    Lab15Panel.this.repaint(); // Calls repaint on the instance of the enclosing class
}

答案 1 :(得分:0)

有许多问题对你不利......

  1. 您尚未在组件中注册KeyListener,因此永远不会收到关键事件
  2. 当您更改矩形的状态时,您不会重新绘制面板,请记住,Swing使用被动绘制算法,因此它只在其认为需要时绘制UI。你需要通过调用repaint
  3. 给Swing轻轻一点
  4. 你的组件无法集中精力,这意味着即使你做了其他两件事,你仍然可能无法让它发挥作用。
  5. KeyListener是一种痛苦,它只会触发它附加到IS的组件可聚焦和HAS焦点,一般来说,你最好使用Key Bindings

    有关详细信息,请参阅How to use key bindings