расписание задач, совместное использование переменной метки формы - PullRequest
0 голосов
/ 21 сентября 2018

Я пишу простую программу на 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.Что я делаю не так.Спасибо за помощь.

1 Ответ

0 голосов
/ 21 сентября 2018

Это не 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));
    }
}
...