Как скрыть полосы прокрутки в JavaFX WebView

Я пытаюсь удалить полосы прокрутки в веб-просмотре javafx. Поиск на форумах, предложение сделать их невидимыми следующим образом:

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.

Спасибо! С


person user1482640    schedule 26.06.2012    source источник


Ответы (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 не станет открытым исходным кодом.

person jewelsea    schedule 27.06.2012

Самый простой способ сделать это — предоставить скин NoOp для компонентов .scroll-bar в файле CSS вашей сцены.

Итак, в 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, чтобы переопределить поведение.

person Dan Vulpe    schedule 29.06.2012

При настройке 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.

К сожалению, во время загрузки страницы на короткое время может появиться полоса прокрутки (если веб-страница указала ее в своей разметке).

person Frederic Leitenberger    schedule 06.10.2014

Мне удалось удалить полосы прокрутки, добавив следующий блок css в мою глобальную таблицу стилей html.

body {
   overflow-x: hidden;
   overflow-y: hidden;
}
person Eric C.    schedule 15.05.2018

В JavaFx поместите newCascadeStyleSheet.css в папку ресурсов:

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

И затем в веб-просмотре:

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

Это все.

person Noor Hossain    schedule 29.06.2021