繁体   English   中英

在JavaFX WebView中获取HTML输入值?

[英]Getting HTML input value in JavaFX WebView?

是否可以在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的值? 如果是这样,我应该怎么办呢?

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>

基本结构真的很简单,但是<script>元素呢? 它有什么作用?

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

首先,我们创建editor.html和引擎,然后将editor.html文件加载到editor.html 接下来,我们获取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);
    }
}

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

完成的项目

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

注意:

如果您希望此代码直接运行,您的项目结构应该看起来像这样,并在与Java文件相同的目录下使用编辑器:

结构体

另外,我显然缺少Java代码中的导入。

3年后,但我希望它能对某人有所帮助。 我发现了如何从TextArea获取文本而不更改html页面

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM