Javafx 2 setText()在从另一个线程调用时不反映更改

Javafx 2 setText()在从另一个线程调用时不反映更改,javafx-2,scenebuilder,java-threads,Javafx 2,Scenebuilder,Java Threads,我是javaFX的初学者,我被困在这一领域。任何帮助都将不胜感激。 这是我使用scene builder制作的示例应用程序,用于清晰理解。有一个文本区域和一个按钮。我想在单击按钮时将数据设置到文本区域。该设置发生在另一个线程中。 代码如下: import java.net.URL; import java.util.ResourceBundle; import javafx.beans.value.ChangeListener; import javafx.beans.value.Observ

我是javaFX的初学者,我被困在这一领域。任何帮助都将不胜感激。 这是我使用scene builder制作的示例应用程序,用于清晰理解。有一个文本区域和一个按钮。我想在单击按钮时将数据设置到文本区域。该设置发生在另一个线程中。 代码如下:

import java.net.URL;
import java.util.ResourceBundle;

import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.*;
import javafx.stage.Stage;

public class TpController{

    @FXML
    private ScrollPane scrollPane;

    @FXML
    private Button button;

    @FXML
    public TextArea txtArea ;

    private Stage stage;

    public void setTextArea(TextArea txt)
    {
        this.txtArea = txt ;
    }
    public TextArea getTextArea()
    {
        return txtArea;
    }

    public void setStage(Stage stage)
    {
        this.stage = stage;
    }

    public Stage getStage()
    {
        return stage;
    }
    public void setTopText(String text) {
       // set text from another class
       txtArea.setText(text);
    }

public void buttonHandler()
{

    tpThread t = new tpThread();
    t.start();
}
import java.io.IOException;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.control.TextArea;
import javafx.stage.Stage;

public class tpThread extends Thread {

@Override
public void run() {
// TODO Auto-generated method stub

FXMLLoader loader = new FXMLLoader(getClass().getResource("Justtp.fxml"));
try {
    Parent root = (Parent) loader.load();
    } 
catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
TpController myController = loader.getController();
TextArea t =  myController.getTextArea();
String data = "hi\nhello\nhow are you\nnice to meet you\nhahaha";

//System.out.println(t.setData("hi"));
myController.setTopText(data);
}
tpThread类如下所示:

import java.net.URL;
import java.util.ResourceBundle;

import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.*;
import javafx.stage.Stage;

public class TpController{

    @FXML
    private ScrollPane scrollPane;

    @FXML
    private Button button;

    @FXML
    public TextArea txtArea ;

    private Stage stage;

    public void setTextArea(TextArea txt)
    {
        this.txtArea = txt ;
    }
    public TextArea getTextArea()
    {
        return txtArea;
    }

    public void setStage(Stage stage)
    {
        this.stage = stage;
    }

    public Stage getStage()
    {
        return stage;
    }
    public void setTopText(String text) {
       // set text from another class
       txtArea.setText(text);
    }

public void buttonHandler()
{

    tpThread t = new tpThread();
    t.start();
}
import java.io.IOException;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.control.TextArea;
import javafx.stage.Stage;

public class tpThread extends Thread {

@Override
public void run() {
// TODO Auto-generated method stub

FXMLLoader loader = new FXMLLoader(getClass().getResource("Justtp.fxml"));
try {
    Parent root = (Parent) loader.load();
    } 
catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
TpController myController = loader.getController();
TextArea t =  myController.getTextArea();
String data = "hi\nhello\nhow are you\nnice to meet you\nhahaha";

//System.out.println(t.setData("hi"));
myController.setTopText(data);
}
我没有使用setTopText,而是直接使用

t.setText(data);

但是没有用。我的最终输出在单击按钮时不起任何作用。

您的代码存在许多问题

  • 从JavaFX应用程序线程对活动场景图的修改必须通过执行
  • 你不需要另一个线程来完成一个按钮点击。
    • 您可以使用定义按钮的操作处理程序
    • 控制器上的事件处理程序方法也可以是
    • 所有事件处理程序都由JavaFX应用程序线程上的JavaFX运行时调用,因此在编写事件处理程序时不必担心多线程问题——JavaFX事件处理编程模型是单线程的
  • 在代码中加载FXML而不将结果节点附加到场景是毫无意义的,因为用户将永远看不到任何未附加到场景的内容
  • 您的代码可能存在其他问题,导致其无法按预期工作

    通常,要获得调试问题的帮助,请提供。注意,它应该是最小的和完整的,以便有人可以复制和粘贴代码来复制问题(几乎没有其他内容)