2

SimpleSwingBrowser の例 ( http://docs.oracle.com/javafx/2/swing/SimpleSwingBrowser.java.htm ) を使用し、ログ テーリング用に独自のコードをいくつか追加しました。

それに検索バー機能を追加したかった (検索とハイライト テキスト)。

何時間もグーグルで自分で実験した後、私はそれを行う方法を見つけられませんでした. 誰かがそのような能力を書くためのキックオフの指示をくれませんか.

4

1 に答える 1

5

JavaScript ベースのソリューションに関する提案

jQuery ハイライトhilitor.jsなどの既存の JavaScript ハイライト ライブラリを使用します。

Java ベースのソリューションに関する提案

ドキュメントがロードされた後、Java w3c DOM API を使用して、WebEngine ドキュメント オブジェクトで操作を実行します。

JavaFX WebView コア実装で検索 API を取得するには

機能リクエストRT-23383 Text search support for WebViewを作成しました。機能リクエストは現在オープンで、アクションはありません。Issue Tracker でアカウントを作成し、機能リクエストに投票またはコメントすることができます。

サンプル

このサンプルでは、​​jQuery ハイライトを使用しています。ユーザーは強調表示する単語をテキスト フィールドに入力し、強調表示ボタンを押して、ページ内の単語のすべての出現箇所を強調表示するか、強調表示ボタンを削除して、マークされたすべての強調表示をクリアします。サンプルを変更して、さらに jQuery ベースの検索で次の以前に強調表示された単語にスクロールできるようにすることができます。

任意の Web ページで動作するようにしようとしましたが、そのロジックではうまくいきませんでした。検索するページのソースを制御し、jQuery ハイライト プラグインへの参照とそのスタイル クラスをページに追加できる場合は、このサンプル プログラムのようなものがオプションになる可能性があります。

ハイライト

import javafx.application.Application;
import javafx.event.*;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.scene.web.*;
import javafx.stage.Stage;

public class WebViewSearch extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        final WebView webView = new WebView();
        final WebEngine engine = webView.getEngine();
        engine.load("http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html");

        final TextField searchField = new TextField("light");
        searchField.setPromptText("Enter the text you would like to highlight and press ENTER to highlight");
        searchField.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent actionEvent) {
                if (engine.getDocument() != null) {
                    highlight(
                            engine,
                            searchField.getText()
                    );
                }
            }
        });

        final Button highlightButton = new Button("Highlight");
        highlightButton.setDefaultButton(true);
        highlightButton.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent actionEvent) {
                searchField.fireEvent(new ActionEvent());
            }
        });
        final Button removeHighlightButton = new Button("Remove Highlight");
        removeHighlightButton.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent actionEvent) {
                removeHighlight(
                        engine
                );

            }
        });
        removeHighlightButton.setCancelButton(true);

        HBox controls = new HBox(10);
        controls.getChildren().setAll(
                highlightButton,
                removeHighlightButton
        );

        VBox layout = new VBox(10);
        layout.getChildren().setAll(searchField, controls, webView);
        searchField.setMinHeight(Control.USE_PREF_SIZE);
        controls.setMinHeight(Control.USE_PREF_SIZE);

        controls.disableProperty().bind(webView.getEngine().getLoadWorker().runningProperty());
        searchField.disableProperty().bind(webView.getEngine().getLoadWorker().runningProperty());

        primaryStage.setScene(new Scene(layout));
        primaryStage.show();

        webView.requestFocus();
    }

    private void highlight(WebEngine engine, String text) {
        engine.executeScript("$('body').removeHighlight().highlight('" + text + "')");
    }

    private void removeHighlight(WebEngine engine) {
        engine.executeScript("$('body').removeHighlight()");
    }

}
于 2013-10-17T07:20:44.510 に答える