2012-06-26 5 views
3

Я пытаюсь удалить полосы прокрутки в веб-обозревателе javafx. Поиск на форумах, предложение, чтобы сделать их невидимыми следующим образом:Как скрыть полосы прокрутки в 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

ответ

3

Я написал код скрытой прокрутки, на который вы ссылаетесь, и posted it to a forum.

Я попробовал его снова, используя 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 не с открытым исходным кодом.

0

Простейший способ сделать это - предоставить NoOp Skin для компонентов .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)); 
    } 
} 

EDIT: этот пример не появляется на работу в WebView из гипса на ком .sun.javafx.scene.control.skin.ScrollBarSkin. Решение не лучше, чем предыдущая проверка изменений узла, нужно подклассировать ScrollBarSkin для переопределения поведения.

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.

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

Смежные вопросы