繁体   English   中英

在Java中使用KeyListener移动形状

[英]Moving Shapes With KeyListener In Java

我正在尝试编写一个程序,该程序允许用户使用箭头键移动形状并使用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.我“移动”形状的想法正确吗? 也就是说,要在形状位置的方法之外创建变量,然后使用我的KeyEvent更改这些数字? 还是在这种情况下不移动形状? (请注意,我只编写了向上键事件的代码。)

您能给我的任何帮助将不胜感激。 我绝对是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
}

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

  1. 您尚未向组件注册KeyListener ,因此它将永远不会收到按键事件
  2. 更改矩形的状态时,您无需重新绘画面板,请记住,Swing使用被动绘画算法,因此它仅在认为需要时才绘画UI。 您需要通过调用repaint来给Swing微调
  3. 您的组件不可聚焦,这意味着即使您完成了其他两件事,您仍然可能无法使其正常工作。

KeyListener是一件很痛苦的事情,它只会在它附加到IS可聚焦且具有HAS焦点的组件上时才触发,通常,最好不要使用Key Bindings

有关更多详细信息,请参见如何使用键绑定

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM