`
shappy1978
  • 浏览: 707396 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Kuxi源码分析7 中文断行

    博客分类:
  • J2ME
阅读更多

 

textarea对于中文结尾(断行处刚好是中文)无法正常断行,要解决这个问题,必须了解textarea是如何断行的,实际上查看其代码知道,展示时是通过splitWords函数把文字全部解析为单词,每个单词作为一个text对象添加到frame中,由于单词按照空格间隔,所以无法断中文的"单词".原来TextArea的源码中分词函数如下:

 

	private void splitWords(String fullText, int style) {
		int beginIndex = 0;
		int endIndex = 0;
		String word;
		do {
			endIndex = fullText.indexOf(' ', beginIndex);
			if (endIndex == -1) {
				word = fullText.substring(beginIndex);
			} else {
				word = fullText.substring(beginIndex, endIndex);
			}
			if (word.length() != 0) {
				Text textWidget = new Text();
				textWidget.setText(word);
				if (style != Font.STYLE_PLAIN) {
					textWidget.setDefaultFontStyle(style);
				}
				add(textWidget);
			}
			beginIndex = endIndex + 1;
		} while (endIndex  != -1);
	}
 

Kuix的论坛上提供了下面的替换函数解决中文断行的问题.

 

    private void splitWords(String fullText, int style)
    {
        String str = fullText;//+" ";
        String word="";
        int len = str.length()-1;
        for (int i = 0; i <= len; i++) {
            char ch = str.charAt(i);
            if(i!=len)
                word = word + ch;
            if ((ch >= 48 && ch <= 57) || (ch >= 65 && ch <= 90) || (ch >= 97 && ch <= 122))
                continue;
            if (word.length() != 0 || i==len) {
                Text textWidget = new Text();
                textWidget.setText(word);
                if (style != Font.STYLE_PLAIN) {
                    textWidget.setDefaultFontStyle(style);
                }
                add(textWidget);
                word = "";
            }
        }
    }
 

    应该说是做的很差的函数,对于数字,大小写26个英文子母外的其他字符都作为word的分隔符,这是相当有问题的,实际上应该把中文区间和空格作为分隔的基础,这个方法本身还有一个更大的缺陷,注意到原文的英文式分词是不把空格加进去的,也就是说Kuix默认会把每个text控件用一个空格的间隔分隔开了,所以替换为上述函数的结果就是显示中文虽然可以正常换行,但是每个中文之间都会有一个空格间隔着,看起来不美观,而且也很浪费空间.

    那么这个"隐藏"的空格是哪里来的,查TextArea的源代码,发现getGap的函数很有意思,不是继承Widget从样式中获取,而是直接获得空格的宽度,所以实际上TextArea容器中每个widget的间隔就是一个空格,修改getGap函数可以去掉空格:

 

	/* (non-Javadoc)
	 * @see org.kalmeo.kuix.widget.Widget#getGap()
	 */
	public Gap getGap() {
		if (cachedGap == null) {
//			cachedGap = new Gap(getFont().charWidth(' '), 0);
			cachedGap = new Gap(0, 0);
		}
		return cachedGap;
	}

    这样可以去掉中文之间的间隔,但是如果你试着去读取6,7页中文数据的话,立马就会报告Out of memory的错误,每个中文创建一个Text显然是相当浪费的,更完美的解决方案当然是自己断行.这里顺便说一下Kuix的标签和分行机制,首先看一下我的一个测试断行的分析描述:

 

 

1 无标签时支持<break/>
2 textarea不支持<break/>,不继承上一级容器的align属性,默认align是top,有中文时断行错误,出现只有很少文字的一行.
3 对英文断行也有缺陷,如果第一个单词就过长,会超出界限
4 多个空格也认为是1个空格,不支持回车,\n,<br>会保错
5 有意思的属性styled,default false,用途
Define if the text area use pseudo html style syntax. The value is a boolean (true or false).
假冒html样式?似乎是采用html的样式?整个reflow()函数都在为这个属性服务

     测试结果发现textarea似乎支持有限的html标签,实际上支持的html标签包括 img,i,b,strong,u,br,p,div等,也就是说对html标签的支持只包含字体,段落回车和图片。但是如果直接写在标签中都必须做转义才能使用,否则会报Unknow tag的错误,比如<br/>必须转义为&lt;br/&gt;还有另外一种形式可以不用转义,此时可以直接写入html标签和<break/>,如下:

<textarea style="align:top-left"><![CDATA[test<br>new line]]></textarea>

    这个是题外话,需要进一步了解请自行看TextArea.reflow和LightXmlParser的代码,注意到reflow大多数的代码其实都是解析和实现简单的html标签。

    Kuix断行实际上是依靠text来实现的,textarea只不过保证英文单词不被拆分在不同的行,而且猜测默认都是采用flowlayout来实行布局。要实现软回车,必须自己加上Kuix的标准标签<break></break>.而这个标签上面说过,在textarea的内容中也是不支持的.那么要实现中文断行,而且效果较好的话,就只能自己根据屏幕大小和字体断行,另外TextArea还有一个问题就是本身不支持textfield的编辑功能,这也是一个相当大的缺陷,作者说是因为两者展示时采用的方法不同,要实现它的编辑功能,必须另外弹出一个窗口进行编辑,具体方法不再提供,这里只分析Kuix的断行的处理方式,大家可以从网上另外找寻中文断行的代码参考.

    修改后的textarea效果如下:
    讨论了那么多,实际上还引申了一个问题,Kuix的断行依据,Kuix的布局方式是相当特殊的,我想这也是它不支持横向滚动条的原因,虽然widget有width属性,但是无论样式和属性中,实际都上没有对width数值的设置,反而是有一个min-size的允许设置最小的尺寸,当控件内容超多最小尺寸时,控件会自动伸展,也就是说实际上widget是没有固定大小的,系统在doLayout时再去计算实际大小,这实际上导致了一个问题,当控件的内容(如textfield的文字)发生变化是,widget会自增长,甚至超出屏幕的宽度.
  • 大小: 29 KB
  • 大小: 66 KB
  • 大小: 32 KB
0
0
分享到:
评论
3 楼 bruce0601 2010-08-11  
只能自己根据屏幕大小和字体断行????
2 楼 shappy1978 2009-11-03  
好的框架即使有些缺陷,还是不妨碍使用的,毕竟是开源的东西,断行这个问题在官方的论坛上应该是讨论最多的话题,作者的在reference没有介绍,相当多的人一接触到Kuix就很容易碰到这个问题.
1 楼 mingkg21 2009-11-02  
这个一年前就跟作者提过了,一直没改进。。

KUIX好久没更新了,我也很久没用了。不知道是不是停了。

相关推荐

    ku-input qt输入法

    这通常涉及到汉字拼音数据库的使用,以及对用户输入的实时分析和预测。 3. **软键盘设计**: 软键盘是在没有物理键盘的设备上提供输入的虚拟键盘。在qt输入法中,软键盘可能是通过Qt的QGraphicsView或QWidget等部件...

    Ku波段收发组件设计分析.pdf

    Ku波段射频收发组件的研制,本文对毫米波收发组件进行研 究,其具有频率高、波长短、波束窄、精度高、抗干扰能 力强和容量大等特点

    基于Cocos Creator的Ku双端框架设计源码

    该项目是利用Cocos Creator技术构建的Ku双端框架设计源码,总计包含219个文件,涵盖90个元数据文件、54个TypeScript文件、41个Python文件、9个JSON文件、6个Prefab文件、3个ZIP文件、2个MP3音频文件、2个PNG图像文件...

    Ku波段卫星通信雨衰计算及分析 外文翻译

    Ku波段卫星通信雨衰计算及分析 外文翻译

    ASP源码—KU6高清影视爬虫 v2.0.zip

    ASP源码—KU6高清影视爬虫 v2.0.zip 是一个基于ASP(Active Server Pages)编程语言的网络爬虫程序,专为抓取KU6高清影视网站的资源而设计。KU6是中国知名的在线视频分享平台,提供丰富的高清影视内容。此爬虫程序的...

    ASP实例开发源码-KU6高清影视爬虫asp版 v2.0.zip

    【ASP源码分析】 在"ASP实例开发源码—KU6高清影视爬虫asp版 v2.0.zip"中,我们可以预期找到以下几个关键部分: 1. **HTML模板**:用于呈现抓取到的视频信息,通常包含HTML和嵌入的VBScript或JScript代码。 2. **...

    FPGA SATA IP,K7 V7 KU等全系列支持,可提供源码或网表,附赠使用手册与测试例程 SATA 1 2 3全速支持,三星 凯侠等SSD均通过测试,SATA3速度实测写450MB s,读实

    FPGA SATA IP,K7 V7 KU等全系列支持,可提供源码或网表,附赠使用手册与测试例程。 SATA 1 2 3全速支持,三星 凯侠等SSD均通过测试,SATA3速度实测写450MB s,读实测470MB s,速度稳定可靠。 命令接口简单易操作,...

    su'do'ku_sudoku_MATLAB解数独_matlab_数独游戏_数独_源码

    标题中的"su'do'ku_sudoku_MATLAB解数独_matlab_数独游戏_数独_源码"明确指出我们将探讨的是使用MATLAB编程解决数独谜题的方法。MATLAB的高效性和灵活性使得它能够快速构建和测试算法,为数独谜题提供解决方案。 ...

    ku6网视频下载器ku6downsetup

    【ku6网视频下载器ku6downsetup】是一款专门针对ku6网站的视频下载工具,旨在帮助用户方便快捷地将ku6网站上的视频资源保存到本地。这款软件因其易用性和高效性而受到用户的认可,使得用户能够离线观看原本在线的ku6...

    ku波段高频头电路

    ku波段高频头电路,介绍KU波段高频头的有关电路及相关设计

    TCL TSUMV36KU

    TCL王牌LCD32P08A TSUMV36KU LF机芯 HKC 是TCL品牌下的一款液晶电视产品,其型号为LCD32P08A。该产品采用了TSUMV36KU LF机芯,并且是由香港HKC公司生产的。LCD32P08A是该系列液晶电视中的一个型号,LCD指的是液晶...

    ku6视频聊天室源代码

    【ku6视频聊天室源代码】是一个用于在线视频交流的平台,其核心技术涵盖了网络通信、音视频编解码以及实时传输等多个方面。源代码的提供为开发者提供了深入了解和研究视频聊天室实现机制的机会,同时也为自定义开发...

    ku6downsetup

    7. **播放列表管理**:用户可以创建和管理自己的播放列表,方便组织和观看视频。 综合以上信息,"ku6downsetup"是一款集视频下载和播放于一体的工具,专为酷6网用户设计,提供便捷的视频获取和播放体验。它的易用性...

    获取网页源码

    3. **数据分析**:通过对网页源码进行解析,提取出有价值的数据进行统计分析。 #### 六、扩展学习 除了上述基本方法外,还可以探索更高级的技术和工具,如使用 Selenium 或 Puppeteer 这样的浏览器自动化工具进行...

    Common库源码

    7. **性能优化**:Common库的源码中可能会包含一些性能优化的技巧,如内存池管理、缓存机制等。通过研究源码,我们可以学习到如何提升代码的运行效率。 8. **设计模式**:源码中往往体现了多种设计模式,如工厂模式...

    Ku波段微带天线阵的设计

    ### Ku波段微带天线阵的设计 #### 概述 随着卫星通信技术的发展和频谱资源日益紧张,实现高效能、多用途的天线设计成为研究的重点之一。特别是对于Ku波段微带天线阵的设计尤为重要。本文介绍了一种适用于Ku波段的...

    基于FMC+的KU115KU085高性能PCIe载板.docx

    基于FMC+的KU115KU085高性能PCIe载板 本文档介绍了一款基于FMC+的高性能PCIe载板,采用Xilinx公司Kintex UltraScale系列FPGA芯片,具备高性能计算、高速数据交互和灵活的扩展接口。下面是该载板的详细知识点: 1. ...

    GMA302KU Datasheet

    **GMA302KU 数据表详解** GMA302KU 是一款高性能的G-Sensor(重力感应传感器),广泛应用于移动设备、...参考提供的“GMA302KU-中文简洁版.pdf”和“GMA302KU Datasheet V1.0.pdf”文件,可以获取更详尽的技术信息。

    ku6影视小偷 1.0.rar

    《ku6影视小偷 1.0》是一个基于ASP编程语言开发的简易视频资源采集程序。这个1.0版本的特点在于其清爽无广告的界面,为用户提供了良好的使用体验。程序设计者有意预留了广告位,暗示后续版本将可能集成广告功能,以...

    ku6影视小偷 v2.0.rar

    此次更新变化不大,主要是修复了一些出站链接,这些错误基本都是由目标站更新导致。 老用户请覆盖search.asp 和 index.asp ...演示地址:http://www.bai00.com/movie/ku6 此次更新时间 2010/6/11

Global site tag (gtag.js) - Google Analytics