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.
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.
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!
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!