我无法在java中使用Keylistener来移动这个形状

时间:2018-01-29 21:21:11

标签: java graphics

我是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

    }

2 个答案:

答案 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 ListenersKey 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);