做游戏的时候,特别是在一些对话比较多的情况下,如RPG游戏,常常遇到文字的断行显示问题
如何做到不管如何变化文字,都能够比较好地显示呢,下面有一个函数可以对文字进行分行,然后就可以一行行地打印了
第四个参数主要是对像英语这样多个字母组成一个单词的语言而设置的,因为像英语你不能把一个单词一分为二成两行的,可以传入一些分词的标志,如空格、标点符号什么的,如“ ,.?!”
中文没有关系
但是日文我也闹不大清楚,不知道它是怎么分词的,是和中文一样,还是和英文一样
/**@todo 对一段文字进行分行,这种分行是针对于某个字体的
* @author efei
* @param strSource String 待分行的字符串
* @param font Font 使用的字体
* @param width int 分行后需要满足的宽度
* @param strSplit String 断词判断字符,如空格和一些标点符号。中文不需要断词,则传空字符串
* @return Vector
*/
public Vector getSubsection(String strSource,Font font
,int width,String strSplit){
Vector vector = new Vector();
String temp=strSource;
int i,j;
int LastLength = 1;
int step = 0;
try{
while (!temp.equals("")) {
i=temp.indexOf("/n");
if(i>0){
if(font.stringWidth(temp.substring(0,i-1)) >= width){
i = -1;
}
}
if(i==-1){
if(LastLength>temp.length()){
i = temp.length();
}else{
i = LastLength;
step = font.stringWidth(temp.substring(0, i)) > width ? -1 : 1;
//得到临界点
if(i<temp.length()){
while (! (font.stringWidth(temp.substring(0, i)) <= width
&& font.stringWidth(temp.substring(0, i + 1)) > width)) {
i = i + step;
if (i == temp.length())
break;
}
}
}
//断词,如果需要的话
if(!strSplit.equals("")){
j = i; //把初始值记录下来,是因为有可能出现一种情况,这种情况就是这一行只有这么一个单词,会一直搜索到头
if (i < temp.length()) {
while (strSplit.indexOf(temp.substring(i-1,i))==-1) {
i--;
if (i == 0) {
i = j; //恢复
break;
}
}
}
}
}
LastLength = i;
vector.addElement(temp.substring(0, i));
if (i == temp.length()) {
temp = "";
}
else{
temp = temp.substring(i);
if (temp.substring(0, 1).equals("/n")) {
temp = temp.substring(1);
}
}
}
}catch(Exception e)
{
System.out.println("getSubsection:"+e);
}
return vector;
}
使用示例:
int gintLineHeight = 15;//全局变量,行高
int gintBeginIndex = 0;//全局变量,在keyPressed里改变它的值,便可以实现上下翻页
String str = "方便起见,可以定义一个行高作为全局变量,这样比较好,写个简单的例子:"
Vector vector = getSubsection(str,Font.getDefaultFont(),getWidth(),"");
for(int i=gintBeginIndex;i<vector.size();i++){
g.drawString((String)vector.elementAt(i),0,gintLineHeight*i,0);
if((i-mintBeginIndex+1)*gintLineHeight>getHeight())break;
}
vector = null;
如何做到不管如何变化文字,都能够比较好地显示呢,下面有一个函数可以对文字进行分行,然后就可以一行行地打印了
第四个参数主要是对像英语这样多个字母组成一个单词的语言而设置的,因为像英语你不能把一个单词一分为二成两行的,可以传入一些分词的标志,如空格、标点符号什么的,如“ ,.?!”
中文没有关系
但是日文我也闹不大清楚,不知道它是怎么分词的,是和中文一样,还是和英文一样
/**@todo 对一段文字进行分行,这种分行是针对于某个字体的
* @author efei
* @param strSource String 待分行的字符串
* @param font Font 使用的字体
* @param width int 分行后需要满足的宽度
* @param strSplit String 断词判断字符,如空格和一些标点符号。中文不需要断词,则传空字符串
* @return Vector
*/
public Vector getSubsection(String strSource,Font font
,int width,String strSplit){
Vector vector = new Vector();
String temp=strSource;
int i,j;
int LastLength = 1;
int step = 0;
try{
while (!temp.equals("")) {
i=temp.indexOf("/n");
if(i>0){
if(font.stringWidth(temp.substring(0,i-1)) >= width){
i = -1;
}
}
if(i==-1){
if(LastLength>temp.length()){
i = temp.length();
}else{
i = LastLength;
step = font.stringWidth(temp.substring(0, i)) > width ? -1 : 1;
//得到临界点
if(i<temp.length()){
while (! (font.stringWidth(temp.substring(0, i)) <= width
&& font.stringWidth(temp.substring(0, i + 1)) > width)) {
i = i + step;
if (i == temp.length())
break;
}
}
}
//断词,如果需要的话
if(!strSplit.equals("")){
j = i; //把初始值记录下来,是因为有可能出现一种情况,这种情况就是这一行只有这么一个单词,会一直搜索到头
if (i < temp.length()) {
while (strSplit.indexOf(temp.substring(i-1,i))==-1) {
i--;
if (i == 0) {
i = j; //恢复
break;
}
}
}
}
}
LastLength = i;
vector.addElement(temp.substring(0, i));
if (i == temp.length()) {
temp = "";
}
else{
temp = temp.substring(i);
if (temp.substring(0, 1).equals("/n")) {
temp = temp.substring(1);
}
}
}
}catch(Exception e)
{
System.out.println("getSubsection:"+e);
}
return vector;
}
使用示例:
int gintLineHeight = 15;//全局变量,行高
int gintBeginIndex = 0;//全局变量,在keyPressed里改变它的值,便可以实现上下翻页
String str = "方便起见,可以定义一个行高作为全局变量,这样比较好,写个简单的例子:"
Vector vector = getSubsection(str,Font.getDefaultFont(),getWidth(),"");
for(int i=gintBeginIndex;i<vector.size();i++){
g.drawString((String)vector.elementAt(i),0,gintLineHeight*i,0);
if((i-mintBeginIndex+1)*gintLineHeight>getHeight())break;
}
vector = null;