0

我想在使用 TaskTimer 的游戏循环中创建一个简单的暂停功能,但它不起作用。任务计时器有问题吗?我应该使用另一个实用程序吗?我已经坚持了一段时间了。

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JFrame;

public class test extends JFrame implements KeyListener, Runnable {
    public boolean pause = false;

    public test() {
        new JFrame();
        addKeyListener(this);
        setVisible(true);
    }

@Override
public void run() {
    // TODO Auto-generated method stub

    while (true) {
        if (pause) {
            System.out.println("Paused");
            Timer timer = new Timer();
            timer.schedule(new TimerTask() {
                public void run() {
                    System.out.println("Some Pause Related Task");
                    pause = false;
                }
            }, (long) 3000);
        }
    }
}

@Override
public void keyPressed(KeyEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void keyReleased(KeyEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void keyTyped(KeyEvent e) {
    char c = e.getKeyChar();
    if (c == KeyEvent.VK_SPACE) {
        System.out.println("typed space");
        pause = true;
    }
}

public static void main(String[] args) {
    new test();
}
}
4

4 回答 4

1
  1. JFrame不是focusable JComponents,不会对 做出反应KeyEvent,然后(从不)KeyListener不起作用,需要使用focusable JComponent(放在那里JPanel并使用setFocusable()),但不适合可能的方式

  2. Swing JComponents被指定使用KeyBindings而不是低级KeyListener(与 相比有另一个副作用KeyBindings

  3. 仅在存在三个或更多ei的情况下使用KeyListenerKeys pressed

  4. 使用Swing Timer而不是 Swing Timer 的输出util.Timer通知EDT 否则您必须使用Swing 中的 Concurency进行计算

于 2013-07-30T08:21:18.367 回答
0

你永远不会打电话run()来启动计时器。我还建议遵循 tbodt 的建议,在摇摆程序中使用摇摆定时器而不是通用定时器。

public void main() {
    // Swing components should be modified only in the event dispatch thread.
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            test t = new test(); // test class should really be renamed to Test to follow java naming conventions
            t.run();
        }
    });
}

此外,删除while循环。否则,您将创建新的计时器,直到内存不足 - 您只需要一个。计时器将负责重复。timer.stop()当你想暂停时打电话。

于 2013-07-30T07:48:20.803 回答
0

我建议您使用摆动计时器而不是实用计时器。它是为需要定期回调的摇摆应用程序量身定制的。回调转到ActionListener并在 EDT 中发生。我也对new JFrame()您的构造函数中的行感到困惑。坦率地说,它是没有用的。

于 2013-07-30T07:44:38.433 回答
-1

是的,使用正确的定时器。这是用于不打算控制主游戏循环的常规任务。现在最好切换,以避免在以后的开发中出现 TimerTask 问题。为什么你不喜欢真相?

于 2013-07-30T07:48:34.070 回答