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

JavaFX应用程序线程中按回车键时出现NullPointerException异常

太叔昊苍
2023-03-14

我目前有以下情况:

我想让我的应用程序监听用户输入。首先,我使用了一个看不见的文本字段,但这搞砸了我的设计,我认为它不够复杂。因此,我现在尝试在我的上部流程窗格上创建一个onKeyPressed事件处理程序,如下所示:

public String input = "";
@FXML public void listenToInput(KeyEvent key) {

    if (key.getCode() != KeyCode.ENTER) {

        if (key.getCode().isDigitKey() || key.getCode().isLetterKey()) {
            String newChar = key.getText();
            input = input.concat(newChar);
        }

    }
    else {
        this.addScanToList(input);
        input = "";
    }

}

这仅适用于纯文本和数字。但是,一旦我按Enter键,我就会收到以下错误:

Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
at com.sun.javafx.scene.control.behavior.TableViewBehaviorBase.activate(TableViewBehaviorBase.java:915)
at com.sun.javafx.scene.control.behavior.TableViewBehaviorBase.callAction(TableViewBehaviorBase.java:179)
at com.sun.javafx.scene.control.behavior.BehaviorBase.callActionForEvent(BehaviorBase.java:218)
at com.sun.javafx.scene.control.behavior.TableViewBehaviorBase.callActionForEvent(TableViewBehaviorBase.java:208)
at com.sun.javafx.scene.control.behavior.BehaviorBase.lambda$new$75(BehaviorBase.java:135)
at com.sun.javafx.scene.control.behavior.BehaviorBase$$Lambda$146/1103773754.handle(Unknown Source)
at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Scene$KeyHandler.process(Scene.java:3926)
at javafx.scene.Scene$KeyHandler.access$1800(Scene.java:3872)
at javafx.scene.Scene.impl_processKeyEvent(Scene.java:2001)
at javafx.scene.Scene$ScenePeerListener.keyEvent(Scene.java:2463)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$KeyEventNotification.run(GlassViewEventHandler.java:197)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$KeyEventNotification.run(GlassViewEventHandler.java:147)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleKeyEvent$346(GlassViewEventHandler.java:228)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$$Lambda$208/996795822.get(Unknown Source)
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:406)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleKeyEvent(GlassViewEventHandler.java:227)
at com.sun.glass.ui.View.handleKeyEvent(View.java:540)
at com.sun.glass.ui.View.notifyKey(View.java:950)

我已经想到了:

  • 上面的FlowPane没有焦点,但我给了它焦点,但没有结果。
  • 回车键没有被识别,这可能是真的,因为我的listenToInput的“其他”永远不会被输入。

编辑1:

    < Li > flow pane没有" setOnAction ",因此它不知道如何处理< kbd>ENTER键。

有人知道是什么触发了这个错误吗?

编辑2:

我将 onKeyPressed 更改为 onKeyRelease,然后我的代码正常运行,但我仍然收到错误。也许知道这一点会有所帮助。

编辑3:

我尝试用< kbd>ALT而不是< kbd>ENTER将扫描添加到列表中,这非常有效,所以它与< kbd>ENTER有关

共有2个答案

羊舌炯
2023-03-14

我通常就是这样添加一个keyEvent处理程序来监听按键事件的。

FlowPane pane = new FlowPane();
pane.setOnKeyPressed(new EventHandler<KeyEvent>() {

    @Override
    public void handle(KeyEvent key) {
        if (key.getCode() != KeyCode.ENTER) {

            if (key.getCode().isDigitKey() || key.getCode().isLetterKey()) {
                String newChar = key.getText();
                input = input.concat(newChar);
            }

        }
        else {
            this.addScanToList(input);
            input = "";
        }

    }
});

}
姬昀
2023-03-14

经过几天的努力,我终于解决了这个问题。正如我在Edit 3中提到的,它与< kbd>ENTER键有关。当它被按下时,看起来FXML文件正在搜索一个可以使用动作的元素。不知何故,它找到的第一个东西是一个TableView。我试着让这段代码不可聚焦:

tableview.setFocusTraversable(false)

它是有效的。有人能解释JavaFX想对ENTER键做什么吗?我专注于FlowPane,因此它应该将操作发送给适当的侦听器。如果它与必须覆盖的事件处理程序有关,请告诉我。

 类似资料:
  • 乍一看,这个问题似乎是重复的。我已经在谷歌搜索了一些,但不幸的是,没有一个结果不符合我。我给出了下面的问题链接。 应用程序启动方法java.lang.Reflect.InvocationTargetException JavaFX图像转换中出现异常 JavaFX-应用程序启动方法中的异常? 应用程序启动方法中出现异常 堆栈跟踪: 无法从此StackTrace跟踪错误。然后我在start方法中使用了

  • 我从C#开始,第一个项目是做计算器。我想为我的GUI提供一个键盘处理程序,它可以执行与我之前所做的按钮处理程序相同的操作。问题是当我进入“回车”键时。这就是我的空虚: 问题是,如果我按下enter键,它会抛出处理程序事件,但它也会按下按钮,就像我单击它一样。这是一张图片: 知道吗?谢谢:)

  • 当我在webLogic上部署我的第一个web应用程序时,我会遇到以下错误: WebLogic.Application.ModuleException:java.lang.NullPoInterException位于WebLogic.Application.Internal.ExtensibleModuleWrapper.Prepare(ExtensibleModuleWrapper.java:11

  • 当我运行任何JavaFX代码(甚至是hello world http://docs.oracle.com/JavaFX/2/get_started/hello_world.htm)并按下capslock键时,应用程序将冻结,直到关闭caps lock为止。 我在Kubuntu12.04中运行JavaFX,可能是Kubuntu的bug,我没有机会在另一个操作系统上尝试。 知道吗?

  • 我正在从事JavaFX项目,我创建了两个FXML文件,我想将另一个窗格加载到主窗格,即边框窗格。我想将另一个窗格加载到边框窗格中心区域! 这是我的项目的切入点,这是一个Java文件 之后,将显示显示“我的边框”窗格的主FXML文件 我设置了一个按钮,将特定窗格显示到边框窗格中心区域。 这是我的控制器类的边界窗格包含类 这是我想显示在边界窗格中心区域的FXML文件。 但是当我点击按钮,给我一堆错误!

  • 我尝试创建一个包含一个文本字段和按钮的屏幕,并重复“应用程序启动方法中的异常”。第一次我试着从这个问题中解题,但没有奏效: 应用程序启动方法中出现异常 应用程序启动方法javafx gui中出现异常 我使用Java11、JavaFX11。对于javaFx,我使用Maven。 主要的类别是: FXML文件为: