【问题标题】:JavaFX TextField override key UP/DOWN behaviourJavaFX TextField 覆盖键 UP/DOWN 行为
【发布时间】:2018-05-23 19:32:33
【问题描述】:

我正在设计一个带有 TextField 的自定义时间控件,并希望实现按 UP 键时增加小时或分钟的功能。

这就是我打算这样做的方式:

textField.setOnKeyPressed(event -> {
    int caretPos = editableNode.getCaretPosition();
    switch (event.getCode()) {
    case ESCAPE:
        getSkinnable().reset();
        event.consume();
    break;
    case UP:
        if (!getSkinnable().isInvalid()){
            if (caretPos < 3) {
                getSkinnable().increaseHour();
                selectHour();
            } else {
                getSkinnable().increaseMinute();
                selectMinute();
            }
        }
        event.consume();
    break;
    }
});

这里的问题是默认的 UP-Key 将插入符号设置为文本的开头。

我已经找到了这个帖子:JavaFX Textfield - Override default behaviour when up key is released

但是在文本开头设置插入符号的事件出现在我的事件处理程序之前,所以这对我没有帮助。

有谁知道我可以如何“覆盖”这种行为?

【问题讨论】:

  • 如何在 field.caretPositionProperty() 上添加一个 ChangeListener 以便在更改发生之前获取旧的插入符号位置,然后将插入符号位置设置为旧值?
  • 您是否尝试添加事件过滤器(而不是 setOnKeyPressed)并使用该事件?

标签: java events javafx key textfield


【解决方案1】:

@James_D 的解决方案解决了我的问题。

textField.addEventFilter(KeyEvent.KEY_PRESSED, event -> {
    int caretPos = editableNode.getCaretPosition();
    switch (event.getCode()) {
    case ESCAPE:
        getSkinnable().reset();
        event.consume();
    break;
    case UP:
        if (!getSkinnable().isInvalid()){
            if (caretPos < 3) {
                getSkinnable().increaseHour();
                selectHour();
            } else {
                getSkinnable().increaseMinute();
                selectMinute();
            }
        }
        event.consume();
    break;
    }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多