线程放入textareajavafx

线程放入textareajavafx,java,multithreading,javafx,append,Java,Multithreading,Javafx,Append,我知道如何在控制台中显示来自线程的文本,但如何将其放入文本区域?此外,由于我的文本是字符和数字,如果我是对的,我如何将它们转换为字符串,因为TextArea只接受字符串 我需要在TextArea中附加PrintNum、LetterSmall和LetterBig。 有人知道路吗?任何帮助都将不胜感激 public class pracice extends Application { @Override public void start(Stage primaryStage) {

我知道如何在控制台中显示来自线程的文本,但如何将其放入文本区域?此外,由于我的文本是字符和数字,如果我是对的,我如何将它们转换为字符串,因为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);
}
公共类pracice扩展应用程序{
@凌驾
公共无效开始(阶段primaryStage){
TextArea ta=新TextArea();
按钮btn=新按钮();
btn.setText(“显示”);
btn.setOnAction(新的EventHandler(){
Runnable run=新的PrintNum(25);
螺纹th1=新螺纹(运行);
查利特;
字符组;
Runnable let=新字母小(lett);
螺纹th2=新螺纹(let);
Runnable lUp=新的LetterBig(lettUp);
螺纹th3=新螺纹(lUp);
@凌驾
公共无效句柄(ActionEvent事件){
System.out.append(“\nBegin\n”);
th1.start();
试一试{
th1.加入(2000年);
}捕捉(中断异常e){
e、 printStackTrace();
}
th2.start();
试一试{
th2.join();
}捕捉(中断异常e){
e、 printStackTrace();
}
th3.start();
}
});
BorderPane根=新的BorderPane();
根。setTop(btn);
根集中心(ta);
场景=新场景(根,300,250);
初级阶段。设置标题(“实践”);
初级阶段。场景(场景);
primaryStage.show();
}
公共静态void main(字符串[]args){
发射(args);
}
}

类PrintNum实现可运行{
私有intlastnum;
随机r=新随机();
公共PrintNum(int n){
lastNum=n;
}
公开募捐{
System.out.append(“\n”);

对于(int i=1;i,我找到了一个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();
new线程(new Runnable()){
private int lastNum=25;
私有字符;
私有字符集;
随机r=新随机();
@凌驾
公开募捐{
Thread th1=新线程();
ta.附录文本(“\n”);

对于(inti=1;我想你这里有很多问题。我将回答一个问题:使用
TextA.appendText(String)
要在文本区域显示文本,嗯,我知道你通常可以附加它的方式。但是我怎样才能将这个字符转换成字符串呢?因为我不能在TA中附加字符。@IvanProninI会给你一个提示,这样你就可以找到关于这个主题的数百个答案。用户界面只能从UI线程修改为显示
线程的文本tform.runLater(TextA.appendText(“someString”)
可能重复:。此代码有缺陷。您正在从后台线程修改UI元素。虽然这可能恰好适用于您的特定设置,但它违反了JavaFX线程规则,因此绝对不能保证它在其他任何地方都能正常工作。我不是说它是最好的,也不是很好,但它对我有效。您可以更改代码吗nd将其添加为答案?我很乐意将此案例的正确答案更改为您的实现/解决方案。@James_DI不理解此答案中的代码试图做什么(没有
Runnable
for的三个线程是什么?)。但是调用,例如,
ta.appendText(…)是不正确的
来自后台线程,您不应该发布此代码并声称它回答了问题,因为其他用户可能会复制它。没有人真正关心它是否恰好在您的特定设置上工作:您违反了JavaFX的线程规则,这是非常严重的。不要使用此网站传播错误信息。也许可以看看我对的回答。question问的是不同的问题,但答案中有我认为您可能正在尝试做的示例。
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 + " ");
    }
}
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();