Thread em java fx

como boto uma thread em java fx?

package threads;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;

public class FXMLDocumentController implements Runnable, Initializable {
    
    public Thread thread;
    
    @FXML
    private Label label;
    
    @FXML
    private void handleButtonAction(ActionEvent event) {
     
       this.thread("minha thread");
    }
    
    
    public String nome;
    public void thread(String nome){
        this.nome = nome;
        thread.start();
    }
    
    
    @Override
    public void run() {
        
        System.out.println("You clicked me!");  
        label.setText("Hello World!");
         
    }
    
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
    }    

}

Você não instanciou a Thread.

public Thread thread = new Thread(this);

ainda sim da um monte de erro quando aperto o btn_botao.

Posta aqui os erros, senão não conseguimos saber o que tem errado.

1 curtida

Exception in thread “Thread-4” java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-4
at com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:236)
at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:423)
at javafx.scene.Parent$2.onProposedChange(Parent.java:367)
at com.sun.javafx.collections.VetoableListDecorator.setAll(VetoableListDecorator.java:113)
at com.sun.javafx.collections.VetoableListDecorator.setAll(VetoableListDecorator.java:108)
at com.sun.javafx.scene.control.skin.LabeledSkinBase.updateChildren(LabeledSkinBase.java:575)
at com.sun.javafx.scene.control.skin.LabeledSkinBase.handleControlPropertyChanged(LabeledSkinBase.java:204)
at com.sun.javafx.scene.control.skin.LabelSkin.handleControlPropertyChanged(LabelSkin.java:49)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase.lambda$registerChangeListener$61(BehaviorSkinBase.java:197)
at com.sun.javafx.scene.control.MultiplePropertyChangeListenerHandler$1.changed(MultiplePropertyChangeListenerHandler.java:55)
at javafx.beans.value.WeakChangeListener.changed(WeakChangeListener.java:89)
at com.sun.javafx.binding.ExpressionHelper$SingleChange.fireValueChangedEvent(ExpressionHelper.java:182)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:81)
at javafx.beans.property.StringPropertyBase.fireValueChangedEvent(StringPropertyBase.java:103)
at javafx.beans.property.StringPropertyBase.markInvalid(StringPropertyBase.java:110)
at javafx.beans.property.StringPropertyBase.set(StringPropertyBase.java:144)
at javafx.beans.property.StringPropertyBase.set(StringPropertyBase.java:49)
at javafx.beans.property.StringProperty.setValue(StringProperty.java:65)
at javafx.scene.control.Labeled.setText(Labeled.java:145)
at threads.FXMLDocumentController.run(FXMLDocumentController.java:40)
at java.lang.Thread.run(Thread.java:745)

Em JavaFX é recomentdavel usar Thread em conjunto do Task.

No entanto quando resolver usar da forma que voce fez, deve chamar a

Platform.runLater( () ->  {
        System.out.println("You clicked me!");  
        label.setText("Hello World!");
});

Porque uma coisa e´ a sua Thread e outra é a Thread da JavaFX.
JavaFX não é tão natural quanto programar em Swing.
Mas é assim que foi projetada.

Usando Task, Runnable fica dentro dele, então libera
implements Runnable do Controller

Já conversei com alguns projetistas do JavaFX e pode ter certeza, fizeram assim e não pretendem mudar.

Quando tiver que fazer qualquer alteração na Thread da JavaFX, estando fora dela, em uma outra Thread em processamento Paralelo ou Back é preciso usar Platform.runLater,

a vei adorei a tua explicação obrigado mesmo to tentando sair do swing q já não entendo tanto tenho 1 ano de estudos e passar para o FX definitivamente.