2017-02-22 4 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. Обратите внимание, что это должно быть как минимальным, так и полным, чтобы кто-то мог скопировать и вставить код для репликации проблемы (и почти ничего больше).

Смежные вопросы