我正在用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
。
我做错了。感谢您的帮助。
答案 0 :(得分:1)
这里是非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));
}
}