在TextField中选择一个单词

时间:2012-02-15 08:56:16

标签: java javafx javafx-2

以下代码应该在JavaFX TextField中选择一个单词:

public class NewFXMain extends Application {

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

    @Override
    public void start(Stage primaryStage) {
        final TextInputControl textField = new TextField("Hello World, World!");

        Button button = new Button("select");
        button.setOnAction(new EventHandler<ActionEvent>() {

            public void handle(ActionEvent t) {
                textField.positionCaret(0);
                textField.selectNextWord();

                System.out.println(textField.getSelectedText());
            }
        });

        VBox root = new VBox();
        root.getChildren().add(textField);
        root.getChildren().add(button);
        primaryStage.setScene(new Scene(root, 300, 100));
        primaryStage.show();
    }
}

它在控制台中打印Hello,但在界面中没有选择任何内容(突出显示)。 如果对TextArea执行相同操作,则会正确选择文本。

TextField

的(错误)结果

enter image description here

TextArea

的(正确)结果

enter image description here

发生了什么事???

2 个答案:

答案 0 :(得分:5)

TextField除非有焦点,否则不显示选择(虽然我不确定它是错误还是功能)。您可以使用下一个代码查看选择:

    button.setOnAction(new EventHandler<ActionEvent>() {

        public void handle(ActionEvent t) {
            textField.requestFocus(); // get focus first
            textField.positionCaret(0);
            textField.selectNextWord();

            System.out.println(textField.getSelectedText());
        }
    });

答案 1 :(得分:1)

问题的答案是,我们对这方面的原生控制的理解是,当文本字段失去焦点时它们都清晰选择,并且它们(通常)在获得焦点时选择所有文本。我们在JavaFX中使用UI控件的意图是具有原生感觉但是具有自定义外观。当然,我们可以根据其工作方式改变主意,但必须与保持原生感觉的目标相平衡(其中包括选择所有焦点,而不显示焦点丢失的选择,即使选择存在。但是,由于没有任何选择焦点丢失,如果它只是选择 - 所有焦点获得,因为奇怪的边缘情况仍然存在因此,我们不得不怀疑是否值得改变这一点)。