2014-12-09 65 views
2

目前,我有以下情況:的NullPointerException在JavaFX應用程序線程ENTER鍵按下

我想讓我的應用程序聽取用戶的輸入。首先,我用一個看不見的TextField做了這個,但是這個搞砸了我的設計,我認爲它不夠複雜。所以,我現在想做一個onKeyPressed事件處理在我的上FlowPane,像這樣:

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:

  • 的FlowPane沒有一個 'setOnAction',所以它不知道如何處理ENTER按。

有誰知道是什麼觸發了這個錯誤?

編輯2:

我改變onKeyPressed到onKeyReleased,然後我的代碼運行正常,但我仍然得到錯誤。也許這有助於瞭解這一點。

編輯3:

我試圖掃描添加到列表中與ALT,而不是ENTER,而這完美的作品,所以有事情做與ENTER

回答

1

嘗試了幾天後,我能夠解決這個問題。正如我在編輯3中已經提到的那樣,它與ENTER鍵有關。當它被按下時,它看起來像FXML文件正在搜索一個可能會消耗一個動作的元素。不知何故,它發現的第一件事是一個TableView。我試過這段代碼,使它不可聚焦:

tableview.setFocusTraversable(false) 

它的工作原理。任何人都可以解釋什麼JavaFX想要做的ENTER鍵?我專注於FlowPane,因此它應該將操作發送給適當的監聽器。如果它與必須被覆蓋的事件處理程序有關,請告訴我。

0

這就是我通常添加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 = ""; 
     } 

    } 
}); 

} 
+0

感謝您的回答!我已經在FXML文件中設置了這個動作,那麼它與你所建議的基本不一樣? – bashoogzaad 2014-12-09 20:37:59

相關問題