这是一个规则(即折行时不能拦腰截断单个单词)显示英文段落的例子,使用的JDK版本是1.3.
我在实践中曾遇到这样一个问题,即,把从MySQL数据库拿到的TEXT类型的英文字符按照指定的单行显示长度规则地(即折行时不能拦腰截断单个单词)显示在画面上.
由于当时的实际情况是用JDK1.3的方式解决,所以当时还真的费了些脑筋,解决这个问题大概花了两个小时.下面就是例程.其基本思路是,先按空格取出字符串中的单词,再按指定的长度把单词拼成行.
/*
* Copyright (c) 2004 zhangzengzhi
* All rights reserved.
* $
*/
import java.util.ArrayList;
import java.util.List;
/**
* @author 张增志---zhangzengzhi
* @version 1.0 2004/11/29 Created initially.
*
* EnWordsTest.java
*
*/
public class EnWordsTest {
private static List wordsList = new ArrayList();
private static List enWordsList = new ArrayList();
private static void resolveEnWords(String p_sentence) {
String sentence = p_sentence;
if (p_sentence.indexOf(" ") != -1) {
int i_comma = sentence.indexOf(" ");
String temp = sentence.substring(0, i_comma);
wordsList.add(temp);
sentence = sentence.substring(i_comma + 1, p_sentence.length());
resolveEnWords(sentence);
} else {
wordsList.add(sentence);
}
}
private static List getWordsList(String p_sentence) {
wordsList.clear();
resolveEnWords(p_sentence);
return wordsList;
}
private static void splitEnWordsToList(List wordsList, int len) {
List t_list = wordsList;
String t_word = "";
int word_len = 0;
for (int i = 0; i < t_list.size(); i++) {
String word = (String) t_list.get(i);
word_len += word.length() + 1;
if (word_len <= len) {
t_word = t_word + word + " ";
if (i == t_list.size() - 1) {
enWordsList.add(t_word.trim());
return;
}
} else {
word_len = 0;
enWordsList.add(t_word);
splitEnWordsToList(t_list.subList(i, t_list.size()), len);
return;
}
}
}
/**
* split a English String to List according to specific length.
*
* Bug1: len < word.length() then throw java.lang.StackOverflowError
*
* @param p_sentence English String
* @param len display length of one line
* @return String List
*/
public static List getSplitEnWordsList(String p_sentence, int len) {
enWordsList.clear();
if (p_sentence != null && !p_sentence.equals("")) {
List words = getWordsList(p_sentence);
if (words.size() == 1) {
return words;
}
splitEnWordsToList(words, len);
}
return enWordsList;
}
}
上述例程中已知的一个BUG是单行显示长度如小于某个英文单词的长度,就会出错.但是这种情况在实际中出现的可能性几乎没有,所以当时就只作记录而忽略处理了.