JavaFX WebView : Start Program, 输入数据、服务并显示本地 HTML -> 刷新数据 = 刷新 WebView

标签 java html javafx webview

我需要能够打开我的应用程序,通过 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/

相关文章:

java - listView 中的加载栏

html - 在R中将字符转换为html

JavaFX WebView 无法加载某些网站

javascript - 非滚动 png 图像作为标题

html - 如何打断一个长字符串并使其在下一行继续?

java - 如何在任何 Pane 中定位 JavaFX 形状?

java - 使用观察者模式保持 TableView 更新

java - 在 Java 的子类中实现抽象方法

java.lang.VerifyError : Verifier rejected class - failed to verify

java - Java中如何将原图resize为普通图片大小?