JavaScript в WebView в JavaFX с

Я новичок в Java и JavaFX, и мне просто интересно, может ли webview JavaFX запускать javascript сам по себе, кроме общения с кодом java. Могу ли я, например, запустить инструкцию javascript alert в webview при загрузке окна и фактически получить предупреждение в webview, как в обычном браузере. Я знаю, что я могу захватить это событие оповещения с помощью моего java-кода

webEngine.setOnAlert

но я действительно хочу, чтобы события javascript происходили в само окно webview, как и в обычном браузере.

причина, по которой я задаю этот простой вопрос, заключается в том, что я использую webview с textarea, где я хочу включить проверку орфографии. У меня есть JavaScript spell checker, который отлично работает в обычных браузерах, где я получаю красное подчеркивание, когда я печатаю что-то неправильно, но я хочу, чтобы он работал и в JavaFX webview.

Я благодарен за любую помощь я могу получить!

1 ответов


WebView JavaScript Пример Обработчика Обратного Вызова

вот пример кода для отображения диалога JavaFX на основе команды триггера JavaScript. Пример кода предназначен для обработчика подтверждения JavaScript, но код для обработчика предупреждений будет работать аналогично.

в образце скриншота желтая полоса слева отобразит метку JavaFX на основе результата диалога подтверждения, вызванного функцией JavaScript из WebView, который покрывает остальную часть экрана.

диалоговое окно подтверждения отображается в JavaFX поверх WebView, предотвращая взаимодействие с WebView во время отображения диалогового окна. Стиль диалога подтверждения-это всего лишь пример, он может быть стилизован любым способом с помощью css, и макет также может быть изменен в коде (или вы можете определить макет диалога в разметке FXML, если вы привилегированный.)

webviewconfirm

WebViewConfirm.java

import javafx.application.Application;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.event.*;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.effect.BoxBlur;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.scene.web.WebView;
import javafx.stage.*;
import javafx.util.Callback;

/**
 * Demonstrates a modal WebView confirm box in JavaFX.
 * Dialog is rendered upon a blurred background.
 * Dialog is translucent.
 * Requires JavaFX 2.2
 * To test, run the program, then click the "Try it" button in the Result textarea.
 */
public class WebViewConfirm extends Application {
  public static void main(String[] args) { launch(args); }
  @Override public void start(final Stage primaryStage) {
    // initialize the stage
    primaryStage.setTitle("Modal Confirm Example");
    final WebView webView = new WebView();
    webView.getEngine().load("http://www.w3schools.com/js/tryit.asp?filename=tryjs_confirm");

    // layout the stage - a vbox to show confirmation results and a webview to generate confirmations.
    final VBox confirmationResults = new VBox();
    confirmationResults.getStyleClass().add("confirmation-results");
    confirmationResults.setMinWidth(150);
    HBox layout = new HBox();
    layout.getChildren().addAll(confirmationResults, webView);
    primaryStage.setScene(new Scene(layout));
    primaryStage.show();
    primaryStage.getScene().getStylesheets().add(getClass().getResource("modal-dialog.css").toExternalForm());

    // show the confirmation dialog each time a new page is loaded and
    // record the confirmation result.
    webView.getEngine().setConfirmHandler(new Callback<String, Boolean>() {
      @Override public Boolean call(String msg) {
        Boolean confirmed = confirm(primaryStage, msg);
        confirmationResults.getChildren().add(new Label("Confirmed? " + confirmed));
        return confirmed;
      }
    });
  }

  private Boolean confirm(final Stage parent, String msg) {
    final BooleanProperty confirmationResult = new SimpleBooleanProperty();
    // initialize the confirmation dialog
    final Stage dialog = new Stage(StageStyle.TRANSPARENT);
    dialog.initOwner(parent);
    dialog.initModality(Modality.WINDOW_MODAL);
    dialog.setScene(
      new Scene(
        HBoxBuilder.create().styleClass("modal-dialog").children(
          LabelBuilder.create().text(msg).build(),
          ButtonBuilder.create().text("OK").defaultButton(true).onAction(new EventHandler<ActionEvent>() {
            @Override public void handle(ActionEvent actionEvent) {
              // take action and close the dialog.
              confirmationResult.set(true);
              parent.getScene().getRoot().setEffect(null);
              dialog.close();
            }
          }).build(),
          ButtonBuilder.create().text("Cancel").cancelButton(true).onAction(new EventHandler<ActionEvent>() {
            @Override public void handle(ActionEvent actionEvent) {
              // abort action and close the dialog.
              confirmationResult.set(false);
              parent.getScene().getRoot().setEffect(null);
              dialog.close();
            }
          }).build()
        ).build()
        , Color.TRANSPARENT
      )
    );

    // allow the dialog to be dragged around.
    final Node root = dialog.getScene().getRoot();
    final Delta dragDelta = new Delta();
    root.setOnMousePressed(new EventHandler<MouseEvent>() {
      @Override public void handle(MouseEvent mouseEvent) {
        // record a delta distance for the drag and drop operation.
        dragDelta.x = dialog.getX() - mouseEvent.getScreenX();
        dragDelta.y = dialog.getY() - mouseEvent.getScreenY();
      }
    });
    root.setOnMouseDragged(new EventHandler<MouseEvent>() {
      @Override public void handle(MouseEvent mouseEvent) {
        dialog.setX(mouseEvent.getScreenX() + dragDelta.x);
        dialog.setY(mouseEvent.getScreenY() + dragDelta.y);
      }
    });

    // style and show the dialog.
    dialog.getScene().getStylesheets().add(getClass().getResource("modal-dialog.css").toExternalForm());
    parent.getScene().getRoot().setEffect(new BoxBlur());
    dialog.showAndWait();

    return confirmationResult.get();
  }

  // records relative x and y co-ordinates.
  class Delta { double x, y; }
}

модальный диалог.в CSS

/**
 * modal-dialog.css
 * place in same directory as WebViewConfirm.java
 * ensure your build system copies the file to your build output directory
 */

.root {
  -fx-glass-color: rgba(95, 158, 160, 0.9);
}

.modal-dialog {
  -fx-padding: 20;
  -fx-spacing: 10;
  -fx-alignment: center;
  -fx-font-size: 20;
  -fx-background-color: linear-gradient(to bottom, derive(-fx-glass-color, 20%), -fx-glass-color);
  -fx-border-color: derive(-fx-glass-color, -20%);
  -fx-border-width: 5;
  -fx-background-insets: 12;
  -fx-border-insets: 10;
  -fx-border-radius: 6;
  -fx-background-radius: 6;
}

.modal-dialog:pressed {
  -fx-cursor: move;
}

.modal-dialog .button:pressed {
  -fx-cursor: default;
}

.confirmation-results {
  -fx-background-color: cornsilk;
  -fx-padding: 5;
}

возможный ответ на ваш вопрос

Ваш вопрос мне не совсем понятен, но я думаю, что если вы всплываете ControlsFX диалоговое окно, вы достигнете чего вы хотите. Вы можете использовать либо стандартный диалог (который функционирует как диалог предупреждения JavaScript Internet Explorer), либо легкий диалог (который функционирует как диалог предупреждения JavaScript Firefox) - см. страница функций ControlsFX для получения дополнительной информации.

ControlsFX основан на Java 8, но для JavaFX 2.2 существует множество тем на StackOverflow относительно отображения диалогов в JavaFX (например:как создать и показать общий диалог (ошибка, предупреждение, подтверждение) в JavaFX 2.0?). Пример кода выше-пример использования диалога в JavaFX 2.2

комментарии по дополнительным вопросам, поднятым в вашем вопросе

Если webview JavaFX может запускать javascript сам по себе, кроме связи, которую он имеет с кодом java

да WebView может обрабатывать JavaScript.

могу ли я, например, запустить инструкцию javascript alert в webview, когда окно загружается и фактически получает предупреждение в webview, как и в обычном браузер.

да, если вы настроили обработчик предупреждений для своего WebView, чтобы он функционировал как "обычный браузер", появится диалоговое окно при получении команды предупреждения JavaScript. Обратите внимание, что" обычные браузеры " не изменяют объектную модель документа веб - страницы на основе функции предупреждения JavaScript, вместо этого они открывают собственный диалог-диалог на самом деле не является частью веб-страницы.

Я действительно хочу, чтобы события javascript происходили в окне webview сама как бы в обычном браузере.

"нормальные" браузеры обрабатывают оповещения по-разному в зависимости от их модели пользовательского интерфейса. Например, в Firefox диалоговое окно предупреждения появится в окне текущей вкладки браузера, а в Internet Explorer диалоговое окно предупреждения появится над окном Internet Explorer. Обработчик предупреждений JavaFX достаточно гибок, что вы можете обрабатывать предупреждение в значительной степени, как хотите.