2012-05-21 2 views
2

Попытка сделать requestFocus() в WebView не работает до тех пор, пока пользователь не нажмет на элемент управления.Webview с contenteditable не может сфокусироваться программно

Я знаю, что это должно быть возможно, поскольку htmlEditor может быть сфокусирован таким образом (и я подозреваю, что он основан на контентном WebView).

Я кодирую свой собственный специализированный htmlEditor, используя webview с «contenteditable», и мне очень хотелось бы сфокусировать его, как я могу сделать со стандартным htmlEditor.

Я считаю, что это должно быть проблемой с Javafx, и я уже представил его Джире, но мне интересно, может ли кто-нибудь подумать об этом.

UPDATE: Номер выпуска в JIRA: RT-21695

Короткий код demostration:

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

}

+1

A dd также номер/ссылка проблемы Jira. –

+0

Я не могу воспроизвести проблему, о которой вы говорите, можете ли вы добавить короткий, компилируемый пример, который демонстрирует проблему. – jewelsea

+0

Добавлено, как вы можете видеть, я использовал кнопку для установки фокуса, но вы можете попытаться сделать это любым другим способом, это не сработает, пока редактор не будет нажат вручную ... тогда это сработает. – betaman

ответ

4

requestFocus апи просто запрос фокуса, это не гарантирует фокус.

Иногда внутренняя реализация других элементов управления элементами управления JavaFX запрашивает фокус до или после того, как вы запросили фокус, который заканчивается в вашем запросе запроса Focus, не имеющего никакого эффекта.

Часто вы можете сделать вызов requestFocus вступает в силу либо обернув его в Platform.runLater или с использованием Timeline с KeyFrame которая вызывает requestFocus после задержки.

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

Update

Конкретный вопрос в примере кода в этом вопросе было то, что, несмотря на то WebView был сфокусирован, редактируемые содержание элемента в WebView был не сфокусирован.

Я попытался загрузить только html из кода кода <html><head></head><body contenteditable='true'></body></html> в firefox, и он вел себя точно так же, как JavaFX WebView (т. Е. Элемент редактируемого контента не был сфокусирован до тех пор, пока он не был нажат). Поэтому я не считаю, что это проблема с WebView.

Чтобы получить редактируемый элемент сфокусирован, необходимо выполнить некоторые сценарии, когда вы хотите его внимание, например, в яваскрипте OnLoad крючке <body onLoad='document.body.focus();' contenteditable='true'/>

Вот исполняемый пример приложение, которое демонстрирует программное управление фокусом поведения contenteditable элементы в JavaFX WebView:

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

Должен быть способ сфокусировать объект программно. Я попробовал Platform.runLater, Timer и даже попробовал кнопку, чтобы убедиться, что это не имеет никакого отношения к времени. Ничего не работает, но после того, как вы даете фокус щелчком ... он действительно фокусируется на requestFocus. – betaman

+0

Возможно, если вы добавите слушателя к свойству документа веб-сайта и, как только документ будет загружен либо requestFocus в java, либо запустите исполняемый файл на веб-сайте, чтобы [сфокусировать с помощью javascript] (http://www.w3schools.com /jsref/met_html_focus.asp) – jewelsea

+0

Да, я попробовал слушателя и ничего. Но я не пробовал это из javascript ... позвольте мне попробовать быстро ... – betaman

2

вы можете Сфокусируйте WebView из HTMLEditor на этот путь:

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 view = (WebView) ((GridPane)((HTMLEditorSkin)editor.getSkin()).getChildren().get(0)).getChildren().get(2); 

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

} 
+0

Не работает, ничего не происходит – ScriptKiddy

+0

Я обновил с помощью полный рабочий пример. Я использую это на Mac/Linux/Win – Fred

+0

Okey, я попробую его позже или завтра независимо :) Спасибо – ScriptKiddy

Смежные вопросы