重新画一个正方形?

时间:2011-08-27 00:37:15

标签: java drawing mouse awt paint

我正在尝试使用此代码制作一个在y轴上跟随鼠标的正方形。现在它只是在每次鼠标移动时制作一个新的方块我将如何解决这个问题?

import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.geom.*;

public class Pong {
    public static void main(String args[]) {
        Frame f = new Frame("Pong");
        f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        f.add(new PongField(Color.black), BorderLayout.CENTER);
        f.setResizable(false);
        f.pack();
        f.setVisible(true);

    }
}

class PongField extends Canvas {

    boolean playing = true;
    boolean running = true;

    public PongField(Color mainscreen) {
        setForeground(mainscreen);
    }

    public Dimension getPreferredSize() {
        return new Dimension(600, 600);
    }

    public void paint(Graphics g) {
        while (true) {
            Dimension size = getSize();
            PointerInfo a = MouseInfo.getPointerInfo();
            Point b = a.getLocation();

            a = MouseInfo.getPointerInfo();
            b = a.getLocation();

            int x = size.width / 2;
            int y = (int) b.getY();

            g.fillRect(x / x * 10, y, 10, 75);
            g.drawLine(size.width / 2 - 5, 0, size.width / 2 - 5, size.height);

            if (y != (int) b.getY())
                y = (int) b.getY();
        }
    }
}

2 个答案:

答案 0 :(得分:3)

你不需要在paint()中使用循环 - 事实上,这是一个可怕的,可怕的事情,因为它会冻结整个GUI(没有其他组件能够自己画出来!) “while”循环,只留下循环体。然后通过添加调用MouseMotionListener的{​​{1}}来安排适当调用paint()。在构造函数中,执行以下操作:

repaint()

应该这样做。现在,只要鼠标移动,就会调用paint()。屏幕删除将自动为您完成。

答案 1 :(得分:0)

您看到这个的原因是因为您必须在每帧再次绘制正方形之前清除先前绘制的屏幕。您可以通过以下任一方式执行此操作:

  1. 每次用黑色清除整个屏幕
  2. 仅在先前绘制的区域上绘制黑色,然后以白色绘制新矩形。
  3. 第一种情况更容易,但可能稍微慢一些(在像pong这样的简单游戏中可能不太明显)......第二种情况更具性能,但也更复杂,因为你必须跟踪你需要清理的区域。