JavaFx 頁面和控制項設置快捷鍵

来源:https://www.cnblogs.com/stars-one/archive/2023/01/10/17039642.html
-Advertisement-
Play Games

原文: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鍵,不太明白這個..

參考


提問之前,請先看提問須知 點擊右側圖標發起提問 聯繫我 或者加入QQ群一起學習 Stars-One安卓學習交流群 TornadoFx學習交流群:1071184701
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前一段時間做項目,頻繁使用到上傳圖片組件,而且只上傳一個封面,於是想著自定義一個圖片封面上傳組件。先來看一下效果: 第一張圖片是上傳之前,第二張圖片是上傳成功後,第3張圖片是滑鼠放上去之後的效果! 首先整理需求,圖片上傳我們使用照片牆的方式,只能上傳一張圖片,圖片上傳成功後不能繼續上傳,如果想要更換 ...
  • 電銷是什麼?就是坐席拿著電話給客戶打電話嗎?no no no,讓我們一起走進京音平臺之電銷系統。 京音平臺2020年初開始建設,過去的兩年多的時間里,經歷了跌宕起伏,有經驗、有教訓,整體來說平臺經歷了人工、自動化階段,目前處於初步智能化階段,希望可以將過去的一些心路歷程分享給大家,共同交流、共同進... ...
  • 1高階函數 1.1 數學概念 回顧下數學知識: y=f(x) 這是最開始接觸的普通函數 y=g(f(x)) 這個就是我們接觸到的高階函數 在數學和電腦科學中,高階函數至少應當是滿足下麵一個條件的函數: 1)接受一個或者多個函數作為參數 2)輸出一個函數 程式中我們的高階函數也類似 示例計數器的函數 ...
  • Redis 數據結構-雙向鏈表 最是人間留不住,朱顏辭鏡花辭樹。 1、簡介 Redis 之所以快主要得益於它的數據結構、操作記憶體資料庫、單線程和多路 I/O 復用模型,進一步窺探下它常見的五種基本數據的底層數據結構。 Redis 常見數據類型對應的的底層數據結構。 String:簡單動態字元串。 L ...
  • 前言 今天給大家介紹的是Python爬蟲批量下載相親網站圖片數據,在這裡給需要的小伙伴們代碼,並且給出一點小心得。 首先是爬取之前應該儘可能偽裝成瀏覽器而不被識別出來是爬蟲,基本的是加請求頭,但是這樣的純文本數據爬取的人會很多,所以我們需要考慮更換代理IP和隨機更換請求頭的方式來對相親網站圖片數據進 ...
  • 一、MybatisPlusMax簡介 MybatisPlusMax是MybatisPlus的增強包,秉承只拓展不修改的理念,對MybatisPlus做增強。 正如MybatisPlus是對MyBatis的增強,MybatisPlusMax是對MybatisPlus的增強,拓展理念一脈相承。 Myba ...
  • 相較於最初的 Bourne shell,現代 bash 版本的最大改進之一體現在算術方面。早期的 shell 版本沒有內建的算術功能,哪怕是給變數加1,也得調用單獨的程式來完成。 1、算術方法一: $(( )) 只要都是整數運算,就可以在 $(( )) 的算術表達式內使用所有的標準運算符。還有一個額 ...
  • 大家好,我是三友~~ 這篇文章我準備來聊一聊RocketMQ消息的一生。 不知你是否跟我一樣,在使用RocketMQ的時候也有很多的疑惑: 消息是如何發送的,隊列是如何選擇的?消息是如何存儲的,是如何保證讀寫的高性能?RocketMQ是如何實現消息的快速查找的?RocketMQ是如何實現高可用的?消 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...