2016-05-28 23 views
0

我一直在試圖找到一些關於我的錯誤的信息,但幾個小時後卻找不到任何相關的信息。第一個關鍵事件跳過這個過程

我在控制器類中使用這種關鍵事件處理方法。 onKeyPressed位於根BorderPane上的fxml文件中。主要課程是標準課程。

此方法是我的計算器應用程序的一部分,它從keyCode中提取一個字符並將其傳遞給其他方法。

問題是,正如在調試過程中看到的,在第一次按鍵時,它甚至不會嘗試生成返回的字符串,而是直接跳轉到方法的結尾。按下的所有其他鍵均正常處理。

如果我在最後一個花括號之前印刷了一些東西,它只會在第一個按鍵上按下時印在控制檯上。

這是問題的方法:

public void handleKeys() { 
    container.setOnKeyPressed(key -> { 
     String returned = key.getCode().toString().toLowerCase(); 
     char chr = '0'; 
     switch (returned) { 
      case "add": 
       chr = '+'; 
       break; 
      default: 
       if (Character.toString(returned.charAt(returned.length() - 1)).matches("\\d") && returned.charAt(returned.length() - 2) != 'f') { 
        chr = returned.charAt(returned.length() - 1); 
        break; 
       } 
     } 
     handleSymbols(chr); 
    }); 
} 

從我的理解,在第一次按鍵setOnKeyPressed方法進行初始化,它跳過下面的代碼。我想我應該以某種方式將最後一個花括號轉換回 鍵 - > {part。但是如何?

回答

0

如果你註冊在FXML處理程序,推測可能與像

<BorderPane fx:id="container" onKeyPressed="#handleKeys" ... > 

那麼處理器已經被註冊(你沒有貼碼):你不需要重新註冊在控制器代碼中。您指定的方法在事件發生時被調用。所以你只需要這種方法來實現你需要的功能:

public void handleKeys(KeyEvent key) { 
    String returned = key.getCode().toString().toLowerCase(); 
    char chr = '0'; 
    switch (returned) { 
     case "add": 
      chr = '+'; 
      break; 
     default: 
      if (Character.toString(returned.charAt(returned.length() - 1)).matches("\\d") && returned.charAt(returned.length() - 2) != 'f') { 
       chr = returned.charAt(returned.length() - 1); 
       break; 
      } 
    } 
    handleSymbols(chr); 
} 
+0

是的,它真的有效!感謝您節省我的時間和頭痛! –