Threads com JavaFX

Pessoal,

Estou desenvolvendo uma aplicação em javaFX e crio um stage por uma thread, o problema é que esta dando esta msg de erro :
“Not on FX application thread”

Alguem sabe como resolver isso ?

Obrigado.

Eu utilizava o framework AKKA pra gerenciar concorrência e threads, na “mão” não me lembro bem. O problema é que você está numa thread diferente da interface do JavaFX.
Sei que no Swing tem a Classe SwingWorker para resolver este problema. Tente pesquisar por algo parecido para o JavaFX.

Parece que a classe Task é utilizada para isto.

http://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm

Bom dia,

Olha, na verdade, seu problema é que está trabalhando na Thread da aplicação JavaFX pra alterar algum componente. Então, você deve utilizar dois passos:

1º) Trabalhe com a classe Task, como o amigo acima citou muito bem…
2º) Quando houver alterações de componentes, coloque-os, se dentro da Task/Thread, em uma outra Runnable, dessa forma:

Task<Void> exampleTask = new Task<Void>() { @Override protected Void call() throws Exception { // Demais códigos... Platform.runLater(new Runnable() { @Override public void run() { // Alteração de componentes } }); } }; new Thread(exampleTask).start();

Qualquer dúvida, é só dizer!

Até mais! :smiley:

1 curtida

Valkyrium,

Primeiramente, obrigado pela resposta.

Funcionou ±, ele até executa, mas não fica rodando como uma Thread, ele não esta liberando o acesso ao programa e as novas janelas criadas.

Mesmo colocando um sleep

[code]Task task = new Task() {
@Override protected Void call() throws Exception {
Platform.runLater(new Runnable() {
@Override
public void run() {
while(true){
if (running){
WindowsList.getWindowsList();
wi = WindowsList.inflList.get(0);
System.out.println(wi.title);

                        System.out.println("Hud Rodando1:"+ i++);
                        HudView hudview = new HudView(2628,312,"1231");
                        hudview.hudStage.show();
                    }
                    try {
                        Thread.sleep(5000);
                    } catch (InterruptedException interrupted) {
                        if (isCancelled()) {
                            updateMessage("Cancelled");
                            break;
                        }
                    }
                }
            }  
        });  
        return null;

[/code]

Olha, pode ser por dois motivos:

1º) O uso do Platform.runLater deve ser apenas para alteração de componentes, e pelo que percebo, não é o caso. Então, pode tirar o Platform.runLater.
2º) Quando utiliza o while(true), normalmente impede o usuário de fazer qualquer coisa, principalmente se esta lógica for extensa, ou seja, se demora ao acessar o comando break.

Tente uma solução para cada um destes casos. Se o primeiro caso já solucionar, ótimo!

1 curtida