【问题标题】:What functions do I need to add for Countdown Timer (GUI) in Java using Eclipse?我需要使用 Eclipse 为 Java 中的倒数计时器 (GUI) 添加哪些功能?
【发布时间】:2019-11-21 19:08:31
【问题描述】:

这里的问题是我的倒数计时器只是减去我点击“开始”按钮时输入的数字。我真的不知道在这里使用什么样的循环来让它像一个真正的倒数计时器......它是这样做的..while 吗?循环?还是while循环? 顺便说一句,我们必须只依赖线程和 GUI。

我尝试了for循环,但我不知道之后该使用什么。

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

该程序的目标是:当我在小时、分钟和/或秒中输入一个数字时,它会在文本字段中倒计时。

【问题讨论】:

    标签: java multithreading swing user-interface countdown


    【解决方案1】:

    重复摆动 gui 更新的一个好选择是使用 swing timer 如以下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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 1970-01-01
      • 2018-05-25
      • 2019-10-20
      • 1970-01-01
      • 2017-07-06
      • 1970-01-01
      相关资源
      最近更新 更多