#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
выполняется после отображения диалогового окна и после выделения текста.