2011-11-19 56 views
3

我想在某个时刻停止Timer,然后从暂停点开始恢复。方法stop(),start()将不起作用。如何暂停Java Swing Timer?

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

有没有人有一个想法如何实现正确Timer暂停?

+2

当你使用stop()和start()方法时会发生什么? – orien

+1

http://stackoverflow.com/questions/3537484/swing-timer-how-to-pause-and-resume-it –

+1

可能的副本我试过链接中的@yati提供的链接,它使用stop/start它在我的电脑上工作。 – toto2

回答

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

没有办法,我知道真正的“暂停”一个Swing计时器,但也有简单的方法来模拟它。我所知道的simplist方式是围绕在定时器的所有操作有:

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; 
    } 
} 


} 
} 

而且你去那里。 而不是有按钮来暂停和取消暂停你也可以(显然)使用getters和setter。