0

Im writing a small program that involves a timer but for some reason I cant get the TimerTask to update the value of my Label.setText

public class Main extends Application  {


Label TimerLabel;
/* Create a Button named button */
Button button;
/* Create three Radiobuttons named Radio1,Radio2,Radio3 */
RadioButton Radio1, Radio2, Radio3;

Timer QuestionTimer = new Timer();
TimerTask QuestionTick = new TimerTask() {
    @Override
    public void run() {
        TimerLabel.setText(String.valueOf(Integer.valueOf(TimerLabel.getText())+1));
    }
};

public static void main(String[] args) {
    launch(args);
}

/*UI Part*/
@Override
public void start(Stage primaryStage) throws Exception {


    /*Window(Stage) Title is set to "Try 1"*/
    primaryStage.setTitle("Try 1");

    /*Button properties*/
    button = new Button();
    button.setText("Click Me");


    //Radio Button
    Radio1 = new RadioButton();
    Radio1.setText("Click Me 1");
    Radio1.setOnAction(e->{
        System.out.println("Radio Button Clicked");
    });

    Radio2 = new RadioButton();
    Radio2.setText("Click Me 2");
    Radio2.setOnAction(e->{
        System.out.println("Radio Button 2 Clicked");
    });

    Radio3 = new RadioButton();
    Radio3.setText("Click Me 3");
    Radio3.setOnAction(e->{
        System.out.println("Radio Button 3 Clicked");
    });

    TimerLabel = new Label();
    TimerLabel.setText("0");


    /*Here my layout is defined */
    Pane Buttonlayout = new Pane();
    button.setLayoutX(200);
    button.setLayoutY(200);
    Radio1.setLayoutX(15);
    Radio1.setLayoutY(20);
    Radio2.setLayoutX(15);
    Radio2.setLayoutY(40);
    Radio3.setLayoutX(15);
    Radio3.setLayoutY(60);
    TimerLabel.setLayoutX(100);
    TimerLabel.setLayoutY(20);
    Buttonlayout.getChildren().add(button);
    Buttonlayout.getChildren().add(Radio1);
    Buttonlayout.getChildren().add(Radio2);
    Buttonlayout.getChildren().add(Radio3);
    Buttonlayout.getChildren().add(TimerLabel);

    /*Here we define the scene (aka everything inside the stage (inside the window))*/
    Scene scene1 = new Scene(Buttonlayout,300,250);


    primaryStage.setScene(scene1);
    primaryStage.show();

    QuestionTimer.scheduleAtFixedRate(QuestionTick,1000,1000);
}

}

So thats my code, I know most of it seems stupid but I first wanted to start programming on the timer and well it didnt work. Any kind of help would be appreciated

  • Have a look at [this](http://stackoverflow.com/questions/11224886/how-do-i-let-multiple-threads-paint-onto-an-awt-component) question, Timers have to be considered to be running on another thread. – Aconcagua May 11 '16 at 12:03

1 Answers1

1

From the code it appears you are utilizing the java.util.Timer class. The documentation states Implementation note: All constructors start a timer thread. The the JavaFX UI should not be updated from another thread, which is what you are doing with the timer.

Rather than updating the UI directly use the Platform.runLater(Runnable) to schedule the UI tasks on the main JavaFX thread.

javafx.application.Platform.runLater(new Runnable() {
  @Override
  public void run() {
    TimerLabel.setText(String.valueOf(Integer.valueOf(TimerLabel.getText())+1));
  }
}

And please, do yourself a favor and get rid of the method chaining. It will make it easier to debug when Integer.valueOf throws an Exception.

String timer_label = TimerLabel.getText();
Integer timer_int = Integer.valueOf(timer_label);
String timer_text = String.valueOf(timer_int + 1);
TimerLabel.setText(timer_text);
Ken Brittain
  • 2,255
  • 17
  • 21