一、需求说明
使用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;
}
};
}
}
}