在Java中使用KeyListener移动形状

在Java中使用KeyListener移动形状,java,keylistener,shapes,Java,Keylistener,Shapes,我正在尝试编写一个程序,允许用户使用箭头键移动形状,并使用enter键更改其颜色。我没有学到任何关于GUI或基于事件的编程的知识,所以这是我第一次接触到这些东西。我想我理解它的基本原理,但是我在完成语法以使一切都运行时遇到了困难。我在网上找到的教程使用计时器,但我没有使用。以下是我当前的代码: import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Lab15Panel extends JPa

我正在尝试编写一个程序,允许用户使用箭头键移动形状,并使用enter键更改其颜色。我没有学到任何关于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?是否有一种方法可以引用填充形状? 2.我“移动”形状的想法正确吗?也就是说,在形状位置的方法之外创建变量,然后使用my KeyEvents更改这些数字?或者在这种情况下形状不会移动?(注意,我只编写了up key事件的代码。)


如果你能给我任何帮助,我将不胜感激。我绝对是Java新手,我只是想了解这些基本概念,但我拥有的资源没有帮助。

您需要将
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
}

有许多问题对你不利

  • 您尚未向组件注册
    keylister
    ,因此它将永远不会接收密钥事件
  • 当您更改矩形的状态时,您不会重新绘制面板,记住,Swing使用被动绘制算法,因此它只在认为需要时绘制UI。您需要通过调用
    repaint
  • 你的组件是不可聚焦的,这意味着即使你做了另外两件事,你可能仍然无法让它工作
  • KeyListener
    是一个难题,它只会在它所连接的组件可聚焦且具有焦点时触发,通常,最好使用键绑定


    有关更多详细信息,请参见!我把代码弄得乱七八糟,忘了把它改回去。它应该是g.fillRect(intialX,initialY,100100);我刚刚编辑过。这也叫注册听众。啊,是的。谢谢@BitNinja,我已经把它加进去了。啊,好吧,我想知道应该把它放在哪里。不幸的是,我的代码仍然不起作用。我认为这与我通过改变变量来移动形状的方法有关,因为我认为可能形状只绘制了一次,必须以某种方式重新绘制。它现在在做什么?你得到的是长方形吗?按左箭头键会导致任何事情发生吗?矩形会显示出来(和往常一样),但当我按该键时,实际上没有任何变化。我感谢您的输入。不幸的是,我只能使用KeyListener来完成这个任务。我对聚焦一无所知。这是一个简单的解决办法吗?不是真的,有很多东西可以窃取焦点。从使组件可聚焦(setFocusable(true))开始,使用requestFocusInWindow为组件提供焦点。您可能希望附加一个MouseListener,并使用mouseClicked和调用requestFocusInWindow,这些都需要在构造函数中吗?我为所有这些问题道歉。。。你刚才说的几乎每件事我都不熟悉。