【问题标题】:Getting HTML input value in JavaFX WebView?在 JavaFX WebView 中获取 HTML 输入值?
【发布时间】:2014-10-14 10:05:58
【问题描述】:

是否可以在 JavaFX 的 WebView 中获取 HTML 输入的值?

如果是这样,我将如何使用事件来自动更新值?

示例应用:

package webviewinputvalue;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

public class WebviewInputValue extends Application {

    @Override
    public void start(Stage primaryStage) {

        WebView test = new WebView();
        WebEngine run = test.getEngine();
        run.loadContent("<textarea></textarea>");
        StackPane root = new StackPane();
        root.getChildren().add(test);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
      public static void main(String[] args) {
        launch(args);
    }

}

创建一个像这样的简单窗口:

问题:是否可以使用 JavaFX 获取 textarea 的值?如果是这样,我应该如何这样做?

【问题讨论】:

    标签: java html input javafx webview


    【解决方案1】:

    3 年后,但我希望它会帮助某人。我找到了如何在不更改 html 页面的情况下从 TextArea 获取文本

    Runnable check = () -> {            
        WebEngine engine = webView.getEngine();
        if (engine != null) {
            Document document = engine.getDocument();
            if (document != null) {
                Element element = document.getElementById("samlResponse");
                if (element instanceof HTMLTextAreaElement) {
                    HTMLTextAreaElement textArea = (HTMLTextAreaElement) element;
                    String text = textArea.getValue();
                    if (text != null && !text.isEmpty()) {
                        System.out.println("BINGO:\n" + text);
                        System.exit(0);
                    }
                }
            }
        }
    };
    
    new Thread(() -> {
        while (true) {
            Platform.runLater(check);
    
            try {
                Thread.sleep(1_000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }).start();
    

    【讨论】:

      【解决方案2】:

      TL;DR:是的,这是可能的,但它需要一些变通的解决方法。

      首先,我要将 HTML 移动到它自己的单独文件中,以使编辑更容易,并且通常只创建更简洁的代码。

      editor.html

      <!DOCTYPE html>
      <html>
          <head>
              <meta charset="UTF-8">
              <title>Example Live-view</title>
              <meta name="viewport" content="width=device-width, initial-scale=1.0">
          </head>
          <body>
              <textarea placeholder="Typing 'exit' will kill the program."></textarea>
              
              <script>
                  document.querySelector("textarea").addEventListener("keyup", function(){
                      
                      window.status = this.value;
                  });
              </script>
          </body>
      </html>
      

      基本结构真的很简单,但是&lt;script&gt;元素呢?它有什么作用?

      document.querySelector("textarea").addEventListener("keyup", function(){
           window.status = this.value;
      });
      

      AFAIK,在 JavaFX 中无法直接获取输入的值,因此您必须采取一种解决方法。在这种情况下,只要 textarea 中有 keyup 事件,我就会使用 textarea 值设置窗口状态。

      现在我们需要在 JavaFX 中设置 webview。

      WebviewInputValue.java

      package webviewinputvalue;
      
      public class WebviewInputValue extends Application {
          
          private WebView InitWebview(){
              
              //Create browser
              WebView browser = new WebView();
              WebEngine render = browser.getEngine();
              
              //Load simple HTML
              String editor = WebviewInputValue.class.getResource("editor.html").toExternalForm();
              render.load(editor);
              
              //Listen for state change
              render.getLoadWorker().stateProperty().addListener((ov, o, n) -> {
                  if (Worker.State.SUCCEEDED == n) {
                      render.setOnStatusChanged(webEvent -> {
                              
                          //Call value change
                          onValueChange(webEvent.getData());
                      });
                  }
              });
              
              return browser;
          }
          
          //called when value changes
          private void onValueChange(String data){
              
              //Print out data
              System.out.println(data);
              
              //If the data is equal to "exit", close the program
              if("exit".equals(data)){
                  
                  //Print goodbye message
                  System.out.println("Received exit command! Goodbye :D");
                  
                  //Exit
                  System.exit(0);
              }
          }
          
          @Override
          public void start(Stage primaryStage) {
              
              //Create browser
              WebView browser = InitWebview();
                      
              StackPane root = new StackPane();
              root.getChildren().add(browser);
      
              Scene scene = new Scene(root, 300, 250);
      
              primaryStage.setTitle("Hello World!");
              primaryStage.setScene(scene);
              primaryStage.show();
          }
      
          /**
           * @param args the command line arguments
           */
          public static void main(String[] args) {
              launch(args);
          }
      }
      

      再次,非常简单的代码。让我们深入研究一下:

      private WebView InitWebview(){
          
          //Create browser
          WebView browser = new WebView();
          WebEngine render = browser.getEngine();
          
          //Load simple HTML
          String editor = WebviewInputValue.class.getResource("editor.html").toExternalForm();
          render.load(editor);
          
          //Listen for state change
          render.getLoadWorker().stateProperty().addListener((ov, o, n) -> {
              if (Worker.State.SUCCEEDED == n) {
                  render.setOnStatusChanged(webEvent -> {
                          
                      //Call value change
                      onValueChange(webEvent.getData());
                  });
              }
          });
          
          return browser;
      }
      

      首先我们创建 webview 和引擎,然后将 editor.html 文件加载到 webview 中。接下来,我们获取 loadWorker,它控制着我们使用 JS 写入的 window.status 对象。然后我们得到state 属性,并添加一个监听器。如果监听器添加成功,则监听 change 事件。

      当发生变化事件时,我们会调用我们的onValueChange方法:

      //called when value changes
      private void onValueChange(String data){
          
          //Print out data
          System.out.println(data);
          
          //If the data is equal to "exit", close the program
          if("exit".equals(data)){
              
              //Print goodbye message
              System.out.println("Received exit command! Goodbye :D");
              
              //Exit
              System.exit(0);
          }
      }
      

      这非常简单。 onValueChange 使用 textarea 值作为 data 参数调用。在这种情况下,我将它打印到控制台。如果我在 textarea 中输入exit,那么它将打印一条再见消息并关闭应用程序。

      就是这样!如果你运行上面的代码,那么它会将 textarea 的值实时记录到控制台中!

      注意:

      如果您希望此代码直接运行,您的项目结构应该如下所示,编辑器与 java 文件位于同一目录中:

      另外,我显然错过了 java 代码中的导入。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-20
        • 2016-10-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多