【问题标题】:Why consume() on a KeyEvent in an event filter not working?为什么在事件过滤器中的 KeyEvent 上的 consume() 不起作用?
【发布时间】:2021-07-30 11:05:24
【问题描述】:

我想过滤一些字符,即 TextField 中的字母“a”。我明确不想为此任务使用推荐的 TextFormatter / setTextFormatter()

下面的代码示例实际上应该在事件调度链上的事件到达 TextField 节点之前消耗它,它是 parentNode 的子节点,但它没有。当然,如果我在文本字段节点本身上设置过滤器,也会发生同样的情况。

为什么?

    parentNode.addEventFilter(KeyEvent.KEY_PRESSED, event -> {
        if (event.getCode() == KeyCode.A) {
            event.consume();
        }
    });

【问题讨论】:

  • _ 我明确不想使用推荐的 TextFormatter_ 为什么不呢?
  • 因为我想了解事件处理大声笑,这就是为什么。在此示例中使用 TextFormatter 很容易,但不是问题...
  • 啊,我明白了,但是您的回答并没有真正帮助您(完全理解事件处理:) 无论如何,您应该编辑您的问题:学术练习完全有效,但如果问题是关于它们,应该在问题中明确说明
  • 这就是我写“理解事件处理”而不是“完全”的原因。彻底阅读问题/ cmets 可以防止不必要的讨论... ;-)

标签: events javafx consuming


【解决方案1】:

啊,真的很奇怪,似乎 KeyEvent.KEY_PRESSED 不足以处理所有已调度的事件。 如果我使用更通用的 KeyEvent.ANY 而不是以下代码:

    TextField tf = new TextField();
    tf.addEventFilter(KeyEvent.ANY, event -> {
        if (event.getCharacter().matches("[aA]"))
            event.consume();
    });

【讨论】:

  • 你不需要ANY,而是生成输入的类型,即代表一个字符;)
  • 请给我代码示例,这样我就能明白你的意思了,谢谢。
  • 文本输入控件使用KEY_TYPED 进行字符输入,因为这是getCharacter() 返回有意义的唯一事件类型。虽然它使用KEY_PRESSED 处理其他键事件,例如退格、回车、箭头键等。可以在内部行为类中看到事件处理代码:github.com/openjdk/jfx/blob/master/modules/javafx.controls/src/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多