【问题标题】:JavaFX TextField cancelEdit not working as expectedJavaFX TextField cancelEdit 未按预期工作
【发布时间】:2016-06-27 16:44:12
【问题描述】:

我有一个TextField,当我按下 Esc 时,我希望该字段的内容恢复到以前的值,这是大多数系统上的预期行为(我不知道为什么 JavaFX默认情况下不这样做)。

为此,我尝试使用TextField.cancelEdit(),但似乎这无济于事。

这是一个SSCCE

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import javafx.stage.Stage;

public class UiTest2Controller extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage aPrimaryStage) throws Exception {
        final TextField field = new TextField();
        field.setOnAction(aEvent -> {
            System.out.println("Action");
        });
        field.setOnKeyPressed(aEvent -> {
            if (aEvent.getCode() == KeyCode.ESCAPE) {
                System.out.println("Escape");
                field.cancelEdit();
                field.getParent().requestFocus();
            }
        });
        field.setPromptText("Hello World...");

        aPrimaryStage.setScene(new Scene(new Group(field)));
        aPrimaryStage.show();
    }
}

重现步骤:

  1. 在文本字段中输入内容
  2. Esc

预期行为:该字段返回之前的值(第一次为空)并且焦点丢失。

实际行为: 字段在当时保持其价值,但失去焦点。

【问题讨论】:

    标签: java user-interface javafx


    【解决方案1】:

    我不确定具体细节,但如果TextField 分配了TextFormatter,它似乎可以按预期工作:

    field.setTextFormatter(new TextFormatter<>(TextFormatter.IDENTITY_STRING_CONVERTER));
    

    【讨论】:

    • 是的,我刚刚通过查看 Java FX 源代码发现了这一点。文档太少了......此外,设置文本格式化程序时,Escape 默认取消编辑。
    • 另外,可以调用field.commitValue()创建“还原点”,否则会一直回滚到空字符串。
    • 在没有TextFormatter 的情况下调用field.commitValue() 对结果没有影响。使用TextFormatter,无需调用commitValue,它就可以按预期工作,所以我不确定它是否需要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 2021-06-04
    • 2022-01-24
    • 2015-05-11
    • 2020-05-15
    • 2014-10-31
    相关资源
    最近更新 更多