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);
}
}

时间: 2024-11-03 21:08:43

Graphics2D字符串根据文本框缩小字体自动换行的相关文章

PDF文本框更改字体大小

在Adobe Acrobat  Professional 7.0版本后里单击所插入的文本框,会出现文本框属性,此时只能改文本框的属性,不能修改文本框内的字体大小 要改字体很简单,左键选中要改的文本,按Ctrl+E, 会弹出一个工具栏.  然后就很简单了. 原文地址:https://www.cnblogs.com/qingyuanjushi/p/8445242.html

JavaScript实现,控制一个文本框只能输入正整数,如输入不符合条件则文本框全部字体标红

腾讯2014年研发职位笔试题Web前端方向简单题第一题. 代码: <html> <head> <title>test JavaScript</title> <script> window.onload = function() { var inputInt = document.getElementById('InputInt'); inputInt.onkeyup = function() { var num = this.value; var

MFC静态文本框设置字体和颜色

在MFC中,static text控件可以很方便的显示文字,但是如果想修改字体风格大小以及颜色,应该怎么修改呢? 1.要修改字体,需要用到CFont类,这个类可以修改字体的各种属性 1 CFont m_font; 2 m_font.CreateFont(14,0,0,0,FW_BOLD,FALSE,FALSE,FALSE, 3 ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS, 4 DEFAULT_QUALITY,DEFAULT_PITCH

静态文本框字体,颜色。网络通信软件分析。

设置静态文本框控件的背景色,文本框中字体.颜色: HBRUSH CUDPDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: Change any attributes of the DC here if (pWnd->GetDlgCtrlID()==IDC_STATIC_TITLE) { //设置绘图dc的背

c# asp.net 调用系统设置字体文本框

一,调用系统字体文本框 首先在bin文件夹右击--添加引用--.net标签里选择System.Windows.Forms--确定 然后在cs文件里引入,using System.Windows.Forms; 在代码里写 C#代码   FontDialog fd = new FontDialog(); fd.ShowDialog().ToString(); 就可以调出系统设置字体的那个文本框了 二,用FontDialog弹出的文本框设置字体样式和大小 C#代码   FontDialog fd = 

【Java GUI】文本框和文本区

文本框 文本框(JTextField)是界面中用于输入和输出一行文本的框.JTextField类用来建立文本框.与文本框相关的接口是ActionListener. 文本框处理程序的基本内容有以下几个方面: ①声明一个文本框名. ②建立一个文本框对象. ③将文本框对象加入到某个容器. ④对需要控制的文本框对象注册监视器,监听文本框的输入结束(即输入回车键)事件. ⑤一个处理文本框事件的方法,完成对截获事件进行判断和处理. JTextField类的主要构造方法 JTextField();//文本框的

JS练习 改变文本框状态

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <meta http-equiv="

点击文本框弹出可供选择的checkbox复选框代码实例

点击文本框弹出可供选择的checkbox复选框代码实例:本章节分享一段代码实例,它能够点击文本框的时候,能够弹出下拉的checkbox复选框,选中复选框就能够将值写入文本框中,可能在实际应用中的效果没有这么直白简单,不过可以作为一个例子演示,以便于学习者理解和扩展.代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="author&qu

ASP.NET中页面加载时文本框(texbox控件)内有文字获得焦点时文字消失

代码如下: <asp:TextBox ID="TextBox1" runat="server" Height="26px" MaxLength="10" Width="166px" Text="请输入用户名" OnFocus="javascript:if(this.value=='请输入用户名') {this.value='';this.style.color='#000