启用停止计时器

编程入门 行业动态 更新时间:2024-10-28 10:24:11
本文介绍了启用停止计时器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

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

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

更多推荐

启用停止计时器

本文发布于:2023-11-06 17:07:24,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1564284.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:计时器

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!