我能';在java中使用Keylistener无法移动此形状
我是java的初学者,我正在尝试制作一个正方形,它会随着箭头键的移动而移动。我试过很多方法,但都不管用。我的代码/我对代码的理解中可能存在明显的错误,因此如果有人能指出这些错误,那将非常有帮助。 主要类别: 导入java.awt。; 导入javax.swing 图形类:我能';在java中使用Keylistener无法移动此形状,java,graphics,Java,Graphics,我是java的初学者,我正在尝试制作一个正方形,它会随着箭头键的移动而移动。我试过很多方法,但都不管用。我的代码/我对代码的理解中可能存在明显的错误,因此如果有人能指出这些错误,那将非常有帮助。 主要类别: 导入java.awt。; 导入javax.swing 图形类: import java.awt.*; import javax.swing.*; import java.awt.event.*; public class graphics2 extends JComponent imple
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
)通常是个坏主意,因为这可能会给系统带来不必要的压力并降低性能
另外,调用repaint()代码>内部paintComponent
是一个非常非常糟糕的主意paintComponent
调用可以出于多种原因调用,这样做将设置一个更新周期,这将消耗CPU并使系统崩溃(是的,我以前做过)
要计划定期更新,更好的选择是使用Swing计时器,请参阅
另一个问题是,您的组件不可聚焦,因此它将永远无法接收键盘焦点,也不会接收按键事件
KeyListener
是一个糟糕的选择,它有很多文档限制(只需搜索“KeyListener
不起作用”)。相反,您应该使用它来解决KeyListener
您可能还想看看,让我们从
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
)通常是个坏主意,因为这可能会给系统带来不必要的压力并降低性能
另外,调用repaint()代码>内部paintComponent
是一个非常非常糟糕的主意paintComponent
调用可以出于多种原因调用,这样做将设置一个更新周期,这将消耗CPU并使系统崩溃(是的,我以前做过)
要计划定期更新,更好的选择是使用Swing计时器,请参阅
另一个问题是,您的组件不可聚焦,因此它将永远无法接收键盘焦点,也不会接收按键事件
KeyListener
是一个糟糕的选择,它有很多文档限制(只需搜索“KeyListener
不起作用”)。相反,您应该使用它来解决KeyListener
您可能还希望查看并添加graphics2
,作为关键侦听器和JFrame组件(我假设您正在使用它):
从上面的graphics2
中删除这行代码:
this.addKeyListener(this);
将graphics2
添加为关键侦听器和JFrame组件(我假设您正在使用该组件):
从上面的graphics2
中删除这行代码:
this.addKeyListener(this);
你在哪里注册你的KeyListener
?啊哈,graphics2 thing=newgraphics2()代码>内部paintComponent
。。。严重的坏主意<代码>重新绘制()代码>内部paintComponent
,非常糟糕的想法你在哪里注册你的KeyListener
?啊哈,graphics2 thing=newgraphics2()代码>内部paintComponent
。。。严重的坏主意<代码>重新绘制()代码>内部油漆组件
,非常糟糕的想法