2017-02-22 18 views
-1

我是javaFX的初学者,并且卡在这一个区域。任何帮助将不胜感激。 这是我使用场景生成器清晰理解的示例应用程序。有一个文本区域和一个按钮。我想在点击按钮的文本区域中设置数据。该设置发生在另一个线程中。 代码如下:setText()不会反映从另一个线程调用时发生的更改

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(); 
} 

的tpThread类如下:

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); 

但是,没有使用。我的最终输出没有按钮点击。

回答

0

代码有很多问题。

  1. 对JavaFX应用程序线程的活动场景图的修改必须通过Platform.runLater()执行。
  2. 你不需要另一个线程来完成一个按钮点击的东西。
  3. 加载,你在你的代码,而不是连接到一个场景所产生的节点做一个FXML是无意义的,因为用户将不会看到未连接到场景东西。

您的代码可能存在其他问题,导致其无法按预期工作。

通常,如需帮助调试问题,请提供mcve。请注意,它应该是最小完成以便有人可以复制和粘贴代码来复制问题(而几乎没有别的)。

相关问题