启用停止计时器 [英] Enable to stop timer

查看:130
本文介绍了启用停止计时器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个要在一段时间内刷新屏幕的应用程序.用户将以组合方式选择一个任务,如果作业是活动任务,则将启动一个计时器.因此仅存在一个计时器.

I have an application that I want to refresh screen in some periods.User will select a task in combo, if job is active task, a timer will be started.So only one timer exists.

我正在尝试从组合中选择新任务时停止计时器.这里是停止计时器功能. 似乎在某些情况下不起作用.但是我无法抓住情况. 尽管timer不为null且正在运行,但它不会停止.它在程序开始时可以工作,但片刻后不起作用.

I am trying to stop timer when a new task is selected from combo.Here is stop timer function. It seems it does not work for some cases.But I could not catch the case. Although timer is not null and is Running, it does not stop.it works at the begining of program, after a while does not work.

public void stopTimer() {
    logger.error("Timer is ready to stop: ");
    if (notifierTimer != null) {
        logger.error("Coalesce: " + notifierTimer.isCoalesce());
        logger.error("Running: " + notifierTimer.isRunning());
    }
    if (notifierTimer != null && notifierTimer.isRunning()) {
        notifierTimer.stop();
        logger.error("Timer stopped for job id");
    }
}


public void setTimer(final long jobId) {
    final int timerTriggerTime = 10000;

    ActionListener listener = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            graph.trigger(jobId);
            logger.error("Graph Triggered: " + jobId);
        }
    };
    /** create Timer */
        notifierTimer = new Timer(timerTriggerTime, listener);
        /** start timer */
        notifierTimer.start();
        /** run timer for each user specifed time */
        notifierTimer.setDelay(timerTriggerTime);
        logger.error("Timer started for job id" + jobId);
}

推荐答案

这是用于OP和Perry Monschau的一个示例:这是一个工作" Swing计时器的示例,该计时器在命令中启动和停止.我还没有完成该程序,因为我正在尝试使其更像MVC,但是仍然运行它,您会发现它的功能很好.

This one is for both the OP and for Perry Monschau: This is an example of a "working" Swing Timer, one that starts and stops on command. I'm not yet done with this program as I'm trying to make it more MVC-like, but nevertheless run it and you'll see it functions fine.

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.*;

import javax.swing.*;

@SuppressWarnings("serial")
public class CountDownTimer extends JPanel {
   private static final int BL_GAP = 5;
   private static final int MS_PER_SEC = 1000;
   private static final int SEC_PER_MIN = 60;
   private static final int MIN_PER_HR = 60;
   private static final float DISPLAY_PTS = 54f;
   private static final String DISPLAY_FORMAT_STR = "%02d:%02d:%02d:%01d";
   private static final float SPINNER_FONT_PTS = 16f;
   public static final int TIMER_DELAY = 50;
   public static final Color NEGATIVE_COLOR = Color.red;
   private StartAction startAction = new StartAction();
   private ResetAction resetAction = new ResetAction(startAction);
   private QuitAction quitAction = new QuitAction();
   private final Action[] btnActions = { resetAction , startAction ,
         quitAction };
   private JSpinner hourSpinner = new JSpinner(new SpinnerNumberModel(0, 0, 10,
         1));
   private JSpinner minuteSpinner = new JSpinner(new SpinnerNumberModel(0, 0,
         60, 1));
   private JSpinner secondSpinner = new JSpinner(new SpinnerNumberModel(0, 0,
         60, 1));
   private JLabel displayField = new JLabel("", SwingConstants.CENTER);
   private long startTime;
   private long currentTime;
   private long deltaTime;
   private long setTimeToComplete;
   private boolean negative = false;
   private Timer timer;
   private int hours;
   private int min;
   private int sec;
   private int msec;
   private JFrame frame;

   public CountDownTimer(JFrame frame) {
      this.frame = frame;
      displayField.setFont(displayField.getFont().deriveFont(Font.BOLD,
            DISPLAY_PTS));
      displayField.setBorder(BorderFactory.createLineBorder(Color.blue, 2));

      setLayout(new BorderLayout(BL_GAP, BL_GAP));
      int eb = 2;
      setBorder(BorderFactory.createEmptyBorder(eb, eb, eb, eb));
      add(displayField, BorderLayout.NORTH);
      add(createGuiBody());
      showTimeLeft();
   }

   private JPanel createGuiBody() {
      JPanel bodyPanel = new JPanel();
      bodyPanel.setLayout(new BoxLayout(bodyPanel, BoxLayout.PAGE_AXIS));
      bodyPanel.add(createSpinnerPanel());
      bodyPanel.add(createButtonPanel());
      return bodyPanel;
   }

   private JPanel createButtonPanel() {
      JPanel innerBtnPanel = new JPanel(new GridLayout(1, 0, BL_GAP, 0));
      for (Action action : btnActions) {
         innerBtnPanel.add(new JButton(action));
      }
      JPanel btnPanel = new JPanel(new BorderLayout());
      btnPanel.add(innerBtnPanel);
      return btnPanel;
   }

   private JPanel createSpinnerPanel() {
      Font font = hourSpinner.getFont().deriveFont(Font.BOLD, SPINNER_FONT_PTS);
      hourSpinner.setFont(font);
      minuteSpinner.setFont(font);
      secondSpinner.setFont(font);
      JPanel spinnerPanel = new JPanel();
      spinnerPanel.add(new JLabel("Hrs:"));
      spinnerPanel.add(hourSpinner);
      spinnerPanel.add(Box.createHorizontalStrut(BL_GAP * 2));
      spinnerPanel.add(new JLabel("Min:"));
      spinnerPanel.add(minuteSpinner);
      spinnerPanel.add(Box.createHorizontalStrut(BL_GAP * 2));
      spinnerPanel.add(new JLabel("Secs:"));
      spinnerPanel.add(secondSpinner);

      return spinnerPanel;
   }

   private void showTimeLeft() {
      int oldMin = min;
      hours = (int) (deltaTime / (MS_PER_SEC * SEC_PER_MIN * MIN_PER_HR));
      min = (int) (deltaTime / (MS_PER_SEC * SEC_PER_MIN) % MIN_PER_HR);
      sec = (int) (deltaTime / (MS_PER_SEC) % SEC_PER_MIN);
      msec = (int) (deltaTime % MS_PER_SEC);

      String displayString = String.format(DISPLAY_FORMAT_STR, hours, min, sec,
            msec / 100);
      displayField.setText(displayString);

      if (Math.abs(oldMin - min) > 0) {
         String title = frame.getTitle().replaceAll("\\d", "");
         title = String.format("%02d " + title, min);
         frame.setTitle(title);
      }
   }

   private class ResetAction extends AbstractAction {
      private StartAction startAction;

      public ResetAction(StartAction startAction) {
         super("Reset");
         putValue(MNEMONIC_KEY, KeyEvent.VK_R);
         this.startAction = startAction;
      }

      public void actionPerformed(ActionEvent evt) {
         if (startAction != null
               && startAction.getValue(NAME).equals(StartAction.STOP)) {
            startAction.actionPerformed(new ActionEvent(evt.getSource(),
                  ActionEvent.ACTION_PERFORMED, StartAction.STOP));
         } else if (timer != null && timer.isRunning()) {
            timer.stop();
         }
         displayField.setForeground(null);
         deltaTime = (Integer) hourSpinner.getValue();
         deltaTime = MIN_PER_HR * deltaTime
               + (Integer) minuteSpinner.getValue();
         deltaTime = SEC_PER_MIN * deltaTime
               + (Integer) secondSpinner.getValue();
         deltaTime = MS_PER_SEC * deltaTime;
         showTimeLeft();
         negative = false;
         timer = new Timer(TIMER_DELAY, new TimerListener());
      }
   }

   private class StartAction extends AbstractAction {
      public static final String START = "Start";
      public static final String STOP = "Stop";

      public StartAction() {
         putValue(MNEMONIC_KEY, KeyEvent.VK_S);
         putValue(NAME, START);
      }

      public void actionPerformed(ActionEvent evt) {
         if (timer == null) {
            return;
         }
         if (getValue(NAME).equals(START)) {
            putValue(NAME, STOP);

            startTime = System.currentTimeMillis();
            currentTime = startTime;
            setTimeToComplete = deltaTime;
            timer.start();
         } else {
            if (timer != null && timer.isRunning()) {
               putValue(NAME, START);
               timer.stop();
            }
         }
      }
   }

   private class QuitAction extends AbstractAction {
      public QuitAction() {
         super("Quit");
         putValue(MNEMONIC_KEY, KeyEvent.VK_Q);
      }

      public void actionPerformed(ActionEvent arg0) {
         if (timer != null && timer.isRunning()) {
            timer.stop();
         }
         frame.dispose();
      }
   }

   private class TimerListener implements ActionListener {
      @Override
      public void actionPerformed(ActionEvent arg0) {
         currentTime = System.currentTimeMillis();
         deltaTime = setTimeToComplete - currentTime + startTime;

         if (deltaTime < 0) {
            deltaTime = -deltaTime;
            if (!negative) {
               negative = true;
               displayField.setForeground(NEGATIVE_COLOR);
            }
         }
         showTimeLeft();
      }
   }

   private static void createAndShowGui() {
      String title = "Count Down Timer";
      title = JOptionPane.showInputDialog("Timer Title?", title);
      JFrame frame = new JFrame(title);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(new CountDownTimer(frame));
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

这篇关于启用停止计时器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆