我是java的初学者,我试图制作一个响应箭头键移动的方格。我尝试了很多东西,但它只是不起作用。在我的代码/我对代码的理解中可能存在明显的错误,所以如果有人能指出它们会非常有用。 主要课程: import java.awt。; import 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
}
答案 0 :(得分:2)
让我们从...开始......
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 Timer,请参阅How to use Swing Timers
另一个问题是,您的组件不可聚焦,因此它永远无法接收键盘焦点,也不会收到关键事件。
KeyListener
是一个糟糕的选择,有很好的记录限制(只搜索“KeyListener
不起作用”)。相反,您应该使用the Key Bindings API来解决KeyListener
您可能还想查看How to use Key Bindings instead of Key Listeners和Key bindings vs. key listeners in Java
答案 1 :(得分:0)
将您的graphics2
添加为您的JFrame(我假设您正在使用)的关键侦听器和组件:
graphics2 graphics = new graphics2();
JFrame frame = new JFrame("Your Frame");
frame.add(graphics);
frame.addKeyListener(graphics);
从上面graphics2
删除此行代码:
this.addKeyListener(this);