javafx实现简单的计时器

5 篇文章 1 订阅
3 篇文章 0 订阅

一、需求说明

使用javafx实现一个简单的计时器,同时具有暂停功能。

二、代码实现

import javafx.application.Application;
import javafx.application.Platform;
import javafx.concurrent.Service;
import javafx.concurrent.Task;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.HBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import java.util.concurrent.atomic.AtomicInteger;
/**
 * @ClassName MainFrame
 * @Description TODO
 * @Author 索半斤
 * @Date 2021/9/25 20:07
 * @Version 1.0
 */
public class MainFrame extends Application {
    private Label count1 = new Label();
    private static Label count2 = new Label();
    private Button button = new Button("开始");
    private Button cancel = new Button("暂停");
    @Override
    public void start(Stage primaryStage) throws Exception {
        HBox hbp = new HBox();
        hbp.setSpacing(5);
        hbp.setPadding(new Insets(10, 10, 10, 10));
        count1.setFont(new Font("Times New Roman",20));
        count2.setFont(new Font("Times New Roman",20));
        hbp.getChildren().addAll(count1,count2,button,cancel);
        hbp.setAlignment(Pos.CENTER);
        AtomicInteger showNumber = new AtomicInteger(-1);
        Scene scene = new Scene(hbp,500,400);
        MyTask myTask = new MyTask();
        button.setOnAction(event-> {
            String message = myTask.getMessage();
            if (message == null || message.length()< 1){
                count2.setText("running");
                if (showNumber.get() == -1)showNumber.set(0);
                myTask.setStartNumber(showNumber.get());
            }else{
                count2.setText("running");
                myTask.setStartNumber(Integer.parseInt(message));
            }
            myTask.restart();
        });
        cancel.setOnAction(event -> {
            if (showNumber.get() == -1)count2.setText("尚未开始任务");
            else {
                String message = myTask.getMessage();
                myTask.cancel();
                showNumber.set(Integer.parseInt(message));
            }
        });
        count1.textProperty().bind(myTask.messageProperty());
        primaryStage.setTitle("test");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    static class MyTask extends Service<Void>{
        private int startNumber = -1;

        public void setStartNumber(int startNumber) {
            this.startNumber = startNumber;
        }

        @Override
        protected Task<Void> createTask() {
            return new Task<Void>() {
                @Override
                protected Void call() throws Exception {
                    if (startNumber == -1)startNumber = 0;
                    if (startNumber == 10)startNumber = 0;
                    for (int i = startNumber; i <=10 ; i++) {
                        updateMessage(Integer.toString(i));
                        Thread.sleep(1000);
                    }
                    Platform.runLater(()-> count2.setText("over"));
                    return null;
                }
            };
        }
    }
}

三、带清零功能代码

import javafx.application.Application;
import javafx.application.Platform;
import javafx.concurrent.Service;
import javafx.concurrent.Task;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.HBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import java.util.concurrent.atomic.AtomicInteger;
/**
 * @ClassName MainFrame
 * @Description TODO
 * @Author 索半斤
 * @Date 2022/4/4 18:16
 * @Version 2.0
 */
public class MainFrame extends Application {
    private Label count1 = new Label();
    private static Label count2 = new Label();
    private Button button = new Button("开始");
    private Button cancel = new Button("暂停");
    private Button zero = new Button("清零");
    @Override
    public void start(Stage primaryStage) throws Exception {
        HBox hbp = new HBox();
        hbp.setSpacing(5);
        hbp.setPadding(new Insets(10, 10, 10, 10));
        count1.setFont(new Font("Times New Roman",20));
        count2.setFont(new Font("Times New Roman",20));
        hbp.getChildren().addAll(count1,count2,button,cancel,zero);
        hbp.setAlignment(Pos.CENTER);
        AtomicInteger showNumber = new AtomicInteger(-1);
        Scene scene = new Scene(hbp,500,400);
        MyTask myTask = new MyTask();
        button.setOnAction(event-> {
            String message = myTask.getMessage();
            if (message == null || message.length()< 1){
                count2.setText("running");
                if (showNumber.get() == -1)showNumber.set(0);
                myTask.setStartNumber(showNumber.get());
            }else{
                count2.setText("running");
                myTask.setStartNumber(Integer.parseInt(message));
            }
            myTask.restart();
        });
        cancel.setOnAction(event -> {
            if (showNumber.get() == -1)count2.setText("尚未开始任务");
            else {
                String message = myTask.getMessage();
                myTask.cancel();
                showNumber.set(Integer.parseInt(message));
            }
        });
        zero.setOnAction(event -> {
            myTask.restart();
            myTask.setStartNumber(-1);
            myTask.cancel();
            showNumber.set(-1);
            count2.setText("");
        });
        count1.textProperty().bind(myTask.messageProperty());
        primaryStage.setTitle("test");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    static class MyTask extends Service<Void>{
        private int startNumber = -1;

        public void setStartNumber(int startNumber) {
            this.startNumber = startNumber;
        }

        @Override
        protected Task<Void> createTask() {
            return new Task<Void>() {
                @Override
                protected Void call() throws Exception {
                    if (startNumber == -1)startNumber = 0;
                    if (startNumber == 10)startNumber = 0;
                    for (int i = startNumber; i <=10 ; i++) {
                        updateMessage(Integer.toString(i));
                        Thread.sleep(1000);
                    }
                    Platform.runLater(()-> count2.setText("over"));
                    return null;
                }
            };
        }
    }
}
  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
JavaFX 可以通过使用 `Timeline` 类来实现倒计时功能。下面是一个简单的倒计时示例: ``` import javafx.animation.KeyFrame; import javafx.animation.Timeline; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.layout.StackPane; import javafx.stage.Stage; import javafx.util.Duration; public class CountdownTimer extends Application { private Timeline timeline; private Label timerLabel = new Label(); private int timeSeconds = 10; @Override public void start(Stage primaryStage) { StackPane root = new StackPane(); root.getChildren().add(timerLabel); primaryStage.setScene(new Scene(root, 100, 50)); primaryStage.show(); timeline = new Timeline(); timeline.setCycleCount(Timeline.INDEFINITE); timeline.getKeyFrames().add(new KeyFrame(Duration.seconds(1), new EventHandler<ActionEvent>() { // KeyFrame event handler public void handle(ActionEvent event) { timeSeconds--; // update timerLabel timerLabel.setText("Seconds Remaining: " + timeSeconds); if (timeSeconds <= 0) { timeline.stop(); } } })); timeline.play(); } public static void main(String[] args) { launch(args); } } ``` 在这个示例中,我们使用 `Timeline` 类来创建一个动画计时器,并将计时器的周期设置为 1 秒。在每个周期结束时,我们会更新 `timerLabel` 标签的文本,并检查是否到达了计时器的终点。 您可以根据需要调整 `timeSeconds` 变量的值,以设置不同的倒计时时间。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

索半斤_suobanjin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值