防止退格键删除 javafx textarea 中的字符

preventing the backspace key from deleting characters in a javafx textarea

我正在尝试防止退格键删除 javafx 文本区域中的字符。 KeyEvent.consume 应该这样做,但它不会阻止关键事件的发生。它确实设置了键事件的 属性 并且 KeyEvent.isConsumed() 在使用该事件后返回 true。退格键仍然被执行。我试过其他键也有同样的效果

这是我当前的 fxcontroller class:

public class Terminal {
    @FXML
    private TextArea ta_console;

    @FXML
    private AnchorPane ap_main;

    @FXML
    protected void initialize(){
        ta_console.setText(">");
        ta_console.positionCaret(1);
    }

    public void keyStroke(KeyEvent keyEvent) {
        if (keyEvent.getCode() == KeyCode.BACK_SPACE || keyEvent.getCode() == KeyCode.DELETE) {
            keyEvent.consume();
        }
    }
}

keyStroke 方法在按下按键时由文本区域执行。 我是不是遗漏了什么,或者 consume 有问题,或者以某种方式无法按照文档所说的方式运行?有什么办法我仍然可以得到想要的结果吗?

如果你想防止用户删除文本,那应该用 TextFormatter 来完成,而不是试图猜测控件在内部处理哪些关键事件,以及所有这些事件的处理顺序,等等等等,因为它的默认行为。

不清楚您想要实现什么,但这里有一个示例,可以防止删除(或替换)文本:

public class Terminal {
    @FXML
    private TextArea taConsole;

    @FXML
    protected void initialize(){
        taConsole.setText(">");
        taConsole.positionCaret(1);
        taConsole.setTextFormatter(new TextFormatter(change -> {
            if (change.getRangeStart() == change.getRangeEnd()) { // nothing deleted
                return change ;
            }
            // change represents a deletion of some text, veto it:
            return null ;
        });
    }

}

详情见Javadocs for TextFormatter.Change