Вопрос по scrollbars, scala, webview, hide, javafx – Как скрыть полосы прокрутки в JavaFX WebView

3

Я пытаюсь удалить полосы прокрутки в веб-представлении 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);
        }
    }
})

Однако я получаю следующую ошибку:

& quot; черта ListChangeListener является абстрактной; не может быть создан & quot;

Я могу понять, почему он терпит неудачу, но опять же, почему люди успешно используют этот код? Я использую Eclipse, и код окружен кодом Scala.

Спасибо! S

Ваш Ответ

4   ответа
3

Я написал код скрытия полосы прокрутки, на который вы ссылаетесь, иопубликовал это на форуме.

Я попробовал это снова, используя WinXPsp3, JavaFX 2.2b13, JDK7u6b14ea, и он все еще работает для меня.

Я никогда не пытался получить доступ к коду из Scala, поэтому вы, возможно, столкнулись с проблемой совместимости Java в & lt; -> gala; У 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 не будет открыт.

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.

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

0

Самый простой способ сделать это - предоставить обложку 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.

0

Я смог удалить полосы прокрутки, добавив следующее Блок CSS для моей глобальной таблицы стилей HTML

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

Похожие вопросы