线程放入textareajavafx
我知道如何在控制台中显示来自线程的文本,但如何将其放入文本区域?此外,由于我的文本是字符和数字,如果我是对的,我如何将它们转换为字符串,因为TextArea只接受字符串 我需要在TextArea中附加PrintNum、LetterSmall和LetterBig。 有人知道路吗?任何帮助都将不胜感激线程放入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) {
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();