4

我正在尝试删除 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 代码包围。

谢谢!小号

4

5 回答 5

5

我编写了您所指的滚动条隐藏代码并将其发布到论坛

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

我从未尝试从 Scala 访问代码,因此您可能遇到了一些 Java<->Scala 互操作性问题。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 控件开源之前,这可能会很困难。

于 2012-06-27T00:47:51.883 回答
0

最简单的方法是在场景 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 子类化以覆盖行为。

于 2012-06-29T15:16:03.063 回答
0

设置 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 中加载的任何网页的滚动条。

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

于 2014-10-06T12:29:15.630 回答
0

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

body {
   overflow-x: hidden;
   overflow-y: hidden;
}
于 2018-05-15T06:45:37.843 回答
0

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

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

然后在 Webview :

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

就这样。

于 2021-06-29T22:03:44.810 回答