Graphics2D字符串根据文本框缩小字体自动换行
/**
*
*描述: 长字符串缩小字体自动换行
*@param g
*@param text 字符串
*@param lineWidth 单元格宽度
*@param cellHeight 单元格高度
*@param x x坐标
*@param y y坐标
*@param cellFont 原字体
*/
public static void drawStringMultiLine(Graphics2D g, String text, int lineWidth, int cellHeight,int x, int y,Font cellFont) {
FontMetrics m = g.getFontMetrics();
if(m.stringWidth(text) < lineWidth) {
g.drawString(text, x, y);
} else {
/* 使用当前字体, 根据单元格宽度计算出应该打印行数 */
int strWidth = 0;
int widthLine = 1;
char[] chars = text.toCharArray();
for(int i = 0; i < chars.length; i++){
if(m.charWidth(chars[i]) > lineWidth){ //单个字比单元格宽,肯定缩小字体
widthLine = 10000;
break;
}
strWidth += m.charWidth(chars[i]);
if(strWidth > lineWidth){
widthLine++;
strWidth = 0;
i--;
}
}
String name = "Serif";
int style= Font.PLAIN;
int high = 16; //默认16号字
Font font = null;
if ( cellFont != null ){
name = cellFont.getName();
style= cellFont.getStyle();
high = cellFont.getSize();
}
int fontHeight = m.getAscent() + m.getDescent();
/* 计算能打出全部内容时的最大字体 */
int heightLine =2;//一个单元格只能写2行
while ( widthLine > heightLine ){
/* 缩小字体,重复计算应该打印行数和允许打印行数 */
font = new Font( name, style, --high );
m = g.getFontMetrics( font );
/* 字体高度 */
fontHeight = m.getAscent() + m.getDescent();
if ( fontHeight <= 0 )
return;
strWidth = 0;
/* 使用当前字体, 根据单元格宽度计算出应该打印行数 */
widthLine = 1;
for(int i = 0; i < chars.length; i++){
if(m.charWidth(chars[i]) > lineWidth){ //单个字比单元格宽,肯定缩小字体
widthLine = 10000;
break;
}
strWidth += m.charWidth(chars[i]);
if(strWidth > lineWidth){
widthLine++;
strWidth = 0;
i--;
}
}
/* 使用当前字体时,根据单元格高度计算出允许打印行数 */
heightLine = 0;
while((fontHeight*heightLine) <= cellHeight)//最后一行没有行间距
heightLine++;
heightLine--;
if(widthLine <= heightLine)
break;
}
Font oldFont = g.getFont();
Stroke oldStroke = g.getStroke();
g.setFont(font);
g.setStroke(new BasicStroke(1.0f));
/* 分行,计算各行文字内容 */
List<String> rows = new ArrayList<String>();
int fromIndex = 0;
strWidth = 0;
for ( int bgn=0; bgn<text.length(); ){//逐个字符累加计算长度,超过行宽,自动换行
strWidth += m.charWidth(chars[bgn]);
if(strWidth > lineWidth){
rows.add(text.substring(fromIndex, bgn));
strWidth = 0;
fromIndex = bgn;
}
else
bgn++;
}
if(fromIndex < text.length()) // 加上最后一行
rows.add(text.substring(fromIndex, text.length()));
String element;
for (Iterator iter = rows.iterator(); iter.hasNext();) {
element = (String) iter.next();
/* 绘制字符串 */
g.drawString(element, (float)x, (float)(y + m.getAscent()));
y += fontHeight;
}
g.setFont(oldFont);
g.setStroke(oldStroke);
}
}
Graphics2D字符串根据文本框缩小字体自动换行的更多相关文章
- C#Winform使用扩展方法自定义富文本框(RichTextBox)字体颜色
在利用C#开发Winform应用程序的时候,我们有可能使用RichTextBox来实现实时显示应用程序日志的功能,日志又分为:一般消息,警告提示 和错误等类别.为了更好地区分不同类型的日志,我们需要使 ...
- PDF文本框更改字体大小
在Adobe Acrobat Professional 7.0版本后里单击所插入的文本框,会出现文本框属性,此时只能改文本框的属性,不能修改文本框内的字体大小 要改字体很简单,左键选中要改的文本,按 ...
- JavaScript实现,控制一个文本框只能输入正整数,如输入不符合条件则文本框全部字体标红
腾讯2014年研发职位笔试题Web前端方向简单题第一题. 代码: <html> <head> <title>test JavaScript</title> ...
- c# asp.net 调用系统设置字体文本框
一,调用系统字体文本框 首先在bin文件夹右击--添加引用--.net标签里选择System.Windows.Forms--确定 然后在cs文件里引入,using System.Windows.For ...
- asp.net调用系统设置字体文本框的方法
本文实例展示了asp.net调用系统设置字体文本框的方法,是进行web开发中很实用的技巧.具体实现步骤如下: 一.调用系统字体文本框 首先在bin文件夹右击-->添加引用-->.net标签 ...
- Java知多少(85)文本框和文本区
在图形界面中,文本框和文本区是用于信息输入输出的组件. 文本框 文本框(JTextField)是界面中用于输入和输出一行文本的框.JTextField类用来建立文本框.与文本框相关的接口是Action ...
- 十. 图形界面(GUI)设计6.文本框和文本区
在图形界面中,文本框和文本区是用于信息输入输出的组件. 文本框 文本框(JTextField)是界面中用于输入和输出一行文本的框.JTextField类用来建立文本框.与文本框相关的接口是Action ...
- JS练习 改变文本框状态
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- ASP.NET中页面加载时文本框(texbox控件)内有文字获得焦点时文字消失
代码如下: <asp:TextBox ID="TextBox1" runat="server" Height="26px" MaxLe ...
随机推荐
- 点燃圣火! Ember.js 的初学者指南
现在,到处都可以看到复杂的 JavaScript 应用程序. 由于这些应用程序变得越来越复杂,一长串的 jQuery 回调语句,或者通过应用程序在各个点执行不同的函数调用,这些都变得无法再让人接受. ...
- C#常用错误
解决方法: 在配置文件连接数据库设置后加 MultipleActiveResultSets=true; <add key="ConnectionString" value=& ...
- js之事件冒泡和事件捕获
(1)冒泡型事件:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发. IE 5.5: div -> body -> document IE 6.0: div ...
- PHP Fatal Error: call to undefined function mysql_connect() [duplicate]
You shouldn't use mysql_* functions to start with. They are deprecated as of PHP 5.5. Use mysqli or ...
- [阅读笔记]Zhang Y. 3D Information Extraction Based on GPU.2010.
1.立体视觉基础 深度定义为物体间的距离 视差定义为同一点在左图(reference image) 和右图( target image) 中的x坐标差. 根据左图中每个点的视差得到的灰度图称为视差图. ...
- 一句话简单理解javascript中的原型对象
通过构造函数F创建的对象实例p 这个对象p的原型对象是 构造函数中prototype属性指向的对象s,这个对象p中也有个非标准的__proto__属性指向构造函数prototype属性所指向的对象s, ...
- angularjs自定义过滤器
实现一个按输入框中的数据筛选的功能,筛选可按电影的名称.年份.评分检索框: <input type="text" placeholder="可检索名字评分和年份&q ...
- yii2-basic后台管理功能开发之五:用户权限的控制
需求:后台有两种权限+管理员+用户 区别:可以访问的页面不同 解决方法:用户表添加role字段,使用到的是yii2 存取控制过滤器(ACF)方法. >1在web.php中配置授权的类,有两种,我 ...
- Ant 常用语法及选项
project 项目定义,一个ant文件就是一个 project,定义了项目名称,起始位置以及默认执行的 target. <project name="Easily" bas ...
- ZACC_DOCUMENT
method if_ex_acc_document~change. data: wa_extension type bapiparex, ext_value() type c, wa_accit ty ...