【问题标题】:NullPointerException on ENTER-key press in JavaFX Application Thread在 JavaFX 应用程序线程中按 ENTER 键时出现 NullPointerException
【发布时间】:2015-02-07 09:37:37
【问题描述】:

我目前有以下情况:

我想让我的应用程序监听用户输入。首先,我使用了一个不可见的 TextField,但这搞砸了我的设计,我认为它不够复杂。所以,我现在正试图在我的上部 FlowPane 上创建一个 onKeyPressed EventHandler,如下所示:

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 的“else”从未被输入。

编辑 1:

  • FlowPane 没有“setOnAction”,因此它不知道如何处理 ENTER 按下。

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

编辑 2:

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

编辑 3:

我尝试使用 ALT 而不是 ENTER 将扫描添加到列表中,并且效果很好,因此它与 ENTER

【问题讨论】:

    标签: java nullpointerexception javafx javafx-8


    【解决方案1】:

    这就是我通常添加一个 keyEvent Handler 来监听关键事件的方式。

    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 = "";
            }
    
        }
    });
    
    }
    

    【讨论】:

    • 感谢您的回答!我已经在FXML文件中设置了动作,那和你建议的基本不一样吗?
    【解决方案2】:

    尝试了几天后,我能够解决此问题。正如我在编辑 3 中已经提到的,它与 ENTER 键有关。当它被按下时,看起来 FXML 文件正在搜索一个可以使用操作的元素。不知何故,它首先找到的是一个 TableView。我尝试了这段代码使其无法聚焦:

    tableview.setFocusTraversable(false)
    

    而且它有效。谁能解释 JavaFX 想用 ENTER 键做什么?我将注意力集中在 FlowPane 上,因此它应该将操作发送给适当的侦听器。如果它与必须覆盖的事件处理程序有关,请告诉我。

    【讨论】:

    • 可能是因为 TableView 是可编辑的,所以它正在寻找下一个单元格以在 Enter 键上编辑
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 2020-04-30
    • 2021-01-20
    • 2020-05-21
    相关资源
    最近更新 更多