移动后,Java JApplet不会删除旧矩形

时间:2014-07-11 21:26:38

标签: java swing graphics japplet

我是图形和japplet的新手,我制作了一个横跨屏幕的矩形。但由于某种原因,它只是划过一条线,而不是移动矩形的旧实例。

主:

public class Main extends JApplet implements Runnable {
    private static final long serialVersionUID = 1L;
    private static int width = 900;
    private static int height = 600;
    public static int fps = 60;
    public Thread thread = new Thread(this);
    public static Ailoid ailoid = new Ailoid();

    public void init() {
        setSize(width, height);
        setBackground(Color.white);

        ailoid.setLocation(new Location(100, 100));
        AlienManager.registerAlien(ailoid);
    }

    public void paint(Graphics g) {
        g.setColor(Color.green);
        for (Alien alien : AlienManager.getAliens()) {
            Location loc = alien.getLocation();
            int x = loc.getX();
            int y = loc.getY();
            g.fillRect(x, y, 10, 20);
        }
    }

    // Thread start
    @Override
    public void start() {
        thread.start();
    }
    // Thread stop
    @SuppressWarnings("deprecation")
    @Override
    public void destroy() {
        thread.stop();
    }

    @Override
    public void run() {
        while (true) {
            Updater.run();
            repaint();
            try {
                // 1000 divided by fps to get frames per millisecond
                Thread.sleep(1000 / fps);
            }
            catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

更新

public class Updater {
    public static void run() {
        for (Alien alien : AlienManager.getAliens()) {
            Location loc = alien.getLocation();
            int x = loc.getX();
            int y = loc.getY();
            alien.setLocation(new Location(x, y));
        }
    }
}

为什么不删除旧图形?谢谢!

1 个答案:

答案 0 :(得分:3)

您的主要问题是您的paint(...)方法没有调用super方法,该方法允许组件重绘其内容:

public void paint(Graphics g) {
    super.paint(g);
    //....

话说回来,你最好不要在顶级窗口中绘图,而是在applet显示的JPanel的paintComponent方法中。如果你做这个修正,那么做同样的事情 - 调用超级方法。

class MyPanel extends JPanel {

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        //....

顺便说一下,这段代码:

public class Updater {
    public static void run() {
        for (Alien alien : AlienManager.getAliens()) {
            Location loc = alien.getLocation();
            int x = loc.getX();
            int y = loc.getY();
            alien.setLocation(new Location(x, y));
        }
    }
}

看起来不像是那么多东西。事实上,按照这个代码,你的外星人应该保持完全静止。


修改
此外,这是从不代码,您应该在应用程序中永远不会有的代码:

@SuppressWarnings("deprecation")
@Override
public void destroy() {
    thread.stop();
}

有一个原因是线程的stop()方法已被弃用,永远不应该被调用。如果您对原因感到好奇,请查看API。