Opa estou com um pequeno problema com o javaFX usando a parte do WebEngine, por definição pelo que vi tudo do javaFX deve acontecer dentro de uma Thread do javaFX, mas a execução que pretendo fazer devem esperar por algumas dessas tarefas executadas dentro do javaFX terminar.
Um exemplo é carregar uma pagina qualquer como o google nele tem um elemento com atributo name com valor “q” só que eu poder ultilizar esse atributo ele tem que ter sido carregado, a execução do método load do WebEngine não espera a pagina carregar, além desse exemplo tenho outro, quando executo os elemento da pagina eu só consigo pegar eles se eu executar o método getElement dentro da thread do javaFX, e por final a execução de um código javaScript ele só pode ocorre dentro da thread do javaFX e exatamente por causa disso eu faço a sicronização entre o javaFX e a minha aplicação.
Mas esse não é o problema realmente esse é a minha situação, o problema ocorre ao utilizar , o mais estranho é o fato dele executar perfeitamente, e sem mexer em nada, nem alterar nenhuma propriedade ele ao executar n funciona
vou anexar a classe que criei para usar fazer essa execução que deu errado
para executar o erro basta fazer assim ele vai abrir uma tela pequena para vc acompanhar a execução da pagina basta almentar
import java.util.prefs.Preferences;
import org.w3c.dom.Element;
import org.w3c.dom.html.HTMLInputElement;
import verfotos.funcionalidades.WebBrowse;
public class init {
public static void main(String[] args) throws Exception {
Class.forName("verfotos.funcionalidades.WebBrowse");
new Thread(new Runnable() {
@Override
public void run() {
Element[] element = WebBrowse.load("http://www.facebook.com", WebBrowse.by.id("email"), WebBrowse.by.id("pass"), WebBrowse.by.id("loginbutton"));
if (element[0] != null && element[1] != null && element[2] != null) {
HTMLInputElement inputEmail = (HTMLInputElement) element[0];
HTMLInputElement inputPass = (HTMLInputElement) element[1];
inputEmail.setValue("Email Do FaceBook");
inputPass.setValue("Senha do FaceBook");
HTMLInputElement button = (HTMLInputElement) element[2].getFirstChild();
button.click();
}
}
}).start();
WebBrowse.showFrame(true);
}
}
isso n vai ajudar, na minha classe eu já faço isso.
A questão de eu ter colocado dentro da thread e como eu disse antes eu sincronizo a thread do JavaFX com a thread normal pois algumas operações tem que esperar terminar.
Infelizmente não tenho nenhum código pronto aqui, nem de exemplo, porque trabalho muito pouco com JavaFX.
Mas pense o seguinte:
Você realmente não tem como esperar (e garantir) o loading da página no Swing, afinal está sendo executada via JavaFX em Thread própria.
Para isto você deve utilizar alguns artifícios, seja criativo.
Tente implantar um Listenner no Load Worker do WebEngine (engine.getLoadWorker().progressProperty().addListener…).
Um ChangeListener<Number>() deve ser suficiente para resolver seu problema de ‘carregamento’.
Assim que esse listenner chegar a 1 (ou 100%), por exemplo, você deve comunicar sua aplicação Swing que a página está carregada e que ela pode parar de esperar.
Mas tome cuidado para não ficar esperando eternamente, faça sua aplicação Swing se preparar para controlar o tempo de espera.
Fiz um esboço aqui, veja se ajude.
ChangeListener handler = new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
if (newValue.intValue() == 1) {
// Faça alguma coisa para indicar que terminou.
} else {
System.out.println("Aguarde enquanto a Página é Carregada [" + (new DecimalFormat("0.00")).format(newValue.doubleValue() * 100) + "%].");
}
}
};
engine.getLoadWorker().progressProperty().addListener(handler);