Какие функции мне нужно добавить для таймера обратного отсчета (GUI) в Java с использованием Eclipse? - PullRequest
0 голосов
/ 12 июля 2019

Проблема здесь в том, что мой таймер обратного отсчета просто вычитает число, которое я ввожу каждый раз, когда я нажимаю кнопку «СТАРТ». Я действительно не знаю, какой цикл использовать здесь, чтобы он был похож на настоящий таймер обратного отсчета ... это делать ... в то время? для цикла? или пока цикл? Кстати, мы должны полагаться только на потоки и графический интерфейс.

Я пробовал цикл, но я не знаю, что использовать после этого.

package com.countdown;
import java.awt.GridLayout;
import java.awt.event.*;
import javax.swing.*;

public class CountDown extends WindowAdapter implements ActionListener, Runnable {
    @Override
    public void run() { 
    }

    public void stop() {
        f.dispose();
    }

    JLabel l1, l2, l3;
    JTextField tf1, tf2, tf3;
    JButton btn1, btn2, btn3;
    JFrame f;
    JPanel p1, p2;

    public CountDown() {
        l1 = new JLabel("hrs:");
        l2 = new JLabel("mins:");
        l3 = new JLabel("sec:");
        tf1 = new JTextField("", 5); 
        tf2 = new JTextField("", 5); 
        tf3 = new JTextField("", 5);
        btn1 = new JButton("START");
        btn2 = new JButton("STOP");
        btn3 = new JButton("BACK");
        p1 = new JPanel(); 
        p2 = new JPanel();
        f = new JFrame("Countdown Timer");
    }

    public void setLaunch() {
        f.add(p1);
        f.add(p2);
        p1.add(l1);
        p1.add(tf1);
        p1.add(l2);
        p1.add(tf2);
        p1.add(l3);
        p1.add(tf3);
        p2.add(btn1);
        p2.add(btn2);
        p2.add(btn3);

        f.setLayout(new GridLayout(2,1));
        f.pack();
        f.setSize(440,150);
        f.setVisible(true);

        btn1.addActionListener(this);
        btn2.addActionListener(this);
        btn3.addActionListener(this);
        f.addWindowListener(this);
    }

    public static void main(String[] args) {
        CountDown cd = new CountDown();
        cd.setLaunch();

        Thread t1 = new Thread(cd); //hrs
        Thread t2 = new Thread(cd); //mins
        Thread t3 = new Thread(cd); //sec
        Thread t4 = new Thread(cd); //stop

        t1.start();
        try {
            t1.join();
        }
        catch(Exception e) {
            System.out.println(e);
        }

        t2.start();
        try {
            t2.join();
        }
        catch(Exception e) {
            System.out.println(e);
        }

        t3.start();
        try {
            t3.join();
        }
        catch(Exception e) {
            System.out.println(e);
        }

        t4.stop();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        int hrs = Integer.parseInt(tf1.getText());
        int mins = Integer.parseInt(tf2.getText());
        int secs = Integer.parseInt(tf3.getText());;
     if (hrs < 60) {
            try {
                Thread.sleep(1000);
                hrs--;
            } 
            catch (InterruptedException e1) {
                e1.printStackTrace();
            }
        }
        tf1.setText(Integer.toString(hrs));

    if (mins < 60) {
            try {
                Thread.sleep(1000);
                mins--;
            } 
            catch (InterruptedException e1) {
                e1.printStackTrace();
            }
        }
        tf2.setText(Integer.toString(mins));

    if (secs < 60) {
            try {
                Thread.sleep(1000);
                secs--;
            } 
            catch (InterruptedException e1) {
                e1.printStackTrace();
            }
        }
        tf3.setText(Integer.toString(secs));
    }

    public void windowClosing(WindowEvent e) {
        f.dispose();
    }
}

Цель программы: когда я вводю число в часах, минутах и ​​/ или секундах, оно выполняет обратный отсчет в текстовых полях.

1 Ответ

0 голосов
/ 12 июля 2019

Один хороший вариант для повторяющихся обновлений свинг-интерфейса - это использование свинг-таймера как показано в следующем mcve :

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Counter {

    private int count = 1;

    Counter() {

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new CounterPane(), BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);
    }

    class CounterPane extends JPanel {

        CounterPane() {

            setPreferredSize(new Dimension(200, 100));
            setLayout(new GridBagLayout());
            JLabel label = new JLabel(" ");
            add(label);
            Timer timer = new Timer(1000,  e -> {
                count++;
                label.setText(Integer.toString(count));
            });
            timer.setInitialDelay(0);
            timer.start();
        }
    }

    public static void main(String[] args) {
        new Counter();
    }
}

enter image description here

...