原文:JavaFx 頁面和控制項設置快捷鍵 - Stars-One的雜貨小窩 之前說過一篇window系統全局快捷鍵的設置,本期主要是講解JavaFx應用程式的快捷鍵設置,還是有所區別的 這裡主要是Tornadofx為例進行講解,以Kotlin語言為例,由於比較簡單,就不貼截圖了,下麵例子都是自己測試 ...
原文: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("按下了快捷鍵。。")
}
}
}
PS: 上面2和3方法看似是一樣,但是第3種方法在快捷鍵衝突的情況下也會執行
比如說上面我們是設置了ctrl+v的快捷鍵,如果當頁面存在有一個輸入框textfield,此時你按下ctrl+v,此時兩種方法的情況如下:
- accelerators: 輸入框里粘貼了文本,沒有觸發我們設置的快捷鍵功能
- addEventFilter: 輸入框粘貼了文本,且觸發了我們設置的快捷鍵功能
補充-生成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鍵,不太明白這個..
參考
- 【筆記】javafx設置快捷鍵_五種方法_ccOCONuTT的博客-CSDN博客
- JavaFX視頻教程第11課,設置快捷鍵_嗶哩嗶哩_bilibili
- KeyCodeCombination (JavaFX 8官方文檔)
- KeyCode (JavaFX 8)
- Overview List (JavaFX 8)
提問之前,請先看提問須知 點擊右側圖標發起提問 或者加入QQ群一起學習 TornadoFx學習交流群:1071184701