Threads com JavaFX

5 respostas
S

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.

5 Respostas

fredericomaia10

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.

fredericomaia10

Parece que a classe Task é utilizada para isto.

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

Valkyrium

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:

S

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

Task<Void> task = new Task<Void>() {
        @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;
Valkyrium

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!

Criado 7 de agosto de 2013
Ultima resposta 9 de ago. de 2013
Respostas 5
Participantes 3