我无法在 java 中使用 Keylistener 移动此形状



我是java的初学者,我正在尝试制作一个响应方向键移动的正方形。我已经尝试了很多东西,但它就是行不通。我的代码/我对代码的理解中可能存在明显的错误,所以如果有人可以指出它们,那将非常有帮助。 主类: 导入 java.awt。; 导入javax.swing.;

public class mainClass2 {
public static void main(String[] args) {
JFrame window = new JFrame();
window.setSize(600,400);
window.setVisible(true);
window.getContentPane().setBackground(Color.WHITE);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
boolean constant = true;
graphics2 DC = new graphics2();
window.add(DC);}
}

图形类:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class graphics2 extends JComponent implements KeyListener{
public static int x1;
public static int y1;
public static int xvelocity = 0;
public static int yvelocity = 0;

public void paintComponent(Graphics g){
graphics2 thing = new graphics2();
this.addKeyListener(thing);
System.out.println(x1);
System.out.println(y1);
Graphics2D g2 =(Graphics2D)g;
Rectangle rect = new Rectangle(x1,y1,200,200);
g2.setColor(Color.red);
rect.setLocation(x1,y1);
g2.fill(rect);
repaint();
}
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
x1+=10;
// TODO Auto-generated method stub
if(e.getKeyCode()== KeyEvent.VK_LEFT) {
x1-=10;
}
}    
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub      
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}

让我们从...

public void paintComponent(Graphics g){
graphics2 thing = new graphics2();
this.addKeyListener(thing);
System.out.println(x1);
System.out.println(y1);
Graphics2D g2 =(Graphics2D)g;
Rectangle rect = new Rectangle(x1,y1,200,200);
g2.setColor(Color.red);
rect.setLocation(x1,y1);
g2.fill(rect);
repaint();
}

您正在创建一个新的graphics2实例并向该实例添加KeyListener,但由于该实例永远不会添加到可能显示它的任何内容中,因此它永远没有条件接收密钥事件。

绘画应绘制当前状态并尽快工作。 在paintComponent中创建短期对象(包括创建rect)通常是一个坏主意,因为它可能会给系统带来不必要的压力并降低性能。

此外,在paintComponent内部调用repaint();是一个非常非常糟糕的主意。paintComponent出于多种原因调用,这样做将设置一个更新周期,这将消耗 CPU 并使你的系统瘫痪(是的,我以前做过)。

若要计划定期更新,更好的选择是使用摆动计时器,请参阅如何使用摆动计时器

另一个问题是,您的组件无法聚焦,因此它永远无法接收键盘焦点,也不会接收关键事件。

KeyListener是一个糟糕的选择,它有很好的记录限制(只需搜索"KeyListener不起作用")。相反,您应该使用密钥绑定 API,它将解决KeyListener

的限制您可能还想看看如何在 Java 中使用键绑定而不是键侦听器和键绑定与键侦听器

graphics2作为密钥侦听器和组件添加到 JFrame(我假设您正在使用)中:

graphics2 graphics = new graphics2();
JFrame frame = new JFrame("Your Frame");
frame.add(graphics);
frame.addKeyListener(graphics);

从上面的graphics2中删除以下代码行:

this.addKeyListener(this);

相关内容

  • 没有找到相关文章

最新更新