我正在尝试删除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);
}
}
})
但是,我收到以下错误:
“trait ListChangeListener是抽象的;无法实例化”
我能理解为什么它会失败,但又一次,为什么人们使用这些代码会成功?我正在使用Eclipse,代码被Scala代码包围。
谢谢! 小号
答案 0 :(得分:3)
我编写了您引用的滚动条隐藏代码和posted it to a forum。
我再次尝试使用WinXPsp3,JavaFX 2.2b13,JDK7u6b14ea,它仍适用于我。
我从未尝试过从Scala访问代码,因此您可能遇到了一些Java&lt; - &gt; 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控件开源之前可能很难。
答案 1 :(得分:0)
最简单的方法是在场景CSS文件中为.scroll-bar组件提供NoOp Skin。
因此,在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));
}
}
编辑:由于对com.sun.javafx.scene.control.skin.ScrollBarSkin的强制转换,此示例似乎不适用于WebView。解决方案并不比先前检查节点更改更好,必须将ScrollBarSkin子类化为覆盖行为。
答案 2 :(得分: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中加载的任何网页的滚动条。
不幸的是,当页面加载时,可能会有短暂的滚动条(如果网页在其标记中指定了一个)。
答案 3 :(得分:0)
我可以通过添加以下内容来删除滚动条 css阻止我的全局html样式表
body {
overflow-x: hidden;
overflow-y: hidden;
}
答案 4 :(得分:0)
在 JavaFx 中将 newCascadeStyleSheet.css 放在资源文件夹中:
body {
overflow-x: hidden;
overflow-y: hidden;
}
然后在 Webview 中:
webView.getEngine().setUserStyleSheetLocation(getClass().getResource("/newCascadeStyleSheet.css").toExternalForm());
仅此而已。