<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-208  評論-469  文章-30  trackbacks-0

    通常在網頁里都有一種這樣的需求,為了界面整潔,在顯示標題時需要把長標題以部分加省略號連綴顯示,就比如中國博客網顯示日志標題--下面那樣

    ·在VC6中使用正則表達式解析...(2007-06-24)?
    ·VC中使用CInternet...(2007-06-23)?
    ·開源嵌入式數據庫 SQLit...(2007-06-23)?

    問題一是前面那部分字符串怎么來確定,上面很明顯示的看得出來,因為標題中混雜著中英文,仍然沒有達到初衷。

    大部分的實現方式是原字符串超過一定的長度一切取前面指定個數的字符然后加上省略號,顯示中文和英文是不能同等對待,10個漢字的寬度一般來說要大于10字母的寬度,再聰明一點就是近似把一個漢字折算成兩個字母寬度來估算,可是還要注意一點即使全是英文,10個W也要比10i寬得多,還是未能得嘗所愿。

    對于單純的切取前面若干字符的支持有一些現成的東西:
    1. Jakarta Commons Lang 中的 StringUrl.abbreviate() 工具方法
    2. prototype.js 中的 truncate 函數
    3. CSS 樣式表 text-overflow:ellipsis 或 -o-text-overflow:ellipsis (opera中)
    可是第三種方法又有點傻,會根據你所設字符集可能從半個字符中斷開,產生亂碼,前面兩種方法以雙字節字符來處理,沒這個問題。你可把第二個<div>拷貝出來,文件存成UTF-8 或別的字符集文件來試試。

    < div? style ="border:1px?solid?red;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis;white-space:nowrap;width=60" > I?am?Unmi </ div >

    效果如右所示:
    I am Unmi

    <div?style="border:1px?solid?red;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis;white-space:nowrap;width=60">我在哪里</div>

    效果如右所示:
    我在哪里

    費了這么多像素,這才真正切入正題,字符串真正寬度總是跟選用的字體名、字型、大小有關,下面要介紹的方法就是依據顯示所用的字體、字形、大小可算出每一個字符在屏幕上的真正顯示寬度單位,不管是中文還是英文、是W還是i都可以在正確的位置切下去。

    如假設一個中文字是12個單位寬度,那么W是12個單位寬度,i是2個單位寬度。

    實現代碼如下:getFitWidthString 傳入一個字符串及預設顯示寬度單位,可能不是真正的像素。

    public?static?String?getFitWidthString(?Object?object,?int?point?){
    ????String?str?
    =?(?null?==?object?)???""?:?object.toString();
    ????
    //假定網頁顯示字符用的是?11pt?的?宋體?普通字體
    ????FontMetrics?fm?=?Toolkit.getDefaultToolkit().getFontMetrics(new?Font("宋體",?Font.PLAIN,?11));
    ????
    int?length?=?0;
    ????
    int?pos?=?0;
    ????
    for(?int?i?=?0;?i?<?str.length();?i++){
    ????????
    int?currlen?=?fm.charWidth(?str.charAt(?i?)?);
    ????????length?
    +=?currlen;
    ????????
    if(?length?>?point?){
    ????????????
    continue;
    ????????}

    ????????pos?
    =?i-1;
    ????}

    ????pos
    =pos<0???0?:?pos;
    ????
    if(?point?<?length?){
    ????????
    return?str.substring(?0,?pos?)?+?"";
    ????}

    ????
    else{
    ????????
    return?str;
    ????}

    }

    回到最早的那個例子,如果用getFitWidthString來截取字符串執行如下碼,我們可以看看輸出效果

    System.out.println(getFitWidthString("在VC6中使用正則表達式解析字符串",?160));
    System.out.println(getFitWidthString(
    "VC中使用CInternetSession抓取網頁內容",?160));
    System.out.println(getFitWidthString(
    "開源嵌入式數據庫?SQLite?簡介",?160));

    取了160個輸出單位寬度,輸出

    在VC6中使用正則表達式解...
    VC中使用CInternetSessio...
    開源嵌入式數據庫 SQLite 簡介

    是不是更準確了些,當然還有些瑕疵,單個字符占寬度單位多的話誤差也會大一些,你可以對上面的程序進行修正更滿足您的需求。

    因為用到了AWT圖形環境的東西,所以如果你是在控制臺下啟動的應用服務器就需要作些配置,就像WEB應用使用了JFreeChart來畫圖也是需要為Unix/Linux控制臺下啟動的應用服務器作些配置,Tomcat要在啟動腳本中加個參數,WAS的話要下載一個插件,Windows下總是在圖形環境下,無需作額外設置。

    posted on 2007-07-05 01:18 EricWong 閱讀(340) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 中文字幕亚洲一区二区va在线| 国产成人精品免费午夜app| 99久久免费精品视频| 91福利免费网站在线观看| 日本无卡码免费一区二区三区| 亚洲jizzjizz在线播放久| 日本免费网址大全在线观看 | 国产亚洲精品欧洲在线观看| 在线A级毛片无码免费真人 | 亚洲综合无码AV一区二区| 一个人看的免费观看日本视频www 一个人看的免费视频www在线高清动漫 | 日本免费xxxx| 激情综合亚洲色婷婷五月APP| 国产片AV片永久免费观看| 亚洲娇小性色xxxx| 亚洲成人网在线观看| 亚洲精品无码专区久久久| 国产精品免费久久久久电影网| 亚洲 另类 无码 在线| 亚洲精品黄色视频在线观看免费资源 | 一级视频在线免费观看| 亚洲线精品一区二区三区影音先锋| GOGOGO高清免费看韩国| 亚洲电影一区二区三区| 日本阿v免费费视频完整版| 亚洲精品国产精品| 亚洲午夜无码片在线观看影院猛 | 亚洲女人初试黑人巨高清| 在线视频免费观看www动漫| 亚洲国产美国国产综合一区二区 | 国产亚洲?V无码?V男人的天堂| 精品国产福利尤物免费| 成人超污免费网站在线看| 99亚偷拍自图区亚洲| 亚洲精品和日本精品| 国产免费爽爽视频在线观看| 久久综合久久综合亚洲| 亚洲综合色自拍一区| 在人线av无码免费高潮喷水| 免费看黄福利app导航看一下黄色录像 | 亚洲第一成年免费网站|