JavaFx 頁面和控制元件設定快捷鍵

one發表於2023-01-10

原文:JavaFx 頁面和控制元件設定快捷鍵 - Stars-One的雜貨小窩

之前說過一篇window系統全域性快捷鍵的設定,本期主要是講解JavaFx應用程式的快捷鍵設定,還是有所區別的

這裡主要是Tornadofx為例進行講解,以Kotlin語言為例,由於比較簡單,就不貼截圖了,下面例子都是自己測試成功的

使用

看網上的一篇文章,說是有5鍾方法,實際上只有3種方法,他提及的5種方法實際上有兩種只是構造生成KeyCodeCombination物件不同而已

設定快捷鍵的方法主要就是透過scene物件的方法和KeyCodeCombination快捷鍵引數來進行設定的

1.addMnemonic方法

透過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()裡呼叫方法,之後不再贅述

2.accelerators方法

透過accelerators方法,為當前的視窗頁面設定快捷鍵,只有焦點處於當前視窗頁面,按下快捷鍵才能觸發

fun test2() {
    //快捷鍵ctrl+v
    val kc1 = KeyCodeCombination(KeyCode.V, KeyCombination.CONTROL_DOWN)
    currentWindow?.scene?.apply {
        accelerators[kc1] = Runnable {
            println("快捷鍵CTRL + V")
        }
    }
}

3.addEventFilter方法

透過addEventFilter()方法,為當前的視窗頁面設定快捷鍵,只有焦點處於當前視窗頁面,按下快捷鍵才能觸發

fun test3() {
    val kc1 = KeyCodeCombination(KeyCode.V, KeyCombination.CONTROL_DOWN)
    currentWindow?.addEventFilter(KeyEvent.KEY_PRESSED) { event ->
        if (kc1.match(event)) {
            println("按下了快捷鍵。。")
        }
    }
}

補充-生成KeyCodeCombination的幾種方法

下面的快捷鍵都是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鍵,不太明白這個..

參考

相關文章