2014-07-20 66 views
4

我是JavaFX的新手。我已經成功地將一個網站加載到我的JavaFX應用程序中。我想從我的Java應用程序登錄到網站。 到目前爲止,我能夠將我的登錄值插入到相應的輸入框中,但我無法弄清楚如何單擊提交按鈕。有人能幫我嗎。 這是我到目前爲止。 enter image description here如何點擊網站上的按鈕加載到JavaFX Web引擎

這是我的控制器類。

public class Controller implements Initializable{ 


    @FXML 
    protected TextField usernameLogin; 
    @FXML 
    protected TextField passwordLogin; 
    @FXML 
    protected Button loginButton; 
    @FXML 
    protected WebView webviewBrowser; 
    @Override 
    public void initialize(URL location, ResourceBundle resources) { 

     final WebEngine engine = webviewBrowser.getEngine(); 
     engine.load("http://gmail.com"); 
     engine.setJavaScriptEnabled(true); 

     loginButton.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent event) { 


       String username = usernameLogin.getText().toString(); 
       String password = passwordLogin.getText().toString(); 

       engine.getDocument().getElementById("Email").setAttribute("Value", username); 
       engine.getDocument().getElementById("Passwd").setAttribute("Value", password); 

       //engine.getDocument().getElementById("submit"). ??submit code?? 

      } 
     }); 


    } 
} 

有人可以幫助我。我應該怎麼做才能提交? 謝謝。

回答

3

我在JavaFX的WebView組件中找到了一個使用html表單的鏈接:https://community.oracle.com/thread/2510161?start=0&tstart=0

以下示例將獲得對錶單的引用並提交它。

我無法真正讓gmail完全加載WebView組件的內部,因爲jfxwebkit.dll的錯誤。

import java.util.concurrent.atomic.AtomicBoolean; 

import javafx.application.Application; 
import javafx.beans.value.ChangeListener; 
import javafx.beans.value.ObservableValue; 
import javafx.concurrent.Worker; 
import javafx.scene.Scene; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.web.WebEngine; 
import javafx.scene.web.WebView; 
import javafx.stage.Stage; 
import org.w3c.dom.Element; 
import org.w3c.dom.html.HTMLFormElement; 

public class Main extends Application { 
    @Override 
    public void start(Stage stage) throws Exception { 
     stage.setTitle("JavaFX WebView Example"); 
     BorderPane borderPane = new BorderPane(); 
     WebView webviewBrowser = new WebView(); 
     borderPane.setCenter(webviewBrowser); 
     final WebEngine engine = webviewBrowser.getEngine(); 
     engine.load("http://gmail.com"); 
     engine.setJavaScriptEnabled(true); 
     final String username = "[email protected]"; 
     final String password = "password"; 
     final AtomicBoolean submitted = new AtomicBoolean(); 
     engine.getLoadWorker().stateProperty().addListener(
       new ChangeListener<Worker.State>() { 
        @Override 
        public void changed(ObservableValue<? extends Worker.State> ov, 
             Worker.State oldState, Worker.State newState) { 
         if (newState == Worker.State.SUCCEEDED) { 
          Element emailField = engine.getDocument().getElementById("Email"); 
          if (emailField != null) { 
           emailField.setAttribute("Value", username); 
          } 
          Element passwordField = engine.getDocument().getElementById("Passwd"); 
          if (emailField != null) { 
           passwordField.setAttribute("Value", password); 
          } 
          HTMLFormElement gaia_loginform = (HTMLFormElement) engine.getDocument().getElementById("gaia_loginform"); 
          if (gaia_loginform != null) { 
           if (!submitted.get()) { 
            submitted.set(true); 
            gaia_loginform.submit(); 
           } 
          } 
         } 
        } 
       } 
     ); 
     stage.setScene(new Scene(borderPane, 800, 600)); 
     stage.show(); 
    } 
} 
+1

感謝您的努力Tunabot。 –

+0

你有沒有經歷過某種「刷新」或多次加載頁面?我做的差不多,第二次提交後,代碼開始回到SCHEDULED,RUNNING,SUCCEDED ... – vault

+0

好吧,我發現設置一個元素或者提交一個表單會生成「change」事件。 – vault