JavaFX WebEngine && WebView

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);
    }
}

Boa noite,

Bom, se houve alterações na parte da UI, então invés de utilizar uma nova Thread dessa forma, trabalhe com o Platform.runLater(Runnable r).

[code]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");  
Platform.runLater(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();  
    }  
    }  
});  
WebBrowse.showFrame(true);  
}  

}[/code]

Veja se isto ajuda.

Abraços!

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&lt;Number&gt;() { @Override public void changed(ObservableValue&lt;? extends Number&gt; observable, Number oldValue, Number newValue) { if (newValue.intValue() == 1) { // Faça alguma coisa para indicar que terminou. } else { System.out.println(&quot;Aguarde enquanto a Página é Carregada [&quot; + (new DecimalFormat(&quot;0.00&quot;)).format(newValue.doubleValue() * 100) + &quot;%].&quot;); } } }; engine.getLoadWorker().progressProperty().addListener(handler);