JavaFX / Rechercher et mettre en surbrillance du texte / Ajouter une barre de recherche pour une page Web chargée


J'ai utilisé l'exemple SimpleSwingBrowser (http://docs.oracle.com/javafx/2/swing/SimpleSwingBrowser.java.htm) et j'ai ajouté mon propre code pour la queue de journal.

Je voulais y ajouter une capacité de barre de recherche (Rechercher et mettre en surbrillance du texte).

Après avoir googlé pendant des heures et des expériences personnelles, je n'ai pas trouvé de moyen de le faire. Quelqu'un peut-il me donner une direction de lancement pour écrire une telle capacité.

Author: SharonBL, 2013-10-17

1 answers

Suggestions pour une solution basée sur JavaScript

Utilisez une bibliothèque de surbrillance JavaScript existante telle que jQuery highlight ou hilitor.js .

Suggestions pour une solution basée sur Java

Utilisez l'API Java w3c DOM pour effectuer des opérations sur l'objet document WebEngine après le chargement du document.

Pour obtenir une API de recherche dans l'implémentation JavaFX WebView core

J'ai créé une demande de fonctionnalité RT-23383 Prise en charge de la recherche de texte pour WebView. La demande de fonctionnalité est actuellement ouverte et non activée - vous pouvez créer un compte dans le suivi des problèmes et voter pour ou commenter la demande de fonctionnalité.

Exemple de

Cet exemple utilise jQuery highlight. L'utilisateur tape le mot à mettre en surbrillance dans le champ de texte, puis appuie sur le bouton de surbrillance pour mettre en surbrillance toutes les occurrences du mot dans la page ou pour supprimer le bouton de surbrillance pour effacer tous les surbrillances marquées. Vous pourrait modifier l'exemple pour permettre à d'autres recherches basées sur jQuery de faire défiler vers un mot suivant et précédemment mis en évidence.

J'ai essayé de le faire fonctionner avec n'importe quelle page Web arbitraire, mais cette logique m'a vaincu. Si vous contrôlez la source de la page que vous souhaitez rechercher et que vous pouvez ajouter la référence au plugin jQuery highlight et à sa classe de style à votre page, quelque chose comme cet exemple de programme pourrait être une option.

sélectionner

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()");
    }

}
 4
Author: jewelsea, 2013-10-17 07:20:44