[英]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的值? 如果是这样,我应该怎么办呢?
首先,我将把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。
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.