Java计时器在单击空格时启动,在再次单击空格后结束
我正在尝试编程一个Rubiks立方体计时器。单击空格后,我希望计时器从15秒开始倒计时,15秒结束后,从0开始倒计时。解决完立方体后,再次单击空格,停止计时器(我希望计时器计数到最接近的百分之一)。以下是我现在拥有的: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
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:使用<代码> @重写< /代码>验证签名;重新计算默认值为<代码>计数< /代码>。