2011-11-19 164 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。