我是图形和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));
}
}
}
为什么不删除旧图形?谢谢!
答案 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。