原文:JavaFx 頁面和控制元件設定快捷鍵 - Stars-One的雜貨小窩
之前說過一篇window系統全域性快捷鍵的設定,本期主要是講解JavaFx應用程式的快捷鍵設定,還是有所區別的
這裡主要是Tornadofx為例進行講解,以Kotlin語言為例,由於比較簡單,就不貼截圖了,下面例子都是自己測試成功的
看網上的一篇文章,說是有5鍾方法,實際上只有3種方法,他提及的5種方法實際上有兩種只是構造生成KeyCodeCombination
物件不同而已
設定快捷鍵的方法主要就是通過scene
物件的方法和KeyCodeCombination
快捷鍵引數來進行設定的
通過addMnemonic()
方法,可以為按鈕設定快捷鍵,當觸發快捷鍵後,會執行按鈕的action操作
class ShoetCutDemoView : View("My View") {
var btn by singleAssign<Button>()
override val root = vbox {
setPrefSize(700.0, 400.0)
btn = button("測試1") {
action{
println("按下了按鈕")
}
}
}
override fun onBeforeShow() {
test1()
}
fun test1() {
//快捷鍵ctrl+alt+c
val kc1 = KeyCodeCombination(KeyCode.C, KeyCombination.ALT_DOWN, KeyCombination.CONTROL_DOWN)
val mnemonic1 = Mnemonic(btn, kc1)
currentWindow?.scene?.addMnemonic(mnemonic1)
}
}
注意:這裡由於Tornadofx裡的View物件是存在這對應的生命週期,所以設定快捷鍵不能再root裡面佈局裡寫,因為此時還沒有形成對應的scene物件
要在
onBeforeShow()
方法裡或者是在事件裡設定快捷鍵(如按鈕的點選事件,滑鼠點選事件等)為了方便閱讀,下面貼出的程式碼例子均是在onBeforeShow()裡呼叫方法,之後不再贅述
通過accelerators
方法,為當前的視窗頁面設定快捷鍵,只有焦點處於當前視窗頁面,按下快捷鍵才能觸發
fun test2() {
//快捷鍵ctrl+v
val kc1 = KeyCodeCombination(KeyCode.V, KeyCombination.CONTROL_DOWN)
currentWindow?.scene?.apply {
accelerators[kc1] = Runnable {
println("快捷鍵CTRL + V")
}
}
}
通過addEventFilter()
方法,為當前的視窗頁面設定快捷鍵,只有焦點處於當前視窗頁面,按下快捷鍵才能觸發
fun test3() {
val kc1 = KeyCodeCombination(KeyCode.V, KeyCombination.CONTROL_DOWN)
currentWindow?.addEventFilter(KeyEvent.KEY_PRESSED) { event ->
if (kc1.match(event)) {
println("按下了快捷鍵。。")
}
}
}
下面的快捷鍵都是ctrl+v的範例程式碼:
val kc1 = KeyCodeCombination(KeyCode.V, KeyCombination.CONTROL_DOWN)
//這個類不怎麼用,用法和KeyCodeCombination類似,但看檔案也沒太明白這兩者有什麼區別..
val kc1 = KeyCharacterCombination("V", KeyCombination.CONTROL_DOWN)
//下面這兩個用法一樣
val kc1 = KeyCombination.keyCombination("ctrl+v")
val kc1 = KeyCombination.valueOf("ctrl+v")
//如果是mac,可以用meta這個
val kc1 = KeyCombination.valueOf("Meta+v")
這裡看了檔案也沒搞懂為什麼要用KeyCombination.CONTROL_DOWN
這個用法,就先固定著用吧
KeyCombination.CONTROL_DOWN
Ctrl鍵KeyCombination.SHIFT_DOWN
Shift鍵KeyCombination.META_DOWN
Meta鍵KeyCombination.ALT_DOWN
Alt鍵KeyCombination.SHORTCUT_DOWN
測試發現也是Ctrl鍵,不太明白這個..