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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...