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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

在 JavaFX 中,如何计算文本所占像素的宽度

發(fā)布時間:2024/4/13 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在 JavaFX 中,如何计算文本所占像素的宽度 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在 JavaFX 中,如何計算文本所占像素的寬度

  • 注意事項
  • 算法
  • 代碼
    • 計算單行文本的像素寬度
    • 計算文本框尺寸

??JavaFX 的惱人之處在于很多基本的操作都要自己親力親為。有些時候,我們希望 TextArea 能自動根據(jù)文本內(nèi)容換行以及調(diào)整大小。換行是 TextArea 中已經(jīng)有的功能,不過這也帶來了新的問題。在 JavaFX 中,可以使用 Text 對象的方法 .getBoundsInLocal().getWidth() 測得文本的基本尺寸。不過,依然有很多要注意的問題。


【注意】

??不同的符號的尺寸是不同的,不僅是中文漢字與英文字母,就連運算符、數(shù)字、英文字母之間的尺寸也不盡相同。不要自行編寫自適應(yīng)各種 Unicode 符號的算法。應(yīng)該使用 JavaFX 內(nèi)置的 API,如 Text 類的方法 Text對象.getBoundsInLocal().getWidth()。


注意事項

??主要的注意事項如下:

  • 計算后最終的行寬值不會大于 TextArea 的行寬值。另外,當(dāng)文本內(nèi)容超過 TextArea 的最大寬度時,會觸發(fā)換行。因此,還需要計算 TextArea 自動換行后的行數(shù)。

  • 用戶輸入的原始內(nèi)容中就有可能包含換行。對這種情況可以有不同的處理方案,但是需要考慮這個問題。如果不選擇直接去除換行符,則需要先將用戶輸入分割成各個不含換行符的文本,然后分別統(tǒng)計這些文本的行數(shù)與最大行寬,最后加行數(shù)相加,并來取這些最大行寬中的最大值。

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

  • 行數(shù)只能是整數(shù)。另外,如果使用整數(shù)除法,需要將結(jié)果加 1。因為不滿 1 行也需要占用一行。

  • 考慮用戶的特殊輸入:

    • 輸入為空串

    • 輸入的內(nèi)容全是換行符

    • 輸入的內(nèi)容存在連續(xù)的換行符

    • 輸入的開頭是換行符

算法

??實現(xiàn)的算法大致如下:

(假設(shè):當(dāng)用戶輸入內(nèi)容包含換行符時,不管是否連續(xù),也直接進行原始輸出而不刪除。當(dāng)用戶輸入的內(nèi)容為空時,不報錯,也直接視文本長度為 0 來計算)

  • 判斷輸入是否為 null 或空串,如果是,視文本行寬為 0,行數(shù)為 1。如果不是,進行下一步。

  • 判斷輸入是否只有換行符,如果是,視文本行寬為 0,行數(shù)為換行符的個數(shù)。如果不是,進行下一步。

  • 將輸入按照換行符分割成各個不含換行符的文本,然后先計算單個文本尺寸,最后疊加。方法如下:

  • 計算單個文本的尺寸。方法如下:

  • 求文本的原始像素長度。

  • 計算文本的行寬值:取像素長度與單行文本最大長度之間的最小值。

  • 計算文本的行數(shù):將像素長度除以單行文本最大長度,然后向上取整。

  • 計算整個文本的行寬值:取各個文本行寬值的最大值。

  • 計算整個文本的行數(shù):將各個文本行數(shù)值累加。

  • 計算文本框的寬度:將文本的行寬值與文本框左右內(nèi)邊距相加。

  • 計算文本框的長度:將文本的行數(shù)乘以單行文本行高,然后加上文本框上下內(nèi)邊距。

  • 代碼

    ??核心代碼如下。

    計算單行文本的像素寬度

    public static double calculateTextPixelWidth(String text, Font font) {Text theText = new Text(text);theText.setFont(font);return theText.getBoundsInLocal().getWidth(); }

    計算文本框尺寸

    /*** @param originText 內(nèi)文本的內(nèi)容* @param font 內(nèi)文本的字體* @param lineSeparator 換行符的定義* @param originMaxWidth 內(nèi)文本最大的行寬* @param rowExtension 對話框橫向兩端與內(nèi)文本的邊距* @param originSingleHeight 內(nèi)文本一行的高度* @param columnExtension 對話框縱向向兩端與內(nèi)文本的邊距* @return 計算出的對話框的寬度。其中,[0] 代表寬度,[1] 代表高度*/public static double[] calculateTextBoxSize(String originText, Font font, String lineSeparator,double originMaxWidth, double rowExtension,double originSingleHeight, double columnExtension) {double maxRowLength = 0;int formattedColumnNum = 0;if (originText != null && !"".equals(originText)) {var texts = originText.split(lineSeparator);if (texts.length == 0) { // 如果文本中只有換行符maxRowLength = 0;formattedColumnNum = originText.length() + 1; // 注意要加 1} else {double singleRowLength = 0;for (var text : texts) {var singleOriginWidth = calculateTextPixelWidth(text, font);singleRowLength = Math.min(singleOriginWidth, originMaxWidth); // 注意:這是求最小值maxRowLength = Math.max(maxRowLength, singleRowLength); // 注意:這里求最大值formattedColumnNum += (int) (singleOriginWidth / originMaxWidth) + 1; // 注意要加 1}}}double[] result = new double[2];result[0] = maxRowLength + rowExtension * 2;result[1] = formattedColumnNum * originSingleHeight + columnExtension * 2;return result;}

    ??對于 TextArea,其換行符為 \n,因此可以使用如下代碼:

    /*** @param originText 內(nèi)文本的內(nèi)容* @param font 內(nèi)文本的字體* @param originMaxWidth 內(nèi)文本最大的行寬* @param rowExtension 對話框橫向兩端與內(nèi)文本的邊距* @param originSingleHeight 內(nèi)文本一行的高度* @param columnExtension 對話框縱向向兩端與內(nèi)文本的邊距* @return 計算出的對話框的寬度。其中,[0] 代表寬度,[1] 代表高度*/ public static double[] calculateTextBoxSize(String originText, Font font,double originMaxWidth, double rowExtension,double originSingleHeight, double columnExtension) {String lineSeparator = "\n"; // TextArea 中的換行符為 '\n'return calculateTextBoxSize(originText, font, lineSeparator,originMaxWidth, rowExtension, originSingleHeight, columnExtension); } 超強干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達旦的技術(shù)人生

    總結(jié)

    以上是生活随笔為你收集整理的在 JavaFX 中,如何计算文本所占像素的宽度的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 成年人网站av | 国产av剧情一区 | www在线看片 | 国产伦精品一区二区三区四区 | 天天天天躁天天爱天天碰2018 | 无码免费一区二区三区免费播放 | 国内精品久久久 | 3d动漫精品啪啪一区二区免费 | 大香伊人久久 | 伊人草 | www黄色com | 亚洲视频在线免费播放 | 91精品免费看 | 成人av免费在线观看 | 五月天国产视频 | 亚洲香蕉av | 日日淫 | 黄色精品一区二区 | 激情伊人五月天 | 日朝毛片 | 欧美一区二区三区四区五区 | www.日韩| 一区二区三区不卡视频 | 丁香色综合 | 男女激情久久 | 久久精品亚洲精品国产欧美 | 91免费片| 中国少妇av| 国产成人久久久 | 亚洲色图自拍 | 亚洲免费婷婷 | 大尺度做爰床戏呻吟舒畅 | 日韩字幕在线观看 | 波多野结衣黄色网址 | 亚洲小说区图片区都市 | 亚洲影视一区二区 | 午夜免费视频观看 | 成人爱爱免费视频 | 亚洲黄色第一页 | 成人性生交免费看 | 中文字幕码精品视频网站 | 干爹你真棒插曲mv在线观看 | 欧美日批| 超碰碰碰 | av鲁丝一区二区鲁丝 | 懂色a v| 精品热久久| 欧美熟妇乱码在线一区 | 国产精品久久久久久无人区 | 亚洲AV第二区国产精品 | 日本国产一区二区三区 | 中文字幕+乱码+中文 | 黄色成人在线免费观看 | 亚洲精选一区二区 | 极品国产91在线网站 | 久久精品国产99久久不卡 | 天堂在线中文资源 | 日本理论中文字幕 | 国产高清成人 | 欧美bdsm调教视频 | 成人黄色性视频 | a视频在线 | 四虎免费av | 久久综合久久网 | 国产v片在线观看 | 熟妇无码乱子成人精品 | 午夜小视频在线 | 国产中文在线播放 | 四季av国产一区二区三区 | 男性裸体全身精光gay | 嫩草视频在线观看视频 | 亚洲七区 | 久久精品视频观看 | 性色福利 | 落日余晖| 天天做夜夜做 | 日韩高清不卡在线 | 无码人妻少妇色欲av一区二区 | 日韩一级片中文字幕 | 欧美手机看片 | 亚洲色图偷拍视频 | 日韩欧美一 | 国产午夜精品久久久久久久久久 | 亚洲欧美日韩综合在线 | 日本国产在线观看 | 欧美黄色a级 | 中文久久乱码一区二区 | 少妇一级淫免费观看 | 欧美透逼视频 | 日本一区二区在线不卡 | 夜夜爽av | 国产亚洲综合精品 | 一区二区日韩视频 | 少妇粉嫩小泬喷水视频www | 中文在线资源天堂 | 中出精品 | 蜜乳av一区二区 | 公侵犯人妻一区二区 | 成人免费无码大片a毛片 |