当前位置: 首页 > 知识库问答 >
问题:

JavaFX KeyEvent.Consume()无法停止事件传播

咸星波
2023-03-14

我试图在JavaFX中重现一个JavaScript游戏的一些行为。该程序有几个数字文本字段,可以在游戏运行时进行编辑。它在运行时也接受字母键盘命令。

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class KeyFilterSSCCE extends Application {

    @Override
    public void start(Stage stage) {
        stage.setTitle("Key Filter SSCCE");
        TextField tf = new TextField("XYZ abc");
        tf.setMaxWidth(150);
        Label label = new Label("Filtered Keys: ");
        VBox root = new VBox(20, tf, label);
        root.setAlignment(Pos.CENTER);
        root.setPadding(new Insets(20));
        Scene scene = new Scene(root, 325, 200);

        stage.addEventFilter(KeyEvent.KEY_PRESSED, e -> {
            if (e.getCode() == KeyCode.S) {
                label.setText(label.getText() + e.getCode().getChar());
                e.consume();
            }
        });

        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch();
    }
}

macOS、Java17、JavaFX17。

共有1个答案

云鸿达
2023-03-14

在@kleopatras注释和更多的实验之后,下面是一个按预期操作的事件过滤器版本:

    stage.addEventFilter(KeyEvent.KEY_TYPED, e -> {
        if (e.getCharacter().toUpperCase().equals("S")) {
            label.setText(label.getText() + e.getCharacter());
            e.consume();
        }
    });

我需要筛选keyevent.key_typed事件。此外,由于该事件的事件getcode()方法返回undefined,因此必须对测试进行一点修改,以便根据getcharacter()的结果进行测试,奇怪的是,该结果返回一个字符串

 类似资料:
  • 我正在尝试处理用户的Backspace按键。我有2个处理程序绑定到一个输入元素。由于无法在onChange事件处理程序中检测按键,因此我必须在onKeyDown中进行。我想在按下backspace时停止onChange事件的传播(并在onKeyDown事件处理程序中处理)。有什么想法如何实现这一点?谢谢!

  • 问题内容: 当我为实体创建时,在Spring Data REST中不会通过Spring Boot 1.4.0.M3(也是Spring Boot 1.3.5)触发关联的方法-这是Bug还是 设计 错误? 我有一个具有的实体: 在我发布时应触发: 除非我添加: 当我注释掉注释时,方法再次触发。 由于它们在Spring Data REST中运行两个不同的概念层,因此它们似乎应该独立运行-还是我误会了什么

  • 问题内容: 考虑以下: 如何做到这一点,以便当用户单击范围时不会触发的click事件? 问题答案: 使用event.stopPropagation()。 对于IE:

  • 本文向大家介绍JavaScript中使用stopPropagation函数停止事件传播例子,包括了JavaScript中使用stopPropagation函数停止事件传播例子的使用技巧和注意事项,需要的朋友参考一下 JS中的事件默认是冒泡方式,逐层往上传播,可以通过stopPropagation()函数停止事件在DOM层次中的传播。如以下例子: HTML代码: DOM逐层往上传播,所以单击butt

  • 问题内容: 考虑以下: 如何做到这一点,以便当用户单击范围时不会触发的click事件? 问题答案: 使用event.stopPropagation()。 对于IE:

  • ap.onBackgroundAudioStop(CALLBACK) 监听音乐停止事件。 代码示例 <script src="https://gw.alipayobjects.com/as/g/h5-lib/alipayjsapi/3.1.1/alipayjsapi.inc.min.js"></script> <style>.output{ display:block; max-width: 1