java - 任务调度,共享表单标签变量
问题描述
我正在用 Java FX 编写一些简单的程序。我是Java的初学者。我想做,你填写文本框(以分钟为单位的时间)并运行它。并且比它运行 timer.schedule 会随着时间的推移每分钟刷新标签。秒表之类的东西。(你设置了你想要记住时间的时间)。
我有控制器
public class Controller implements Initializable {
@FXML
public Label label;
@FXML
private TextField timeEnd;
.
.
和方法 onClick
@FXML
private void handleButtonAction(ActionEvent event) {
Integer timeEndVal = Integer.parseInt(timeEnd.getText());
Date startDate = new Date();
Date endDate = new Date();
endDate.setTime(startDate.getTime() + (timeEndVal * 60000));
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
long currentMinutes = currentTime().getTime() - startDate.getTime();
System.out.println(currentMinutes / 60000 + " / " + timeEndVal + " min");
label.setText(String.valueOf(currentMinutes / 60000 + " / " + timeEndVal + " min"));
}
}, 0, 60000);
但我不知道,我如何将label
变量变为timer.schedule
. 我做错了什么。感谢您的帮助。
解决方案
这是一个非Controller
版本,您可以从中获取一些想法。我建议你使用TimeLine
而不是Timer
. 这不是一个完整的程序!
import java.util.concurrent.atomic.AtomicInteger;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Duration;
/**
*
* @author blj0011
*/
public class JavaFXApplication267 extends Application
{
@Override
public void start(Stage primaryStage)
{
AtomicInteger timeInSeconds = new AtomicInteger();
TextField textField = new TextField();
Label label = new Label(Integer.toString(timeInSeconds.get()));
Button btn = new Button("Play");
textField.setPromptText("Enter the number of minutes");
textField.textProperty().addListener((obs, oldValue, newValue) -> {
//This assume the input is corret!
timeInSeconds.set(Integer.parseInt(newValue) * 60);//Number of minutes times 60 seconds
label.setText(getMinsSeconds(timeInSeconds.get()));
});
Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(1), (event) -> {
if (timeInSeconds.get() > 0) {
label.setText(getMinsSeconds(timeInSeconds.decrementAndGet()));
}
}));
timeline.setCycleCount(Timeline.INDEFINITE);
btn.setOnAction((ActionEvent event) -> {
switch (btn.getText()) {
case "Play":
timeline.play();
btn.setText("Pause");
textField.setEditable(false);
break;
case "Pause":
timeline.pause();
btn.setText("Play");
textField.setEditable(true);
break;
}
});
VBox root = new VBox(label, btn, textField);
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args)
{
launch(args);
}
String getMinsSeconds(int seconds)
{
return String.format("%02d:%02d", (seconds / 60), (seconds % 60));
}
}
推荐阅读
- php - 如何点击放大图片?
- typescript - How to import local package in typescript monorepo
- vue.js - Vuex 意外更新了 2 个状态对象
- redux - Redux 调度程序无法作为道具传递给子组件
- wso2 - wso2 API管理器和身份服务器中的RBAC(Role back access control)
- html - 页面加载时如何让html onchange函数工作
- bash - 如何读取文件夹中具有相似模式的所有文件并将它们作为逗号分隔的字符串传递给 Python?
- r - 将 data.frame 列名传递给函数
- emacs - 是否有一种模式或某种方式可以在 emacs 中使用 grep 然后跳转到所引用的?
- php - Xpath 从多个复杂的标签中获取文本内容