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;
}
首先我们创建 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 代码中的导入。