簡體   English   中英

我不知道停止時如何顯示計時器

[英]I don't know how to display timer when stopped

你們都還好嗎? 我的代碼有一點問題。 當我停止計時器程序時,它會說“完成!”。 因為我將其設置為“完成”,但是我想顯示剩余時間而不是單詞“完成”。 例如,例如,如果我將原始時間設置為4000秒,並且我在3000秒處停止,那么我想在停止時顯示當前時間3000,而不是單詞“完成”。 你們能幫我嗎? 我真的很感激。

這是我的代碼:

import java.awt.event.*;
import java.awt.*;

import javax.swing.*;
public class CountdownTimer extends JFrame  {

    JLabel promptLabel, timerLabel;
    int counter;
    JLabel tf;
    JButton button;
    Timer timer;


    public static void main(String args[]) {

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new CountdownTimer();
            }

        });

    }


    public CountdownTimer() {

        JFrame lt = new JFrame();
            lt.getContentPane().setBackground(new Color(0, 102, 153));
            lt.setBounds(100, 100, 450, 300);
            lt.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            lt.getContentPane().setLayout(null);
            lt.setVisible(true);

        promptLabel = new JLabel("Time: ", SwingConstants.CENTER);
        promptLabel.setFont(new Font("Modern No. 20", Font.BOLD, 17));
        promptLabel.setBounds(21, 30, 210, 30);
        lt.add(promptLabel);

        tf = new JLabel("4000");
        tf.setBounds(160, 36, 40, 20);
        lt.add(tf);

        button = new JButton("Start");
        button.setFont(new Font("Modern No. 20", Font.BOLD, 11));
        button.setBounds(299, 37, 89, 23);
        lt.add(button);

        JButton btnLogout = new JButton("LOGOUT");

        btnLogout.setBackground(new Color(112, 128, 144));
        btnLogout.setFont(new Font("Trajan Pro", Font.BOLD, 17));
        btnLogout.setBounds(149, 189, 121, 36);
        btnLogout.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                 String sbutt = e.getActionCommand();

                 if(sbutt.equals("LOGOUT")) {


                     long current = counter;
                     long elapsed = current - counter;

                        timer.stop();
                        timerLabel.setText("Done!");
                        Toolkit.getDefaultToolkit().beep();
                        tf.setText(String.valueOf(elapsed));

                 }
            }
        });
        lt.getContentPane().add(btnLogout);

        timerLabel = new JLabel("Waiting...", SwingConstants.CENTER);
        timerLabel.setFont(new Font("Modern No. 20", Font.BOLD, 17));
        timerLabel.setBounds(119, 97, 176, 62);
        lt.getContentPane().add(timerLabel);

        event e =  new event();
        button.addActionListener(e);
    }
    public void actionPerformed(ActionEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    public void run() {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    public class event implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            int count = (int)(Double.parseDouble(tf.getText()));
            timerLabel.setText("Time left: " + count);
            TimeClass tc = new TimeClass(count);
            timer = new Timer(1000, tc);
            timer.start();
        }
    }
    public class TimeClass implements ActionListener {
        int counter;
        public TimeClass(int counter) {
            this.counter= counter;
   }
        public void actionPerformed(ActionEvent tc) {
            counter--;
            if(counter >= 1) {
                timerLabel.setText("Time left: " + counter);
            }
            else {
                timer.stop();
                timerLabel.setText("Done!");
                Toolkit.getDefaultToolkit().beep();
            }
        }
    }
}

但我想顯示剩余時間而不是單詞“完成”。

更改timerLabel.setText("Done!"); timerLabel.setText(counter);

我應該指出,由於它的本質,Swing Timer並不完全准確,您應該關注已過去的時間量而不是計時器的調用頻率。 當然,這完全取決於您希望計數的准確度,但是值得一提(IMHO)

計時器

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

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

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public static class TestPane extends JPanel {

        private JLabel label;
        private JButton button;

        private Timer timer;
        private long startedAt;

        public static final int RUN_TIME = 5000;

        public TestPane() {
            label = new JLabel("...");
            button = new JButton("Start");
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;

            add(label, gbc);
            add(button, gbc);

            button.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (timer == null) {
                        button.setText("Stop");
                        startedAt = System.currentTimeMillis();
                        timer = new Timer(500, new ActionListener() {
                            @Override
                            public void actionPerformed(ActionEvent e) {
                                long diff = System.currentTimeMillis() - startedAt;
                                if (diff >= RUN_TIME) {
                                    label.setText("Out of time; Used: " + remainingTime() + "s; remaining " + usedTime() + "s");
                                    timer.stop();
                                    button.setText("Start");
                                } else {
                                    label.setText("Used: " + remainingTime() + "s; remaining " + usedTime() + "s");
                                }
                            }
                        });
                        label.setText("Used: " + remainingTime() + "s; remaining " + usedTime() + "s");
                        timer.start();
                    } else {
                        timer.stop();
                        long diff = System.currentTimeMillis() - startedAt;
                        label.setText("Used: " + remainingTime() + "s; remaining " + usedTime() + "s");
                        button.setText("Start");
                        timer = null;
                    }
                }
            });
        }

        public int remainingTime() {
            long diff = System.currentTimeMillis() - startedAt;
            return (int) Math.round((RUN_TIME - diff) / 1000d);
        }

        public int usedTime() {
            long diff = System.currentTimeMillis() - startedAt;
            return (int) Math.round(diff / 1000d);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(300, 200);
        }

    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM