不推荐使用mac上的repaint()方法

时间:2015-02-12 21:26:28

标签: java applet

我尝试为简单游戏制作标准表单,但每次我尝试在我的mac上编译它时,都会说:

move.java:31: error: unreachable statement
        repaint();
        ^

Note: move.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
1 error

当我尝试在Windows计算机上编译它时,它运行得很好!我找不到任何关于修复它的东西,并且根据java网站,不推荐使用repaint()方法!这是我的代码:

import java.awt.*;

public class move extends java.applet.Applet implements Runnable {

    Image osI;
    Graphics osG;
    Thread runner;
    char currkey;
    int x;
    int y;

    public void init() {
        x = 0;
        y = 1;
        setBackground(Color.yellow);
        osI = createImage(size().width, size().height);
        osG = osI.getGraphics();
    }

    public void start() {
        if (runner == null) {
            runner = new Thread(this);
            runner.start();
        }
    }

    public void run() {
        while (true) {
            y = 1;
        }
        repaint();
        try { Thread.sleep(1000); }
        catch (InterruptedException e) { }
    }

    public void stop() {
        if (runner != null) {
            runner.stop();
            runner = null;
        }
    }

    public boolean keyDown(Event evt, int key) {
        switch (key) {
            case Event.DOWN:
                x = 1;
                break;
        }
        repaint();
        return true;
    }

    public void paint(Graphics g) {
        if (x == 1) {
            g.drawString("x is 1!!!", 150, 150);
        } else {
            g.drawString("x is geen 1!!!", 150, 150);
        }
        if (y == 1) {
            g.drawString("y is 1!!!", 150, 175);
        } else {
            g.drawString("y is geen 1!!!", 150, 175);
        }
        g.drawImage(osI, 0, 0, this);
        osG.setColor(getBackground());
        osG.fillRect(0, 0, size().width, size().height);
        osG.setColor(getForeground());
    }
}

3 个答案:

答案 0 :(得分:1)

您的错误并不是说不推荐使用repaint()。事实上,使用弃用的方法根本就没有错误。

因为你的无限循环:

while (true) {
    y = 1;
}
repaint();

答案 1 :(得分:0)

while-loop ...

 while (true) {
     y = 1;
 }
 repaint();

永远不会退出,因此,永远不能调用repaint

Thread#stop已被弃用...

runner.stop();

你永远不应该使用它。相反,请创建一个AtomicBoolean标记,您可以在while-loop中使用该标记,当它的值为true时,保持循环。在stop方法中,将AtomicBoolean的值设置为false,循环将退出。

请参阅Java Thread Primitive Deprecation了解stop(以及其他Thread方法已被弃用的原因)

Applet#size已被弃用...

osG.fillRect(0, 0, size().width, size().height);

使用getWidthgetHeight

java.awt.Applet已超过15年。说真的,相反,你应该至少使用JApplet,但即便如此,我还是建议将你的核心逻辑移到JPanel,然后简单地将它添加到你想要使用的容器中除了获得双缓冲支持而无需任何额外工作外,您还可以灵活地决定如何使用该组件,坦率地说,现在有更好的方法使用applet。

答案 2 :(得分:0)

错误是因为您有无法访问的代码

    while (true) {
        y = 1;
    }

意味着永远不会调用repaint()方法,因为循环永远不会结束。