我需要能够打开我的应用程序,通过 TextFields 输入数据,通过 FreeMarker 发送所述数据并生成 HTML,然后在 WebView 中显示。
这就是我跌倒的地方。
我已经完成了所有工作,但是我一生都无法弄清楚如何在数据输入和重写后刷新 WebView 以显示新的当前 HTML 文档。
它会很好地覆盖文件,如果我关闭并重新打开,然后重新单击我的按钮,WebView 现在会显示新数据。
我确信问题是我正在使用 getClass().getResource(String):
URL link = getClass().getResource("EmailSigTest.html");
engine = webView.getEngine();
engine.load(link.toString());
我怎样才能让这个东西动态改变,即:
1. Input data
2. Write File
3. Refresh WebView to reflect new html doc
我需要在哪里写入和读取文件才能实现此目的?
我尝试过engine.reload();重新加载 WebEngine...什么都没有。
我尝试添加 ActionEvent 和 .reload()...什么也没有。
完整来源如下:
public class SignatureGenFXMLDocController implements Initializable {
private String firstName, lastName, directLine, title, cellPhone, lineOne, lineTwo;
boolean social = false;
@FXML private TextField txtFirstName, txtLastName, txtDirectLine, txtTitle, txtCellPhone;
@FXML private CheckBox chkSocialIcons;
@FXML Button btnGenerate;
@FXML WebView webView;
@FXML WebEngine engine;
@FXML private void handleButtonAction(ActionEvent event) throws InterruptedException {
System.out.println("You clicked me!");
firstName = txtFirstName.getText();
lastName = txtLastName.getText();
directLine = txtDirectLine.getText();
title = txtTitle.getText();
cellPhone = txtCellPhone.getText();
writeHtml();
readHtml();
}
@Override
public void initialize(URL url, ResourceBundle rb) {
}
private void writeHtml(){
// Configurae Freemarker
Configuration cfg = new Configuration();
try {
// Load the template
Template template = cfg.getTemplate("src/signaturegen/template.ftl");
Map<String, Object> data = new HashMap<String, Object>();
data.put("fName", firstName);
data.put("lName", lastName);
data.put("title", title);
data.put("dLine", directLine);
data.put("social", social);
Writer console = new OutputStreamWriter(System.out);
template.process(data, console);
console.flush();
// File output
Writer file = new FileWriter (new File("build/classes/signaturegen/EmailSigTest.html"));
template.process(data, file);
file.flush();
file.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
}
}
private void readHtml(){
URL link = getClass().getResource("EmailSigTest.html");
engine = webView.getEngine();
engine.load(link.toString());
}
}
最佳答案
如 this question 中所述,在 WebView
中重新加载相同的 URL 不起作用。
您可能想要尝试的是将重新加载委托(delegate)给页面本身的 JavaScript。为此,您在页面中定义一个函数:
function reloadMe() {
location.reload();
}
并从 Java 调用此函数:
private void readHtml(){
URL link = getClass().getResource("EmailSigTest.html");
engine = webView.getEngine();
engine.executeScript("reloadMe();");
}
进一步阅读:
关于JavaFX WebView : Start Program, 输入数据、服务并显示本地 HTML -> 刷新数据 = 刷新 WebView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34821255/