2012-06-26 62 views
3

我試圖刪除javafx webview中的滾動條。 搜索論壇上,建議是讓他們看不見如下:如何在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

最簡單的方法是爲場景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以覆蓋行爲。

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中加載的任何網頁的滾動條。

不幸的是,當頁面加載時,可能會有一個短暫的滾動條(如果網頁在其標記中指定了一個)。