我正在编写一个涉及计时器的小程序,但是由于某种原因,我无法让TimerTask更新我的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);
}

}


多数民众赞成在我的代码,我知道大多数看起来很愚蠢,但我首先想在计时器上开始编程,但它没有用。任何帮助将不胜感激

最佳答案

从代码看来,您正在使用java.util.Timer类。文档指出Implementation note: All constructors start a timer thread.不应从另一个线程更新JavaFX UI,这是您使用计时器执行的操作。

不用直接更新UI,而是使用Platform.runLater(Runnable)在JavaFX主线程上安排UI任务。

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


并且,请帮自己一个忙,摆脱方法链接。当Integer.valueOf抛出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);

关于java - 我的TimerTask函数无法更新label.setText,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37161831/

10-12 01:21
查看更多