JavaFX отменит выделение текста при открытии нового TextInputDialog

#java #javafx

Вопрос:

Я думал, что нашел ответ, deselect() но, как ни странно, он ничего не дает, текст все еще полностью выбран при открытии.

 TextInputDialog textInput = new TextInputDialog("whatever text"); textInput.initOwner(sentence.stage); Optionallt;Stringgt; result = textInput.showAndWait(); if (result.isPresent()) {  // process } textInput.getEditor().deselect();  

Комментарии:

1. showAndWait() не возвращается, пока окно не закроется. Так что ваш deselect() звонок слишком запоздал. Помогает ли изменение порядка вашего кода?

2. @Slaw Хм, нет, я пробовал, и это не помогло. Я обновил код, чтобы включить результат. Я могу вставить deselect строку несколько раз в разных местах, и это никогда не даст никакого эффекта.

Ответ №1:

Dialog#showAndWait() Метод не возвращается до тех пор, пока диалоговое окно не будет закрыто. Это означает, что ваш звонок deselect() слишком запоздал. Однако простое изменение порядка кода, по-видимому, не решит вашу проблему. Это похоже на проблему со временем; текст, вероятно, выбирается, когда поле фокусируется, поэтому вам нужно отменить выбор текста после этого. Например:

 import javafx.application.Application; import javafx.application.Platform; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.TextInputDialog; import javafx.scene.layout.StackPane; import javafx.stage.Stage;  public class Main extends Application {   @Override  public void start(Stage primaryStage) {  var button = new Button("Show dialog...");  button.setOnAction(  ae -gt; {  var textInput = new TextInputDialog("Some text");  textInput.initOwner(primaryStage);  Platform.runLater(textInput.getEditor()::deselect);  textInput.showAndWait();  });   var root = new StackPane(button);  primaryStage.setScene(new Scene(root, 500, 300));  primaryStage.show();  } }  

Runnable Переданное runLater выполняется после отображения диалогового окна и после выделения текста.