gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:22:00 25 4
gpt4 key购买 nike

我是图形和 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));
}
}
}

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

最佳答案

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

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

话虽如此,您远远最好不要在顶层窗口中绘制,而是在小程序显示的 JPanel 的 paintComponent 方法中绘制。如果您执行此更正,则执行相同的操作——调用 super 方法。

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。

关于移动后,Java JApplet 不会删除旧矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24706812/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com