2017-09-24 65 views
1

我有一個錯誤,說我的條件總是錯誤的。基本上OSX上關閉應用程序的慣例是使用組合鍵「命令+ W」使用Lambda表達式不起作用的JavaFX中的鍵綁定

我想在我的程序中複製這個。

scene.setOnKeyPressed(e -> { 
     if ((e.getCode() == KeyCode.COMMAND) && (e.getCode() == KeyCode.W)) { 
      controller.exitClick(); 
     } 
    }); 

它的工作原理,如果我只有具備的首要條件,但我當然不希望用戶只需按下W.

控制器關閉應用程序只是我的控制器類的實例,我借用退出功能,因爲我有自定義退出並最小化了我的應用程序上的按鈕。

這是怎麼回事?

回答

0

事件setOnKeyPressed檢測到一個鍵一次,你不能在一個條件中檢查其中的兩個,因爲它只能應用於一個條件。

你可以做的是創造一些boolean變量(每個鍵)和setOnKeyPressed你有單獨檢查每個鍵,如果按下當前關鍵是其中之一,你匹配的變量設置爲true條件。在檢查哪個鍵被按下後,你檢查兩個變量,如果兩個都是true然後有人按下兩個鍵。

一個小問題是,變量永遠不會變成false,如果某人不按下按鍵,該怎麼辦?您可以使用setOnKeyReleased這是發佈密鑰時調用的關鍵事件。如果密鑰被釋放,則分別檢查每個密鑰並將條件變量設置爲false

所以應該這樣做。如果您需要示例代碼,請詢問。

EDIT

的例子展示了波紋管中的JavaFX多鍵按壓的檢測。

首先我需要定義布爾變量來保存我的鍵是否被按下。他們應該是類變量。

boolean keyCommand = false; 
boolean keyW = false; 

這時我們就需要2個事件添加到我們的場景:當按下按鍵我們每一個

onKeyPressed事件將檢測。請記住,爲每個密鑰分別調用該事件。

onKeyReleased事件將檢測到我們的密鑰不再被按下。這個事件也是分別爲每個鍵調用的。

scene.setOnKeyPressed(e -> { 
     if(e.getCode() == KeyCode.COMMAND) 
        keyCommand = true; 
     else if(e.getCode() == KeyCode.W) 
        keyW = true; 

      if(keyCommand && keyW) 
       //both are pressed 
       doSomething(); 

}); 

我們第二個事件:

scene.setOnKeyReleased(e -> { 
     if(e.getCode() == KeyCode.COMMAND) 
       keyCommand = false; 
     else if(e.getCode() === KeyCode.W) 
       keyW = false; 
}); 

就是這樣。現在布爾變量可能不是保存數據的完美方式,BooleanProperty可能更可取,但它應該也可以。

+0

我可以有一些示例代碼?我幾乎不明白你在做什麼。 – compute

+0

請參閱我有一個類似於我實現的想法,但我得到的錯誤是,在lambda表達式中使用的變量應該是最終的或有效的最終結果。所以兩個布爾變量不能使用。 – compute

+0

@compute是否將它們定義爲類變量,而不是方法? – tomtzook

0

我已經通過改爲使用整數和一種方法解決了這個問題。

我不知道這樣做的潛在漏洞,但這裏是代碼。

scene.setOnKeyPressed(e -> { 
     if(e.getCode() == KeyCode.SHIFT) 
      count++; 
     else if(e.getCode() == KeyCode.W) 
      count++; 
     if(count == 3) 
      controller.exitClick(); 
    }); 

有一些全球價值