Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将JavaFXWebView的大小设置为文档正文所需的最小大小_Java_Javascript_Webview_Javafx - Fatal编程技术网

将JavaFXWebView的大小设置为文档正文所需的最小大小

将JavaFXWebView的大小设置为文档正文所需的最小大小,java,javascript,webview,javafx,Java,Javascript,Webview,Javafx,我正在用JavaFX为我的项目编写一个自定义对话框。我需要一个变体,但显示对话框内容的快速模式 我知道controlsFX;实际上我正在使用它,但我想在WebView中显示内容,这样它将更可控 问题是关于WebView的大小,我想找到文档主体的高度,并将WebView的大小设置为该高度 我尝试了下面的javascript攻击,但是在显示对话框之前,我得到了0的大小,而在显示对话框之后,值是不可靠的。有没有更好的解决方案,或者我应该忘记它,尝试嵌入一个支持HTML3的swing组件 Web

我正在用JavaFX为我的项目编写一个自定义对话框。我需要一个变体,但显示对话框内容的快速模式

我知道controlsFX;实际上我正在使用它,但我想在WebView中显示内容,这样它将更可控

问题是关于WebView的大小,我想找到文档主体的高度,并将WebView的大小设置为该高度

我尝试了下面的javascript攻击,但是在显示对话框之前,我得到了0的大小,而在显示对话框之后,值是不可靠的。有没有更好的解决方案,或者我应该忘记它,尝试嵌入一个支持HTML3的swing组件

    WebView vw = new WebView();
    vw.getEngine().loadContent("<p>This is my text</p><b>Another</b><p> This is a paragraph</p><ul><li>First cause</li><li>Second cause></li></ul>");
    vw.setPrefSize(500, 50);
    vw.setOnMouseClicked(new EventHandler<MouseEvent>() {

        @Override
        public void handle(MouseEvent event) {
            // I see that executeScript doesn't work correctly even when the WebView is loaded
            Integer h = (Integer) vw.getEngine().executeScript("document.body.offsetHeight");
            System.out.println("scriptRES: " + h );
            vw.setPrefSize(400, h);
            vw.setMinSize(400, h);
            vw.setMaxSize(400, h);
        }
    });
WebView vw=new WebView();
vw.getEngine().loadContent(这是我的文本

另一个这是一个段落

    第一个原因
  • 第二个原因
    • ”; vw.setPrefSize(500,50); setOnMouseClicked(新的EventHandler(){ @凌驾 公共无效句柄(MouseeEvent事件){ //我看到executeScript即使在加载WebView时也不能正常工作 整数h=(整数)vw.getEngine().executeScript(“document.body.offsetHeight”); System.out.println(“scriptRES:+h”); vw.setPrefSize(400,h); vw.setMinSize(400,h); vw.setMaxSize(400,h); } });
JavaFX问题跟踪器中的功能请求涵盖了WebView的自动大小调整支持:

功能请求当前尚未实施或计划实施。您可以投票支持或评论功能请求


据我所知,这里没有工作。早期版本的WebView似乎可以使用以下代码
engine.executeScript(“document.width”)
engine.executeScript(“document.height”)
。但是,上次我尝试这些命令时,它们不再有效。

这是一个很晚的答案

在计算高度之前,必须对文档应用ChangeListener。 请在以下网址找到您的问题的运行示例:


然而,根据我的经验,有时高还是大。

在实施自动首选大小调整之前,某个blogmeister已经提出了一个似乎可行的解决方案(目前)

可以在上找到它的原始形式

它使拥有首选大小
WebView
尽可能容易

WebViewFitContent webViewFitContent = new WebViewFitContent(html);
yourContainer.getChildren().add(webViewFitContent);


以防链接永远消失

WebViewFitContent.java
导入javafx.application.Platform;
导入javafx.beans.value.ChangeListener;
导入javafx.beans.value.observeValue;
导入javafx.collections.ListChangeListener;
导入javafx.concurrent.Worker.State;
导入javafx.geometry.HPos;
导入javafx.geometry.VPos;
导入javafx.scene.Node;
导入javafx.scene.layout.Region;
导入javafx.scene.web.WebEngine;
导入javafx.scene.web.WebView;
导入netscape.javascript.JSException;
导入java.util.Set;
公共最终类WebViewFitContent扩展区域{
最终WebView WebView=新WebView();
final-WebEngine-WebEngine=webview.getEngine();
公共WebViewFitContent(字符串内容){
webview.setPrefHeight(5);
widthProperty().addListener(新的ChangeListener()){
@凌驾
公共无效已更改(可观察值可观察、对象旧值、对象新值){
双宽度=(双)新值;
webview.setPrefWidth(宽度);
调整高度();
}
});
webview.getEngine().getLoadWorker().stateProperty().addListener(新的ChangeListener()){
@凌驾

更改公众假期(注意:这应该是一个评论,而不是一个答案。如果这是一个重复的问题,那么它本身就是这样和/或在你足够的时候留下评论。如果这个问题不是重复的,那么根据这个特定的问题定制答案。我有同样的问题,在这里找不到解决方案。后来我将我在这里找到的信息合并在一起通过其他问题的信息。我正在进一步了解,但出现了新问题。所以我问了我的新问题,我在这里链接了这个问题。所以我的问题的解决方案也应该在这里回答这个问题。更多细节可以在我提供的链接中找到。我不确定如何处理这个问题符合SE规则。哪个问题应该l关闭(原始副本或我的扩展副本,带有有效悬赏和工作解决方案)?我已经用JDK8u202测试过这段代码,但它似乎不起作用。@Maxoudela,奇怪。我几乎可以肯定我在那个JDK上使用过它。我可以确认,使用JDK8u211它可以像我现在使用它一样工作。这是我正在使用的代码。很抱歉延迟,谢谢你的代码。它似乎在一个简单的情况下起作用,但我尝试在TableView/Spreads中使用它heetView,然后它似乎不起作用。此外,我正在尝试使用相同的技术使它与宽度一起工作,但显然它根本不起作用。webview的内容丢失似乎是一个长期存在的错误…我根据FX支持合同重新打开它,试图修复它…我在这里问了一个类似的问题:。同时,在等待上游补丁的同时,努力解决问题。
import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.ListChangeListener;
import javafx.concurrent.Worker.State;
import javafx.geometry.HPos;
import javafx.geometry.VPos;
import javafx.scene.Node;
import javafx.scene.layout.Region;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import netscape.javascript.JSException;

import java.util.Set;

public final class WebViewFitContent extends Region {

    final WebView webview = new WebView();
    final WebEngine webEngine = webview.getEngine();

    public WebViewFitContent(String content) {
        webview.setPrefHeight(5);

        widthProperty().addListener(new ChangeListener<Object>() {
            @Override
            public void changed(ObservableValue<?> observable, Object oldValue, Object newValue) {
                Double width = (Double)newValue;
                webview.setPrefWidth(width);
                adjustHeight();
            }
        });

        webview.getEngine().getLoadWorker().stateProperty().addListener(new ChangeListener<State>() {
            @Override
            public void changed(ObservableValue<? extends State> arg0, State oldState, State newState)         {
                if (newState == State.SUCCEEDED) {
                    adjustHeight();
                }
            }
        });

        webview.getChildrenUnmodifiable().addListener(new ListChangeListener<Node>() {
            @Override
            public void onChanged(ListChangeListener.Change<? extends Node> change) {
                Set<Node> scrolls = webview.lookupAll(".scroll-bar");
                for (Node scroll : scrolls) {
                    scroll.setVisible(false);
                }
            }
        });

        setContent(content);
        getChildren().add(webview);
    }

    public void setContent(final String content) {
        Platform.runLater(new Runnable(){
            @Override
            public void run() {
                webEngine.loadContent(getHtml(content));
                Platform.runLater(new Runnable(){
                    @Override
                    public void run() {
                        adjustHeight();
                    }
                });
            }
        });
    }


    @Override
    protected void layoutChildren() {
        double w = getWidth();
        double h = getHeight();
        layoutInArea(webview,0,0,w,h,0, HPos.CENTER, VPos.CENTER);
    }

    private void adjustHeight() {
        Platform.runLater(new Runnable(){
            @Override
            public void run() {
                try {
                    Object result = webEngine.executeScript(
                            "var myDiv = document.getElementById('mydiv');" +
                                    "if (myDiv != null) myDiv.offsetHeight");
                    if (result instanceof Integer) {
                        Integer i = (Integer) result;
                        double height = new Double(i);
                        height = height + 20;
                        webview.setPrefHeight(height);
                    }
                } catch (JSException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    private String getHtml(String content) {
        return "<html><body>" +
                "<div id=\"mydiv\">" + content + "</div>" +
                "</body></html>";
    }

}