- как сделать таймер обратного отсчета в Java
- 3 ответа
- Сделайте таймер обратного отсчета в Java
- Таймер обратного отсчета в Java с использованием ScheduledExecutorService
- Таймер обратного отсчета в Java с использованием Timer и TimerTask
- Как сделать таймер в java
- Как сделать обратный отсчет времени в java swing?
как сделать таймер обратного отсчета в Java
Мне нужно знать, как сделать обратный отсчет. Я не думаю, что мне нужен ActionListener, потому что он начинает тикать в момент создания класса.
Любая помощь, советы, ссылки, толчок в правильном направлении будут приняты с распростертыми объятиями. Я благодарю вас заблаговременно за ваши усилия. Искренне благодарный человек.
Получить начальное системное время и рассчитать целевое системное время. Когда системное время превысит целевое системное время, выйдите из цикла.
3 ответа
import java.util.Scanner; import java.util.Timer; import java.util.TimerTask; public class Stopwatch < static int interval; static Timer timer; public static void main(String[] args) < Scanner sc = new Scanner(System.in); System.out.print("Input seconds =>: "); String secs = sc.nextLine(); int delay = 1000; int period = 1000; timer = new Timer(); interval = Integer.parseInt(secs); System.out.println(secs); timer.scheduleAtFixedRate(new TimerTask() < public void run() < System.out.println(setInterval()); >>, delay, period); > private static final int setInterval() < if (interval == 1) timer.cancel(); return --interval; >>
Давать кому-то код, в то время как он должен начать думать об этом, по крайней мере, плохо . Все, что он хотел, это намек .
Примерно через четыре года . Никто не гуглит намеки. Это может решить текущую проблему, но не решает каких-либо более серьезных проблем. +1
Вы увидите людей, использующих класс Timer для этого. К сожалению, это не всегда точно. Лучше всего получить системное время, когда пользователь вводит вход, вычисляет целевое системное время и проверяет, превысило ли системное время целевое системное время. Если он имеет, то вырваться из цикла.
Вы можете создать таймер обратного отсчета с помощью апплета, ниже — код,
import java.applet.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.Timer; // not java.util.Timer import java.text.NumberFormat; import java.net.*; /** * An applet that counts down from a specified time. When it reaches 00:00, * it optionally plays a sound and optionally moves the browser to a new page. * Place the mouse over the applet to pause the count; move it off to resume. * This class demonstrates most applet methods and features. **/ public class Countdown extends JApplet implements ActionListener, MouseListener < long remaining; // How many milliseconds remain in the countdown. long lastUpdate; // When count was last updated JLabel label; // Displays the count Timer timer; // Updates the count every second NumberFormat format; // Format minutes:seconds with leading zeros Image image; // Image to display along with the time AudioClip sound; // Sound to play when we reach 00:00 // Called when the applet is first loaded public void init() < // Figure out how long to count for by reading the "minutes" parameter // defined in a tag inside the tag. Convert to ms. String minutes = getParameter("minutes"); if (minutes != null) remaining = Integer.parseInt(minutes) * 60000; else remaining = 600000; // 10 minutes by default // Create a JLabel to display remaining time, and set some properties. label = new JLabel(); label.setHorizontalAlignment(SwingConstants.CENTER ); label.setOpaque(true); // So label draws the background color // Read some parameters for this JLabel object String font = getParameter("font"); String foreground = getParameter("foreground"); String background = getParameter("background"); String imageURL = getParameter("image"); // Set label properties based on those parameters if (font != null) label.setFont(Font.decode(font)); if (foreground != null) label.setForeground(Color.decode(foreground)); if (background != null) label.setBackground(Color.decode(background)); if (imageURL != null) < // Load the image, and save it so we can release it later image = getImage(getDocumentBase(), imageURL); // Now display the image in the JLabel. label.setIcon(new ImageIcon(image)); >// Now add the label to the applet. Like JFrame and JDialog, JApplet // has a content pane that you add children to getContentPane().add(label, BorderLayout.CENTER); // Get an optional AudioClip to play when the count expires String soundURL = getParameter("sound"); if (soundURL != null) sound=getAudioClip(getDocumentBase(), soundURL); // Obtain a NumberFormat object to convert number of minutes and // seconds to strings. Set it up to produce a leading 0 if necessary format = NumberFormat.getNumberInstance(); format.setMinimumIntegerDigits(2); // pad with 0 if necessary // Specify a MouseListener to handle mouse events in the applet. // Note that the applet implements this interface itself addMouseListener(this); // Create a timer to call the actionPerformed() method immediately, // and then every 1000 milliseconds. Note we don't start the timer yet. timer = new Timer(1000, this); timer.setInitialDelay(0); // First timer is immediate. > // Free up any resources we hold; called when the applet is done public void destroy() < if (image != null) image.flush(); >// The browser calls this to start the applet running // The resume() method is defined below. public void start() < resume(); >// Start displaying updates // The browser calls this to stop the applet. It may be restarted later. // The pause() method is defined below public void stop() < pause(); >// Stop displaying updates // Return information about the applet public String getAppletInfo() < return "Countdown applet Copyright (c) 2003 by David Flanagan"; >// Return information about the applet parameters public String[][] getParameterInfo() < return parameterInfo; >// This is the parameter information. One array of strings for each // parameter. The elements are parameter name, type, and description. static String[][] parameterInfo = < , , , , , , , >; // Start or resume the countdown void resume() < // Restore the time we're counting down from and restart the timer. lastUpdate = System.currentTimeMillis(); timer.start(); // Start the timer >// Pause the countdown void pause() < // Subtract elapsed time from the remaining time and stop timing long now = System.currentTimeMillis(); remaining -= (now - lastUpdate); timer.stop(); // Stop the timer >// Update the displayed time. This method is called from actionPerformed() // which is itself invoked by the timer. void updateDisplay() < long now = System.currentTimeMillis(); // current time in ms long elapsed = now - lastUpdate; // ms elapsed since last update remaining -= elapsed; // adjust remaining time lastUpdate = now; // remember this update time // Convert remaining milliseconds to mm:ss format and display if (remaining < 0) remaining = 0; int minutes = (int)(remaining/60000); int seconds = (int)((remaining)/1000); label.setText(format.format(minutes) + ":" + format.format(seconds)); // If we've completed the countdown beep and display new page if (remaining == 0) < // Stop updating now. timer.stop(); // If we have an alarm sound clip, play it now. if (sound != null) sound.play(); // If there is a newpage URL specified, make the browser // load that page now. String newpage = getParameter("newpage"); if (newpage != null) < try < URL url = new URL(getDocumentBase(), newpage); getAppletContext().showDocument(url); >catch(MalformedURLException ex) < showStatus(ex.toString()); >> > > // This method implements the ActionListener interface. // It is invoked once a second by the Timer object // and updates the JLabel to display minutes and seconds remaining. public void actionPerformed(ActionEvent e) < updateDisplay(); >// The methods below implement the MouseListener interface. We use // two of them to pause the countdown when the mouse hovers over the timer. // Note that we also display a message in the statusline public void mouseEntered(MouseEvent e) < pause(); // pause countdown showStatus("Paused"); // display statusline message >public void mouseExited(MouseEvent e) < resume(); // resume countdown showStatus(""); // clear statusline >// These MouseListener methods are unused. public void mouseClicked(MouseEvent e) <> public void mousePressed(MouseEvent e) <> public void mouseReleased(MouseEvent e) <> >
Сделайте таймер обратного отсчета в Java
- Таймер обратного отсчета в Java с использованием ScheduledExecutorService
- Таймер обратного отсчета в Java с использованием Timer и TimerTask
Сегодня мы продемонстрируем, как создать таймер обратного отсчета в Java с помощью двух методов, не полагаясь на какую-либо стороннюю библиотеку. Мы можем использовать таймер в окне графического интерфейса или в консоли, чтобы просто проверить его. Ознакомьтесь с кодами, которые у нас есть ниже!
Таймер обратного отсчета в Java с использованием ScheduledExecutorService
В этом первом методе мы используем интерфейс ExecutorService для вызова его метода newScheduledThreadPool() , который создает пул потоков, который использует то же фиксированное количество назначенных потоков. В методе newScheduledThreadPool() мы передаем количество потоков, которое мы хотим в пуле. В этом случае нам нужно, чтобы только один поток запускал таймер.
Функция Executors.newScheduledThreadPool() возвращает объект ScheduledExecutorService , который мы назвали scheduler . Далее мы переопределяем метод run() из интерфейса Runnable . Экземпляр Runnable используется для выполнения потока. В Runnable мы создаем переменную countdownStarter и инициализируем ее числом в секундах, с которого мы хотим запустить таймер обратного отсчета.
Теперь внутри метода run() печатаем countdownStarter и уменьшаем его значение на единицу. Чтобы остановить таймер при достижении нуля, мы создаем условие для проверки значения countdownStarter . Если его значение становится меньше нуля, он печатает сообщение и закрывает планировщик , который является службой-исполнителем, с помощью команды scheduler.shutdown() .
Наконец, мы используем объект scheduler для вызова метода scheduleAtFixedRate() , который периодически запускает данное действие и принимает четыре аргумента. Первый аргумент — это runnable экземпляр; второй — задержка первого исполнения; третий — задержка между действиями. Здесь мы указали задержку равной одной секунде, как предполагает четвертый аргумент.
import java.util.concurrent.*; import static java.util.concurrent.TimeUnit.SECONDS; public class Countdown public static void main(String[] args) final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); final Runnable runnable = new Runnable() int countdownStarter = 20; public void run() System.out.println(countdownStarter); countdownStarter--; if (countdownStarter 0) System.out.println("Timer Over!"); scheduler.shutdown(); > > >; scheduler.scheduleAtFixedRate(runnable, 0, 1, SECONDS); > >
20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Timer Over!
Таймер обратного отсчета в Java с использованием Timer и TimerTask
В этом примере мы используем два класса, Timer и TimerTask , которые поставляются с пакетом java.util . Оба класса используются для планирования задач для выполнения в фоновом потоке. В этом примере мы используем объект jFrame для отображения таймера в окне графического интерфейса. Сначала мы создаем объект jFrame , затем jLabel , который показывает текст таймера. Мы устанавливаем макет фрейма как FlowLayout() и устанавливаем положение и размер окна.
Затем мы добавляем в кадр jLabel . Чтобы создать таймер обратного отсчета, мы создаем объект Timer и вызываем его метод scheduleAtFixedRate() , который планирует и повторяет указанную задачу с фиксированной скоростью, как следует из названия.
Теперь, когда помощник scheduleAtFixedRate() принимает объект TimerTask в качестве первого аргумента, мы создаем объект, используя new TimerTask() . Для второго и третьего аргументов они планируют выполнение задачи и период в миллисекундах между каждым выполнением.
На следующем шаге нам нужно создать переменную и инициализировать ее числом, с которого мы хотим начать обратный отсчет. Затем мы вызываем метод run() и устанавливаем текст компонента jLabel как i . Чтобы остановить таймер, мы вызываем timer.cancel() .
import javax.swing.*; import java.awt.*; import java.util.Timer; import java.util.TimerTask; public class Countdown public static void main(String[] args) JFrame jframe = new JFrame(); JLabel jLabel = new JLabel(); jframe.setLayout(new FlowLayout()); jframe.setBounds(500, 300, 400, 100); jframe.add(jLabel); jframe.setVisible(true); Timer timer = new Timer(); timer.scheduleAtFixedRate(new TimerTask() int i = 20; public void run() jLabel.setText("Time left: " + i); i--; if (i 0) timer.cancel(); jLabel.setText("Time Over"); > > >, 0, 1000); > >
Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.
Как сделать таймер в java
Приведенный ниже код запускает в окне 2 таймера — прямого и обратного отсчета.
import javax.swing.*; import java.awt.*; import java.util.Timer; import java.util.TimerTask; public class App public static void main(String[] args) JLabel label1 = new JLabel(); Timer timer1 = new Timer(); timer1.scheduleAtFixedRate(new TimerTask() int i = 20; public void run() label1.setText("Таймер 1 - осталось : " + i + " сек."); i--; if (i 0) timer1.cancel(); label1.setText("Таймер 1 - время вышло"); > > >, 0, 1000); JLabel label2 = new JLabel(); Timer timer2 = new Timer(); timer2.scheduleAtFixedRate(new TimerTask() int i = 0; public void run() label2.setText("Таймер 2 - прошло : " + i + " сек."); i++; > >, 0, 1000); JFrame frame = new JFrame(); frame.setLayout(new FlowLayout()); frame.setBounds(500, 300, 300, 100); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(label1, BorderLayout.NORTH); frame.add(label2, BorderLayout.SOUTH); frame.setVisible(true); > >
Как сделать обратный отсчет времени в java swing?
Написал небольшую программу в java используя swing. В одном месте, программа должна выводить в jTextfield отсчет секунд от 3 до 0, затем сообщение старт. Пытался с помощью такой конструкции:
for(int i = 3, i > o; i—)
< jTextfield.setText("Осталось: " + i);
Thread.sleep(1000);
>
Все это приписывалось внутри jButton, т.е. при нажатии мышкой на кнопку jButton. Короче, вся программа висела эти самые 3 секунды, а потом в jTextfield вышло 1, и все на этом. Также пытался с Timer и TimerTask, но там тоже не срослось. Как мне решить эту проблему, помогите а.
При создании окна создаётся Event Dispatch Thread, внутри которого крутится бесконечный цикл, на каждой итерации достающий событие из очереди и запускающий обработчик для него. В обработчике бесполезно использовать циклы для изменения интерфейса, так как все изменения просто встанут в очередь и будут выполнены только на одной из следующих итераций цикла событий. И тем более нельзя останавливать Поток Обработки Событий (что вы делаете вызовом Thread.sleep(1000)), это заморозит всё приложение. Поэтому необходимо использовать предлагаемые библиотекой механизмы запуска фоновых задач и взаимодействия с ними. Например такие, как SwingUtilities.invokeLater(), Timer и SwingWorker.
import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JButton; import javax.swing.Timer; public class Countdown < private final JLabel label = new JLabel(". "); private final JButton button = new JButton("Click me"); private final Timer timer; private int count = 3; public Countdown() < timer = new Timer(1000, e -> < if (count >0) < label.setText(String.valueOf(count--)); >else < ((Timer) (e.getSource())).stop(); count = 3; button.setEnabled(true); >>); timer.setInitialDelay(0); button.addActionListener(e -> < timer.start(); button.setEnabled(false); >); JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(label, BorderLayout.PAGE_START); frame.add(button, BorderLayout.PAGE_END); frame.pack(); frame.setVisible(true); > public static void main(String[] args) < new Countdown(); >>