【问题标题】:Selecting a word in TextField在 TextField 中选择一个单词
【发布时间】:2012-02-15 08:56:15
【问题描述】:

以下代码应该在 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 的(错误)结果:

以及TextArea 的(正确)结果:

发生了什么事?!?

【问题讨论】:

  • 查看我的回答并告诉我它是否有效...

标签: java javafx javafx-2


【解决方案1】:

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

【讨论】:

  • 我的用例是一个拼写检查器,所以它是一个不同的模态窗口显示建议,而不同的 TextFields/TextAreas 突出显示了原始拼写错误的单词 - 这意味着请求焦点到被选中的 TextInputControl 并不是很简单,因为重点是拼写检查器本身。有什么建议吗?
  • 将拼写检查限制为 TextAreas 而不是 TextFields+TextAreas 或检查 openjdk.java.net/projects/openjfx 的代码,看看是否可以修补该问题。
【解决方案2】:

问题的答案是,我们在这方面对原生控件的理解是,它们既在文本字段失去焦点时清除选择,又在获得焦点时(通常)选择所有文本。我们在 JavaFX 中使用 UI 控件的目的是具有原生的感觉,但具有定制的外观。当然,我们可以改变它的工作方式,但它必须与保持原生感觉的目标保持平衡(包括全选获得焦点和不显示焦点丢失时的选择,即使存在选择。但是,如果只是选择所有获得的焦点,那么对焦点丢失的选择几乎没有意义,并且由于结果仍然存在奇怪的边缘情况,我们不得不怀疑是否值得改变这一点)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    相关资源
    最近更新 更多