JavaFX从Task更新文本

时间:2016-09-07 07:21:08

标签: java javafx

我想更改文字我创建一个任务并增加i,但我想在i更改时在同一个地方设置一个新文本,但旧文本不会消失。这是我的代码。在秋千上,我将使用repaint()

Task task = new Task<Void>() {
    @Override
    public Void call() throws Exception {
        int i = 0;
        while (true) {
          final int finalI = i;
          Platform.runLater(new Runnable() {
            @Override
            public void run() {

                String a = "aaa";
                if(finalI>4){
                    a = "sadsa";
                }
                if(finalI>10){
                    a = "sadsadsadsadsad";
                }
                gc.fillText(a, 150, 250+10);
            }
          });
          i++;
          Thread.sleep(1000);
        }
    }
};
Thread th = new Thread(task);
th.setDaemon(true);
th.start();

1 个答案:

答案 0 :(得分:2)

正如我在评论中提到的那样,问题是Canvas真的像一个绘图板。您已经在其上绘制了一些文本,然后您绘制了另一个文本而没有删除前一个文本。

在您的情况下,当您想要存储对文本的引用以便能够更新它时,使用Pane并在其上放置Text实例更合理。

我为您创建了一个示例

import javafx.application.Application;
import javafx.application.Platform;
import javafx.concurrent.Task;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.scene.text.Text;

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            BorderPane root = new BorderPane();
            Scene scene = new Scene(root, 400, 400);

            Pane pane = new Pane();
            Text text = new Text("");
            pane.getChildren().add(text);
            Task<Void> task = new Task<Void>() {
                String a = "Initial text";

                @Override
                public Void call() throws Exception {
                    int i = 0;

                    while (true) {

                        if (i > 4)
                            a = "I is bigger than 4";

                        if (i > 10)
                            a = "I is bigger than 10";

                        Platform.runLater(() -> {
                            text.setText(a);
                            // If you want to you can also move the text here
                            text.relocate(10, 10);
                        });

                        i++;
                        Thread.sleep(1000);
                    }
                }
            };
            Thread th = new Thread(task);
            th.setDaemon(true);
            th.start();

            root.setCenter(pane);
            primaryStage.setScene(scene);
            primaryStage.show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

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

注意:您还可以通过更新Platform.runlater(...)内任务的messageProperty,然后绑定call()来阻止textProperty阻止Text到这个属性。

示例:

Pane pane = new Pane();
Text text = new Text("");
text.relocate(10, 10);

pane.getChildren().add(text);
Task<Void> task = new Task<Void>() {
    {
        updateMessage("Initial text");
    }

    @Override
    public Void call() throws Exception {
        int i = 0;

        while (true) {
            if (i > 4)
                updateMessage("I is bigger than 4");

            if (i > 10)
                updateMessage("I is bigger than 10");

            i++;
            Thread.sleep(1000);
        }
    }
};

text.textProperty().bind(task.messageProperty());

Thread th = new Thread(task);
th.setDaemon(true);
th.start();