【问题标题】:Thread put in TextArea JavaFX线程放入 TextArea JavaFX
【发布时间】:2017-07-22 19:39:28
【问题描述】:

我知道如何在控制台中显示线程中的文本,但是如何将它放在 TextArea 中?另外,由于我的文本是字符和数字,我如何将它们转换为字符串,因为如果我是对的,TextArea 只接受字符串?

我需要在 TextArea 中附加 PrintNum、LetterSmall 和 LetterBig。 有人知道路吗?任何帮助将不胜感激!

public class pracice extends Application {


@Override
public void start(Stage primaryStage) {

    TextArea ta = new TextArea();

    Button btn = new Button();
    btn.setText("Show");
    btn.setOnAction(new EventHandler<ActionEvent>() {


        Runnable run = new PrintNum(25);
        Thread th1 = new Thread(run);

        char lett;
        char lettUp;

        Runnable let = new LetterSmall(lett);
        Thread th2 = new Thread(let);

        Runnable lUp = new LetterBig(lettUp);
        Thread th3 = new Thread(lUp);

        @Override
        public void handle(ActionEvent event) {
            System.out.append("\nBegin\n");

            th1.start();
            try{
                th1.join(2000);
            } catch (InterruptedException e){
                e.printStackTrace();
            }

            th2.start();
            try{
                th2.join();
            } catch (InterruptedException e){
                e.printStackTrace();
            }

            th3.start();
        }
    });


    BorderPane root = new BorderPane();
    root.setTop(btn);
    root.setCenter(ta);

    Scene scene = new Scene(root, 300, 250);

    primaryStage.setTitle("Practice");
    primaryStage.setScene(scene);
    primaryStage.show();
}

public static void main(String[] args) {

    launch(args);
}

}

class PrintNum implements Runnable {

private int lastNum;
Random r = new Random();

public PrintNum(int n){
    lastNum = n;
}

public void run(){
    System.out.append("\n");
    for(int i = 1; i <= lastNum; i++){
        int rN = r.nextInt(25) + 1;
        System.out.append((lastNum - rN) + " ");
    }
}

}

class LetterSmall implements Runnable {

Random r = new Random();

private char lett;

public LetterSmall(char s){
    lett = s;
}

public void run(){
   System.out.append("\n");
    for(int i = 1; i <= 25; i++){
        char c = (char) (r.nextInt(26) + 'a');
        lett = c;
        System.out.append(lett + " ");
    }
}

}

class LetterBig implements Runnable {

Random r = new Random();

private char lettUp;

public LetterBig(char up){
    lettUp = up;
}

public void run(){
    System.out.append("\n");
    for(int i = 1; i <= 25; i++){
        char c = (char) (r.nextInt(26) + 'A');
        lettUp = c;
        System.out.append(lettUp + " ");
    }
}

}

【问题讨论】:

  • 这里有很多问题。我会回答一个:使用TextA.appendText(String)在TextArea中显示文本
  • 嗯,我知道你通常可以附加它的方式。但是我怎样才能把这个字符变成一个字符串呢?因为我不能在 TA 中附加字符。 @IvanPronin
  • 我会给你一个提示,以便你找到关于这个主题的数百个答案。 UI 只能从 UI 线程修改
  • 要显示来自Thread 的文本,请执行Platform.runLater(TextA.appendText("someString")

标签: java multithreading javafx append


【解决方案1】:

所以我找到了 TextArea 输入的解决方案。我没有创建三个类线程,而是将它们移动到主要的 JavaFX 类中。谢谢大家的帮助。

看起来像这样:

new Thread(new Runnable() {
        private int lastNum = 25;
        private char lett;
        private char lettUp;

        Random r = new Random();


        @Override
        public void run() {

            Thread th1 = new Thread();
            ta.appendText("\n");
            for(int i = 1; i <= lastNum; i++){
                int rN = r.nextInt(25) + 1;
                ta.appendText((lastNum - rN) + " ");
            }

            Thread th2 = new Thread();
            ta.appendText("\n\n");
            for(int i = 1; i <= 25; i++){
                char c = (char) (r.nextInt(26) + 'a');
                lett = c;
                ta.appendText(lett + " ");
            }

            Thread th3 = new Thread();
            ta.appendText("\n\n");
            for(int i = 1; i <= 25; i++){
                char c = (char) (r.nextInt(26) + 'A');
                lettUp = c;
                ta.appendText(lettUp + " ");
            }

            th1.start();
            try{
                th1.join(2000);
            } catch (InterruptedException e){
                e.printStackTrace();
            }
            th2.start();
            try{
                th1.join();
            } catch (InterruptedException e){
                e.printStackTrace();
            }
            th3.start();
            try{
                th1.join();
                th2.join();
                th3.join();
            } catch (InterruptedException e){
                e.printStackTrace();
            }

        }
    }).start();

【讨论】:

  • 这段代码有缺陷。您正在从后台线程修改 UI 元素。虽然这可能发生在您的特定设置上,但它违反了 JavaFX 线程规则,因此绝对不能保证它可以在其他任何地方工作。
  • 我并不是说它是最好的或好的,但它对我有用。您可以更改代码并将其添加为答案吗?我很乐意将此案例的正确答案更改为您的实施/解决方案。 :) @James_D
  • 我不明白这个答案中的代码试图做什么(没有Runnable 的三个线程是什么?)。但是,例如从后台线程调用ta.appendText(...) 是不正确的,您不应发布此代码并声称它回答了问题,因为其他用户可能会复制它。没有人真正关心它是否适用于您的特定设置:您违反了 JavaFX 的线程规则,这是非常 well-documented。请勿使用本网站传播错误信息。
  • 也许看看我对this question 的回答。问题是问一些不同的东西,但答案有一些我认为你可能正在尝试做的例子。
猜你喜欢
  • 1970-01-01
  • 2016-09-15
  • 1970-01-01
  • 2018-05-24
  • 2023-04-04
  • 1970-01-01
  • 2013-09-07
  • 1970-01-01
  • 2014-08-26
相关资源
最近更新 更多