在Java中使用KeyListener移动形状
我正在尝试编写一个程序,允许用户使用箭头键移动形状,并使用enter键更改其颜色。我没有学到任何关于GUI或基于事件的编程的知识,所以这是我第一次接触到这些东西。我想我理解它的基本原理,但是我在完成语法以使一切都运行时遇到了困难。我在网上找到的教程使用计时器,但我没有使用。以下是我当前的代码:在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
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
,因此它将永远不会接收密钥事件repaint
KeyListener
是一个难题,它只会在它所连接的组件可聚焦且具有焦点时触发,通常,最好使用键绑定
有关更多详细信息,请参见!我把代码弄得乱七八糟,忘了把它改回去。它应该是g.fillRect(intialX,initialY,100100);我刚刚编辑过。这也叫注册听众。啊,是的。谢谢@BitNinja,我已经把它加进去了。啊,好吧,我想知道应该把它放在哪里。不幸的是,我的代码仍然不起作用。我认为这与我通过改变变量来移动形状的方法有关,因为我认为可能形状只绘制了一次,必须以某种方式重新绘制。它现在在做什么?你得到的是长方形吗?按左箭头键会导致任何事情发生吗?矩形会显示出来(和往常一样),但当我按该键时,实际上没有任何变化。我感谢您的输入。不幸的是,我只能使用KeyListener来完成这个任务。我对聚焦一无所知。这是一个简单的解决办法吗?不是真的,有很多东西可以窃取焦点。从使组件可聚焦(setFocusable(true))开始,使用requestFocusInWindow为组件提供焦点。您可能希望附加一个MouseListener,并使用mouseClicked和调用requestFocusInWindow,这些都需要在构造函数中吗?我为所有这些问题道歉。。。你刚才说的几乎每件事我都不熟悉。