2

WebViewでrequestFocus()を実行しようとすると、ユーザーが最初にコントロールをクリックするまで機能しません。

htmlEditorはこのように焦点を合わせることができるので、これが可能でなければならないことを私は知っています(そして、それはcontenteditable WebViewに基づいていると思います)。

私は「contenteditable」のWebビューを使用して独自の特殊なhtmlEditorをコーディングしていますが、標準のhtmlEditorと同じように焦点を合わせたいと思っています。

これはJavafxの問題であると考えており、すでにJiraに提出していますが、この回避策を誰かが考えられるかどうか疑問に思います。

更新:jiraの発行番号:RT-21695

短いデモストレーションコード:

/* Demo webview */

public class WebViewConteneditableDemo extends Application {


String initialEditview = "<html><head>"
        + "</head><body contenteditable='true'>"
        +"</body></html>";

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    launch(args);
}

@Override
public void start(Stage primaryStage) {
    primaryStage.setTitle("Webview focus demo");


    final WebView editor = new WebView();

    Button btn = new Button();
    btn.setText("Test Webview focus");
    btn.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent event) {
           editor.requestFocus();
        }
    });

    BorderPane root = new BorderPane();
    root.setTop(btn);

    root.setCenter(editor);
    editor.getEngine().loadContent(initialEditview);

    primaryStage.setScene(new Scene(root, 500, 450));
    primaryStage.show();
}

}

4

2 に答える 2

4

requestFocus apiはフォーカスのリクエストであり、フォーカスを保証するものではありません。

他のJavaFXコントロールの内部実装は、フォーカスを要求する前または後にフォーカスを要求し、その結果、requestFocus呼び出しが効果を発揮しない場合があります。

多くの場合、requestFocus呼び出しを有効にするには、Platform.runLaterでラップするか、遅延後にrequestFocusを呼び出すKeyFrameでタイムラインを使用します。

これらのいずれも機能しない場合は、WebViewのrequestFocus処理にバグがある可能性があります。これは、JavaFXチームが提出したjiraのコンテキストで対処できます。

アップデート

質問のサンプルコードの特定の問題は、WebViewがフォーカスされていても、WebViewの編集可能なコンテンツ要素がフォーカスされていないことでした。

サンプルコード<html><head></head><body contenteditable='true'></body></html>からFirefoxにhtmlだけをロードしようとしましたが、JavaFX WebViewとまったく同じように動作しました(つまり、編集可能なコンテンツ要素はクリックされるまでフォーカスされませんでした)。したがって、これがWebViewの問題であるとは思わない。

編集可能な要素をフォーカスするには、JavaScriptのonloadフックなど、フォーカスしたいときにスクリプトを実行する必要があります。<body onLoad='document.body.focus();' contenteditable='true'/>

これは、JavaFXWebViewのコンテンツ編集可能要素のフォーカス動作のプログラムによる制御を示す実行可能なサンプルアプリケーションです。

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.event.*;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

public class WebViewEditable extends Application {
  String content = "<body bgcolor='cornsilk' onLoad='document.body.focus();' contenteditable='true'/>";
  public static void main(String[] args) { launch(args); }
  @Override public void start(Stage stage) {
    final WebView editor = new WebView();
    editor.getEngine().loadContent(content);

    Button webviewFocusButton = new Button("Focus on WebView");
    webviewFocusButton.setOnAction(new EventHandler<ActionEvent>() {
      @Override public void handle(ActionEvent event) {
        editor.getEngine().executeScript("document.body.focus()");
        editor.requestFocus();
      }
    });
    Button selfFocusButton = new Button("Focus on this Button");

    Label focusLabel = new Label();
    focusLabel.textProperty().bind(Bindings
      .when(editor.focusedProperty())
        .then("WebView has the focus.")
        .otherwise("WebView does not have the focus.")
    );
    focusLabel.setMaxWidth(Double.MAX_VALUE);
    focusLabel.setStyle("-fx-background-color: coral; -fx-padding: 5;");

    BorderPane layout = new BorderPane();
    layout.setTop(HBoxBuilder.create().spacing(10).children(webviewFocusButton, selfFocusButton).style("-fx-padding: 10; -fx-background-color: palegreen").build());
    layout.setCenter(editor);
    layout.setBottom(focusLabel);
    stage.setScene(new Scene(layout));
    stage.show();
  }
}
于 2012-05-21T16:44:00.493 に答える
3

この方法で、HTMLEditorのWebビューに焦点を合わせることができます。

import com.sun.javafx.scene.web.skin.HTMLEditorSkin;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.GridPane;
import javafx.scene.web.HTMLEditor;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

public class FocusTest extends Application {

    public static void main(final String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        final HTMLEditor editor = new HTMLEditor();
        final WebView editorView = (WebView) editor.lookup(".web-view");

        primaryStage.setScene(new Scene(editor));
        primaryStage.sizeToScene();
        primaryStage.show();

        Platform.runLater(() -> {
            view.fireEvent(new MouseEvent(MouseEvent.MOUSE_PRESSED, 100, 100, 200, 200, MouseButton.PRIMARY, 1, false, false, false, false, false, false, false, false, false, false, null));
            editor.requestFocus();
            view.fireEvent(new MouseEvent(MouseEvent.MOUSE_RELEASED, 100, 100, 200, 200, MouseButton.PRIMARY, 1, false, false, false, false, false, false, false, false, false, false, null));
        });
    }

}
于 2015-07-21T22:20:01.833 に答える