日韩性视频-久久久蜜桃-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免费 | 69亚洲精品久久久蜜桃小说 | 一区二区三区免费 | 国产日韩欧美视频在线观看 | 亚洲国产精品久久精品怡红院 | 激情爱爱网| 日韩一区二区三区电影 | 国产黄色精品 | 成人精品视频99在线观看免费 | 不卡一区二区三区四区 | 天堂资源中文在线 | 中国新婚夫妻性猛交 | 69国产视频 | 亚洲精品成av人片天堂无码 | 波多野42部无码喷潮 | 98自拍视频| 国产三级在线 | 四虎免费av| 亚洲二区在线播放视频 | 日产精品久久久久 | 久久久精| 国产99久久九九精品无码 | 日本三级大片 | 91网址在线观看 | 成人v| 亚洲第一天堂影院 | 中文字幕一级片 | 欧美大片www | 爱情岛论语亚洲入口 | 精品视频一区二区三区 | 午夜一区二区视频 | 波多野结衣一区二 | 首尔之春在线观看 | 国精产品99永久一区一区 | 国产一级视频免费观看 | 国产精品国产三级国产aⅴ下载 | 日日夜精品 | 国产美女视频免费观看下载软件 | 午夜久久久久久久久久久 | 在线看三级 | 日本免费网址 | 91av国产在线| 三级欧美韩日大片在线看 | av成人免费在线观看 | 老司机深夜影院 | 欧美图片自拍偷拍 | 涩涩视频免费在线观看 | 欧美中日韩在线 | av一区二区三区 | 国产片黄色 | 91九色国产 | 91视频你懂的 | 毛片91| 亚洲一区日本 | 欧美午夜一区二区三区 | 精品无码久久久久 | 538国产精品一区二区 | 国产亚洲综合在线 | 日日夜夜精品免费 | 国产美女一级片 | 亚洲av永久无码精品一百度影院 | 国产成人在线视频免费观看 | 三级特黄 | 强侵犯の奶水授乳羞羞漫虐 | 欧美特级一级片 | 福利精品视频 | 久草久草| 人人干人人舔 | 国产又粗又猛又爽又黄的视频在线观看动漫 | 啪啪小视频 | 自拍 亚洲 欧美 | 亚洲精品 日韩无码 | 欧美巨鞭大战丰满少妇 | 蜜桃视频在线观看一区二区 | 成人av资源站 | 九色在线视频 | 日韩av电影网 | 欧美三级一区二区 | 四虎影视库 | 日韩影音| 色一情一伦一子一伦一区 | 国产精品啊啊啊 | 强行糟蹋人妻hd中文 | 精品九九| 操操操操操操 | 成年人看片网站 | 小镇姑娘国语版在线观看免费 | 欧美日韩中文一区 | 久久超碰精品 | 久久理论电影 | 性自由色xxxx免费视频 | 黄色片a级片 | 国产精品毛片一区二区在线看 | 欧美成人精品激情在线观看 | 西西人体做爰大胆gogo直播 | 国产免费不卡 | 天天色婷婷 | 久久久久国产精品熟女影院 | 午夜写真片福利电影网 |