如何暂停Java Swing Timer?

时间:2011-11-19 11:11:03

标签: java swing timer

我想在某个时刻停止Timer,然后从暂停时恢复它。方法stop()start()无法正常工作。

是否有暂停Timer然后恢复它的功能?我想它不存在。

有没有人知道如何实现正确的Timer暂停?

3 个答案:

答案 0 :(得分:2)

javax.swing.Timer.setDelay(int);

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.*;
import javax.swing.*;

public class DelayedPaint {

    private CenterPanel center;
    private JFrame frame;
    private JPanel panel;

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new DelayedPaint().createAndShowGUI();
            }
        });
    }

    void createAndShowGUI() {
        frame = new JFrame("Delayed Paint");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setSize(400, 400);
        panel = new JPanel(new BorderLayout());
        frame.setContentPane(panel);
        NorthPanel north = new NorthPanel();
        panel.add(north, BorderLayout.NORTH);
        center = new CenterPanel();
        panel.add(center, BorderLayout.CENTER);
        frame.setVisible(true);
        north.startTimer();
    }

    class NorthPanel extends JPanel {

        private JLabel lb;

        public NorthPanel() {
            lb = new JLabel("Good morning");
            add(lb);
        }

        public void startTimer() {
            ActionListener taskPerformer = new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent evt) {
                    setLayout(new FlowLayout(FlowLayout.LEFT));
                    lb.setText("Left");
//    timer.stop(); // Not needed if setRepeats(false).
                    center.startTimer();
                }
            };
            javax.swing.Timer timer = new javax.swing.Timer(2000, taskPerformer);
            timer.setRepeats(false);
            timer.start();
        }
    }

    class CenterPanel extends JPanel {

        private int icnt;
        private Font boldFont = new Font("Dialog", Font.BOLD, 15);
        private Properties centerProps;
        private javax.swing.Timer timer;

        public CenterPanel() {
            centerProps = new Properties();
            centerProps.setProperty("circle", "false");
            centerProps.setProperty("lastString", "0");
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
            if (Boolean.valueOf(centerProps.getProperty("circle"))) {
                Dimension dim = frame.getSize();
                g2.draw(new Arc2D.Double(50, 25, dim.height - 100, dim.width - 100, 0, 360, Arc2D.OPEN));
            }
            int j = Integer.parseInt(centerProps.getProperty("lastString"));
            if (j > 0) {
                g2.setFont(boldFont);
                for (int i = 1; i <= j; i++) {
                    g2.drawString("" + (char) (i + 48), i * 10, 50);
                }
            }
        }

        public void startTimer() {
            ActionListener taskPerformer = new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent evt) {
                    repaint(); // in paintComponent(...) icnt is already icnt+1.
                    icnt++;
                    if (icnt == 1) {
                        centerProps.setProperty("circle", "true");
                        timer.setDelay(500);
                    } else if (icnt <= 10) {
                        centerProps.setProperty("lastString", String.valueOf(icnt - 1));
                        if (icnt == 10) {
                            timer.stop();
                        }
                    }
                }
            };
            timer = new javax.swing.Timer(2000, taskPerformer);
            timer.start();
        }
    }
}

答案 1 :(得分:2)

我无法真正意识到要暂停&#39;一个Swing Timer但有一些简单的方法可以模拟它。我所知道的简单方法是用计时器包围计时器中的所有动作:

 if(!paused) {
  // place code here.

  System.out.println("I am not Paused.");
 } else {

  System.out.println("I am Paused.");
 }

程序中使用的一个例子是:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;



public class ExampleClass implements ActionListener {
 static boolean paused = false;

 // delay in miliseconds.
 static int delay = 5;

 static Timer timer = new Timer(delay, new ExampleClass());

 static JFrame jf = new JFrame();
 static JPanel jp = new JPanel();
 static JButton pause = new JButton("PAUSE");
 static JButton unpause = new JButton("UNPAUSE");

 public static void main(String[] args) {
  System.out.println("Starting Program...");

  pause.addActionListener(new ExampleClass());
  unpause.addActionListener(new ExampleClass());
  jp.add(pause);
  jp.add(unpause);



  jf.setSize(100, 100);
  jf.setTitle("Window");
  jf.setResizable(false);
  jf.setLocationRelativeTo(null);
  jf.setDefaultCloseOperation(jf.EXIT_ON_CLOSE);
  jf.add(jp);
  jf.setVisible(true);


  timer.start();

 }

@Override
public void actionPerformed(ActionEvent e) {
 if(!paused) {
     System.out.println("IM NOT PAUSED!!! YAY!!!!");

     if(e.getSource() == pause) {
         paused = true;
     }
 } else {
     System.out.println("urk... can't move... help me...");
     if(e.getSource() == unpause) {
         paused = false;
     }
 }


}
}

你去吧。 也可以(显然)使用getter和setter来代替按钮暂停和取消暂停。

答案 2 :(得分:0)

无法暂停计时器,只能停止并重新开始。

你想要完成什么?