将计时器实现到applet中?

时间:2014-07-14 14:38:27

标签: java timer applet

有人可以帮助新手在游戏中获得计时器吗? :P 在过去的一两天里,我一直在尝试各种方法,但我仍然无法让它发挥作用。这里有人有解决方案吗?

基本上,我有一款游戏,其目的是在最快的时间内收集6件物品。所以当然我想要一个从0开始计时的计时器显示,用户可以跟踪他的进展情况。

以下是相关课程的骨架 -

public class StartingPoint extends Applet implements Runnable{

    Task t = new Task();
    Menu menu = new Menu();
    int num;
    public static enum STATE{
        MENU, 
        GAME,
    }; 

    public static STATE State = STATE.MENU;

    public void init() {
        setSize(800, 600);
    }

    public void start() {

        if(num < 2){
            Thread thread = new Thread(this);
            thread.start();
            num++;
        }
    }

    public void run() {

        if (State == STATE.GAME) {
            while (true) {
                repaint();

                try {
                    Thread.sleep(17);
                    } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        } else if (State == STATE.MENU) {

            while (true) {
                repaint();
                try {
                    Thread.sleep(17);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }

    }

    public void paint(Graphics g) {

        if (State == STATE.GAME) {

            ball.paint(g);

        } else if (State == STATE.MENU) {
            menu.render(g);
        }
    }
}



public class Task extends TimerTask {
    int seconds;
    int minutes;
    public String time;

    public void run() {

        seconds++;

        if (seconds == 60) {
            seconds = 0;
            minutes++;
        }

        String s = String.valueOf(seconds);
        String m = String.valueOf(minutes);

        if (seconds < 10) {
            time = (m + ":0" + s);
        } else {
            time = (m + ":" + s);
        }
    }
}



public class Start {

    private static Timer ourClock;
    private static TimerTask ourTask;

    public static void update(){
        ourClock = new Timer();
        ourTask = new Task();
        ourClock.scheduleAtFixedRate(ourTask,1000,1000);
    }
 }

我知道很多,但是如果有人能帮我展示字符串&#34;时间&#34;从applet上的任务类开始,它会非常有用。

谢谢!

P.S注意它是Applet而不是JApplet。 : - / 另外,如果你能想出一种不能使用我现有课程的方法,那就去吧!我对任何建议持开放态度,我只想完成这件事,我已经做了好几天...

如果我只是尝试绘制字符串&#34; time&#34;

,这是错误消息
Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException: String is null
at sun.java2d.SunGraphics2D.drawString(SunGraphics2D.java:2880)
at Start.paint(Start.java:23)
at StartingPoint.paint(StartingPoint.java:229)
at StartingPoint.update(StartingPoint.java:215)
at sun.awt.RepaintArea.updateComponent(RepaintArea.java:255)
at sun.lwawt.LWRepaintArea.updateComponent(LWRepaintArea.java:47)
at sun.awt.RepaintArea.paint(RepaintArea.java:232)
at sun.lwawt.LWComponentPeer.handleJavaPaintEvent(LWComponentPeer.java:1312)
at sun.lwawt.LWComponentPeer.handleEvent(LWComponentPeer.java:1196)
at java.awt.Component.dispatchEventImpl(Component.java:4959)
at java.awt.Container.dispatchEventImpl(Container.java:2292)
at java.awt.Component.dispatchEvent(Component.java:4705)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:746)
at java.awt.EventQueue.access$400(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:697)
at java.awt.EventQueue$3.run(EventQueue.java:691)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:719)
at java.awt.EventQueue$4.run(EventQueue.java:717)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:716)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

1 个答案:

答案 0 :(得分:0)

我认为你是从错误的角度来看这个。

在Java中,您可以在现有类中创建内部类。这将允许您的实例类与其父母进行对话。

实际上(根据我有限的经验)在Java中使用Timers的标准。

public class Start {

    private static Timer ourClock;
    public static String time;


    public static void update(){
        ourClock = new Timer();
        ourClock.scheduleAtFixedRate(new TimerTask(){
            public void run() {
            int seconds;
            int minutes;

            seconds++;

            if (seconds == 60) {
                seconds = 0;
                minutes++;
            }

            String s = String.valueOf(seconds);
            String m = String.valueOf(minutes);

            if (seconds < 10) {
                time = (m + ":0" + s);
                } else {
                time = (m + ":" + s);
            }
        },1000,1000);
    }
 }

你可以找到一些这个@

的好例子

虽然这个问题与其他问题有点重复,但我认为这更像是一个与其他语言不同的Java的观点或范例问题。通常,内部或嵌套类的使用实际上是您在今天的Java中看到的。但是,使用C ++和C#会受到影响。在某些情况下,它被认为是非常糟糕的做法(PHP),而其他仅仅是不允许的(Objective-C)。

话虽如此,仅仅因为一个人并不喜欢它并不意味着它不应该被使用,只是你应该回顾为什么使用它,以及它如何适应你的环境。