日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

如何在 JavaFX 的 TextArea 实现回车发送信息而不换行,但组合键 Ctrl + Enter 换行

發布時間:2024/4/13 java 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何在 JavaFX 的 TextArea 实现回车发送信息而不换行,但组合键 Ctrl + Enter 换行 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如何在 JavaFX 的 TextArea 實現回車發送信息而不換行,但組合鍵 Ctrl + Enter 換行

??JavaFX 的惱人之處在于很多基本的操作都要自己親力親為。在默認情況下,在 TextArea 輸入回車會導致換行,但在很多場景中,我們希望它在用戶輸入回車不換行而改為觸發信息的發送,換行則由組合鍵 Ctrl + Enter 來觸發。在 JavaFX,這項功能沒有簡單直接的方法,并不是在所有的 UI 語言中都是如此,但 JavaFX 沒有提供直接的 API。在不斷踩坑之后,筆者終于在 JavaFX 中實現了這一功能。


實現的算法大致如下:

  • 使用 TextArea 的處理器 onKeyPressed 來監聽 TextArea 的鍵盤輸入事件。

  • 如果監聽到用戶輸入了回車,作如下判斷:

  • 如果用戶輸入的不是組合鍵 Ctrl + Enter,去掉剛剛輸入的換行符,然后將文本發送。此時可以選擇清空文本框的內容還是保持文本框的內容不變。然后本算法結束。

  • 如果用戶輸入的是組合鍵 Ctrl + Enter,在光標處插入換行符,然后將光標移至到換行符之后。然后本算法結束。

  • 如果用戶沒有輸入回車,什么也不做,本算法結束。


  • 主要的注意事項如下:

    • 文本框光標的范圍是 [0, length]。因為光標指向文字左右及之間的空隙,而空隙的數量比文字多 1。

    • 處理器 onKeyPressed 的回調方法是在用戶按下按鍵(還沒釋放之前)就馬上觸發。

    • TextArea 不認為輸入的組合鍵為單獨依次這些鍵的效果之和。這意味著,在按下但不松開 Ctrl 鍵之后,輸入 Enter 時,輸入的文本不會包含換行符,因為 TextArea 不認為此時輸入的是 Enter。但如果依次按下(不松開) a、Enter,則輸入的文本為 a\n。

    • 在 onKeyPressed 的回調方法中,當用戶輸入的是普通的按鍵時,光標的位置為輸入該字符之前的位置(剛剛輸入的字符尚未在文本框中生效)。如果用戶輸入的是特殊的按鍵(如 Ctrl、Alt 、Enter 等),光標的位置為此鍵生效之后光標的位置。這意味著,如果輸入的是 Enter,則當 onKeyPressed 的回調方法觸發時,文本框中不僅包含換行符,而光標在該換行符之后。

    • 在拼接光標兩側的文本時,Enter 與組合鍵 Ctrl + Enter 的光標位置與文本內容均有差異。對于 Enter,需要清除換行符,而輸入的換行符位于光標的左邊。對于組合鍵 Ctrl + Enter,不僅要插入換行符,還要將光標的位置右移。

    • Windows 會將回車解釋成 \n\r,但 TextArea 清除文本中所有的 \r。換句話說,當在 Windows 輸入回車時,實際上輸入的是 \n\r。但當向 TextArea 輸入 \n\r 時,TextArea 會移除所有的 \r。從 TextArea 得到的字符串中不會包含任何 \r。

    • 方法 keyEvent.isControlDown() 并不是用來判斷觸發 onKeyPressed 的按鍵(剛剛按下的按鍵)是不是鍵 Ctrl ,而是用來判斷,在調用方法 keyEvent.isControlDown() 時,已經按下且未松開的按鍵含不含鍵 Ctrl。因此,如果使用該方法,就無需自行記錄用戶按下與釋放的每一個鍵了。


    核心代碼如下:(FXML 與 FXML 的控制器的代碼)

    TextSend.fxml

    <?xml version="1.0" encoding="UTF-8"?><?import javafx.scene.layout.VBox?> <?import javafx.scene.control.TextArea?> <?import javafx.scene.control.Button?> <?import javafx.geometry.Insets?><VBox alignment="CENTER" spacing="20.0" xmlns:fx="http://javafx.com/fxml"fx:controller="org.wangpai.demo.textsend.TextSendController"><padding><Insets bottom="20.0" left="20.0" right="20.0" top="20.0"/></padding><TextArea prefHeight="200" prefWidth="200" fx:id="textArea" onKeyPressed="#onKeyPressedTextArea"/><Button onAction="#onActionButton" text="發送(S)"/> </VBox>

    TextSendController.java

    package org.wangpai.demo.textsend;import javafx.fxml.FXML; import javafx.event.ActionEvent; import javafx.scene.control.TextArea; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent;public class TextSendController {@FXMLprivate TextArea textArea;@FXMLpublic void onKeyPressedTextArea(KeyEvent keyEvent) {// 如果按下了回車鍵if (keyEvent.getCode() == KeyCode.ENTER) {// 獲得此時的光標位置。此位置為剛剛輸入的換行符之后var caretPosition = this.textArea.getCaretPosition();// 如果已經按下的按鍵中包含 Control 鍵if (!keyEvent.isControlDown()) { // 如果輸入的不是組合鍵 `Ctrl+Enter`,去掉換行符,然后將文本發送// 獲得輸入文本,此文本包含剛剛輸入的換行符var text = this.textArea.getText();// 獲得換行符兩邊的文本var front = text.substring(0, caretPosition - 1);var end = text.substring(caretPosition);this.textArea.setText(front + end);this.onActionButton(null); // 模擬發送/*----- 如果希望發送后保留輸入框文本,需要只使用下面這行代碼,然后去掉清除文本框的代碼 -------*/// this.textArea.positionCaret(caretPosition - 1);} else {// 獲得輸入文本,此文本不包含剛剛輸入的換行符var text = this.textArea.getText();// 獲得光標兩邊的文本var front = text.substring(0, caretPosition);var end = text.substring(caretPosition);// 在光標處插入換行符this.textArea.setText(front + System.lineSeparator() + end);// 將光標移至換行符this.textArea.positionCaret(caretPosition + 1);}}}/*** 模擬的發送方法*/@FXMLpublic void onActionButton(ActionEvent event) {System.out.println("正在發送信息...");System.out.println(this.textArea.getText());this.textArea.requestFocus();/*----- 如果希望發送后清除輸入框文本,使用下面這行代碼 -------*/this.textArea.clear();} }

    示例程序運行截圖如下:

    筆者的運行環境:

    • JDK 17.0.1

    • JavaFX 17.0.1

    • IntelliJ IDEA 2021.2.2 (Ultimate Edition)




    完整的代碼:https://gitcode.net/wangpaiblog/20211124-textsend


    總結

    以上是生活随笔為你收集整理的如何在 JavaFX 的 TextArea 实现回车发送信息而不换行,但组合键 Ctrl + Enter 换行的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 久久亚洲综合 | 窝窝视频在线观看 | 日韩中文字幕在线一区 | 久久4 | 国产资源站 | 国产农村妇女aaaaa视频 | 91视频影院 | 中文字幕一本 | 少妇一级淫免费观看 | 国产在线97| 免费视频一二三区 | 国产白丝袜美女久久久久 | 深夜福利国产精品 | 人妻熟女一区二区三区 | 色狠久| 亚洲天堂第一页 | 免费成人深夜夜行网站视频 | 五月婷婷激情综合网 | 精品乱子伦一区二区三区 | 国产女优在线播放 | 中文字幕久久熟女蜜桃 | 三级色网 | 天天射日日射 | 在线视频中文字幕 | 91视频在| 亚洲第一色 | 在线一区二区视频 | 日本欧美精品 | 夜夜激情网 | 爱爱视频在线免费观看 | 人人模人人干 | 懂色av一区二区三区四区五区 | 善良的少妇伦理bd中字 | 波多野结衣在线免费观看视频 | 一级黄色片免费在线观看 | 亚洲乱码国产一区三区 | 天天爽夜夜爽一区二区三区 | 日韩欧美啪啪 | 成人免费观看cn | 久久97精品久久久久久久不卡 | 伊人五月天 | 好姑娘在线观看高清完整版电影 | 在线观看久草 | 国产av国片精品 | 同心兄弟| 中文字幕欧美人妻精品 | 国产初高中真实精品视频 | 亚洲 国产 日韩 欧美 | 国产精品久久国产愉拍 | 中文在线а√天堂 | 日韩色| 欧美网| 寂寞少妇让水电工爽hd | av一本二本 | 中文字幕1 | 国产亚洲色婷婷久久99精品91 | 国产精彩视频在线观看 | 91精品久久久久久久久中文字幕 | 永久免费av无码网站性色av | 欧美成人免费一级人片100 | 91麻豆精品国产91久久久久久 | 国产美女引诱水电工 | 中文字幕亚洲乱码 | 香蕉视频A | 午夜少妇影院 | 天天操天天干天天爱 | 三级福利片 | 国产乱视频 | 99精品国产99久久久久久97 | 亚洲精品成a人在线观看 | 在线爱情大片免费观看大全 | 久久精品日韩无码 | 99riav国产精品视频 | 日韩一区二区影视 | 国产三级自拍 | 91网站免费| 久久一区国产 | 4438全国最大成人网 | 国产视频精品久久 | 又粗又大又硬毛片免费看 | 色婷婷导航| 牛牛视频在线观看 | 九九99久久 | 亚洲第一天堂av | 色老头在线视频 | 国内久久 | 欧美日本韩国一区二区 | 国产卡一卡二卡三无线乱码新区 | 91小视频在线观看 | 亚洲尻逼 | 中文字幕123区 | 全国探花 | av观看国产 | 久久精品这里只有精品 | 国产一区欧美日韩 | 日韩av一区二区三区四区 | 被黑人啪到哭的番号922在线 | 污污网站在线免费观看 | 亚洲中文字幕无码不卡电影 |