Java计时器在单击空格时启动,在再次单击空格后结束

Java计时器在单击空格时启动,在再次单击空格后结束,java,swing,timer,countdown,key-bindings,Java,Swing,Timer,Countdown,Key Bindings,我正在尝试编程一个Rubiks立方体计时器。单击空格后,我希望计时器从15秒开始倒计时,15秒结束后,从0开始倒计时。解决完立方体后,再次单击空格,停止计时器(我希望计时器计数到最接近的百分之一)。以下是我现在拥有的: import java.awt.BorderLayout; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.E

我正在尝试编程一个Rubiks立方体计时器。单击空格后,我希望计时器从15秒开始倒计时,15秒结束后,从0开始倒计时。解决完立方体后,再次单击空格,停止计时器(我希望计时器计数到最接近的百分之一)。以下是我现在拥有的:

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;


public class CubeMain extends JFrame {

    private static final long serialVersionUID = 1L;
    private JPanel contentPane;
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    CubeMain frame = new CubeMain();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public CubeMain() {

        setTitle("Cube Timer");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 600, 490);
        contentPane = new JPanel();
        final JLabel Timerlbl = new JLabel("");
        Timerlbl.setBounds(269, 219, 46, 14);
        contentPane.add(Timerlbl);
        addKeyListener(new KeyAdapter() {
            @Override
            public void keyReleased(KeyEvent e) {
                Timerlbl.setText("Label Change");

            }
        });
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

    }
}

所以你知道你需要某种计时器。Swing程序需要的计时器是
javax.Swing.timer
。这是基本的构造函数

Timer(int delay, ActionListener listener);
其中,delay是触发动作之间的延迟时间,侦听器是侦听每个间隔触发的计时器动作事件的对象。一个基本的实现会给我类似的东西

public TimerPanel() {
    Timer timer = new Timer(1000, new ActionListener(){
        public void actionPerformed(ActionEvent e) {
            // do something
        }
    });
    timer.start();
}
您可以使用一个
count
变量递增并用于设置
timerLabel
。然后只需将空间的键绑定设置为
timer.start()
timer.stop()

看看这个,它有计时器。这正是你所需要的

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.border.EmptyBorder;

public class TimerPanel{

    double count = 15.00;
    boolean reverse = true;
    boolean started = false;

    private JLabel timerLabel = new JLabel(String.format("%.2f", count));
    private Timer timer;

    public TimerPanel() {
        timerLabel.setHorizontalAlignment(JLabel.CENTER);
        timerLabel.setBorder(new EmptyBorder(20, 20, 20, 20));

        JFrame frame = new JFrame();
        frame.add(timerLabel);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);


        timer = new Timer(10, new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                if (reverse && count > 0) {
                    count -= 0.01;
                    timerLabel.setText(String.format("%.2f", count));
                    if (count <= 0) {
                        reverse = false;
                    }
                }
                if (!reverse){
                    count += 0.01;
                    timerLabel.setText(String.format("%.2f", count));
                }
            }
        });

        Action spaceAction = new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                if (!started) {
                    timer.start();
                    started = true;
                } else {
                    timer.stop();
                    count = 15.00;
                    started = false;
                    reverse = true;
                }
            }
        };

        InputMap inputMap = timerLabel.getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW);
        ActionMap actionMap = timerLabel.getActionMap();

        inputMap.put(KeyStroke.getKeyStroke("SPACE"), "spaceAction");
        actionMap.put("spaceAction", spaceAction);
    }


    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                new TimerPanel();
            }
        });
    }
}
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.AbstractAction;
导入javax.swing.Action;
导入javax.swing.ActionMap;
导入javax.swing.InputMap;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.KeyStroke;
导入javax.swing.SwingUtilities;
导入javax.swing.Timer;
导入javax.swing.border.EmptyBorder;
公共类计时器面板{
重复计数=15.00;
布尔反向=真;
布尔值=false;
私有JLabel timerLabel=newjlabel(String.format(“%.2f”,count));
私人定时器;
公共时间面板(){
timerLabel.setHorizontalAlignment(JLabel.CENTER);
timerLabel.setboorder(新的EmptyBorder(20,20,20,20));
JFrame=新JFrame();
frame.add(timerLabel);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationByPlatform(真);
frame.setVisible(true);
计时器=新计时器(10,新ActionListener(){
已执行的公共无效操作(操作事件e){
如果(反向计数和计数>0){
计数-=0.01;
timerLabel.setText(String.format(“%.2f”,count));
如果(计数考虑使用过密钥侦听器来解决可能的焦点问题+ 1和<代码>动作< /代码>。次要NIT:使用<代码> @重写< /代码>验证签名;重新计算默认值为<代码>计数< /代码>。