4

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

4

5 に答える 5

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 コントロールがオープン ソース化されるまでは難しいでしょう。

于 2012-06-27T00:47:51.883 に答える
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));
    }
}

編集:com.sun.javafx.scene.control.skin.ScrollBarSkinにキャストされているため、この例はWebViewでは機能しないようです。解決策は、ノードの変更を以前にチェックするよりも優れているわけではありません。動作をオーバーライドするには、ScrollBarSkinをサブクラス化する必要があります。

于 2012-06-29T15:16:03.063 に答える
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 に読み込まれた Web ページのスクロールバーを削除します。

残念ながら、ページの読み込み中、短い間スクロールバーが表示されることがあります (Web ページのマークアップでスクロールバーが指定されている場合)。

于 2014-10-06T12:29:15.630 に答える