【问题标题】:How to hide scrollbars in the JavaFX WebView如何在 JavaFX WebView 中隐藏滚动条
【发布时间】:2012-06-27 17:56:52
【问题描述】:

我正在尝试删除 javafx webview 中的滚动条。 在论坛上搜索,建议隐藏如下:

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

但是,我收到以下错误:

“特征 ListChangeListener 是抽象的;不能被实例化”

我可以理解为什么它会失败,但话又说回来,为什么人们成功使用此代码?我正在使用 Eclipse,代码被 Scala 代码包围。

谢谢! S

【问题讨论】:

    标签: scala webview hide javafx scrollbars


    【解决方案1】:

    我写了你提到的滚动条隐藏代码和posted it to a forum

    我使用 WinXPsp3、JavaFX 2.2b13、JDK7u6b14ea 再次尝试,它仍然对我有用。

    我从未尝试从 Scala 访问代码,因此您可能遇到了一些 JavaScala 互操作性问题。 Java 没有特征,因此您收到的错误将与 Scala 相关。我在你的问题中添加了一个 Scala 标签,所以也许有 Scala 专业知识的人可以提供帮助。

    这是一个简短的、可编译的测试应用程序,我用来重新检查功能。

    import java.util.Set;
    import javafx.application.Application;
    import javafx.collections.ListChangeListener;
    import javafx.collections.ListChangeListener.Change;
    import javafx.scene.*;
    import javafx.scene.web.WebView;
    import javafx.stage.Stage;
    
    // demos showing a webview which does not visibly display scrollbars.
    public class NoScrollWebView extends Application {
      public static void main(String[] args) { launch(args); }
      @Override public void start(Stage primaryStage) {
        // show a doc in webview.
        final WebView webView = new WebView();
        webView.getEngine().load("http://docs.oracle.com/javafx/2/get_started/jfxpub-get_started.htm");
        primaryStage.setScene(new Scene(webView));
        primaryStage.show();
    
        // hide webview scrollbars whenever they appear.
        webView.getChildrenUnmodifiable().addListener(new ListChangeListener<Node>() {
          @Override public void onChanged(Change<? extends Node> change) {
            Set<Node> deadSeaScrolls = webView.lookupAll(".scroll-bar");
            for (Node scroll : deadSeaScrolls) {
              scroll.setVisible(false);
            }
          }
        });
      }
    }
    

    这里最好的解决方案可能是提供一个新的 WebView 控件外观,其中没有任何控件 - 但在 WebView 控件开源之前,这可能会很困难。

    【讨论】:

      【解决方案2】:

      最简单的方法是在场景 CSS 文件中为 .scroll-bar 组件提供 NoOp 皮肤。

      所以,在 CSS 中输入如下内容:

      .scroll-bar {
          -fx-skin: "org.acme.visual.NoOpScrollbarSkin";
      }
      

      和子类 SkinBase 类:

      public class NoOpScrollbarSkin extends SkinBase<ScrollBar,ScrollBarBehavior> {
          public NoOpScrollbarSkin(ScrollBar scrollBar, ScrollBarBehavior scrollBarBehavior) {
              super(scrollBar, scrollBarBehavior);
          }
      
          public NoOpScrollbarSkin(ScrollBar scrollBar) {
              super(scrollBar, new ScrollBarBehavior(scrollBar));
          }
      }
      

      编辑:此示例似乎不适用于 WebView,因为它转换为 com.sun.javafx.scene.control.skin.ScrollBarSkin。解决方案并不比以前检查节点更改更好,必须将 ScrollBarSkin 子类化以覆盖行为。

      【讨论】:

        【解决方案3】:

        在设置 WebView 时添加以下代码:

        engine.getLoadWorker().stateProperty().addListener(new ChangeListener<State>()
        {
        
            public void changed(ObservableValue<? extends State> o, State old, final State state)
            {
                if (state == State.RUNNING || state == State.SUCCEEDED)
                {
                    // System.out.println("Page: " + state + ": " + engine.getLocation());
                    engine.executeScript("document.body.style.overflow = 'hidden';");
                }
            }
        
        });
        

        此代码将删除 WebView 中加载的任何网页的滚动条。

        不幸的是,在页面加载过程中,可能会有一小段时间出现滚动条(如果网页在其标记中指定了滚动条)。

        【讨论】:

          【解决方案4】:

          我可以通过添加以下内容来删除滚动条 css 块到我的全局 html 样式表

          body {
             overflow-x: hidden;
             overflow-y: hidden;
          }
          

          【讨论】:

            【解决方案5】:

            在 JavaFx 中将 newCascadeStyleSheet.css 放入资源文件夹:

            body {
                overflow-x: hidden;
                overflow-y: hidden;
            }
            

            然后在 Webview 中:

            webView.getEngine().setUserStyleSheetLocation(getClass().getResource("/newCascadeStyleSheet.css").toExternalForm());
            

            就是这样。

            【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-10-28
            • 1970-01-01
            • 2012-12-21
            • 1970-01-01
            • 1970-01-01
            • 2012-09-22
            相关资源
            最近更新 更多