Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 345|回复: 0

[Swing学习]较为完美的一种标题缩略显示方法

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-3 23:55:47 | 显示全部楼层 |阅读模式
    通常在网页里都有一种这样的需求,为了界面整洁,在显示标题时需要把长标题以部分加省略号连缀显示,就比如中国博客网显示日志标题--下面那样 ・在VC6中使用正则表达式解析...(2007-06-24)  
    ・VC中使用CInternet...(2007-06-23)  
    ・开源嵌入式数据库 SQLit...(2007-06-23)       问题一是前面那部分字符串怎么来确定,上面很明显示的看得出来,因为标题中混杂着中英文,仍然没有达到初衷。      大部分的实现方式是原字符串超过一定的长度时一律取前面指定个数的字符然后加上省略号,显示中文和英文是不能同等对待,10个汉字的宽度一般来说要大于10字母的宽度,再聪明一点就是近似把一个汉字折算成两个字母宽度来估算,可是还要注意一点即使全是英文,10个W也要比10个i宽得多,还是未能得尝所愿。
      
       
       
         
       

         
       
      
    对于单纯的切取前面若干字符的支持有一些现成的东西:
    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都可以在正确的位置切下去。 实现代码如下: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下总是在图形环境下,无需作额外设置。


      
      
       
       

         
       

         
       
      
    复制代码
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 14:13 , Processed in 0.293513 second(s), 36 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表