代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
Java
】
如何获知在一定宽度内可以显示的字符数量
作者:
Dezai.CN
/ 发布于
2011/12/1
/
682
<div> public class MyTest extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING , RenderingHints.VALUE_ANTIALIAS_ON); String s = "A guide to architecting, designing, and building distributed " + "applications with Windows Communication Foundation Windows " + "Communication Foundation is the .NET technology that is used " + "to build service-oriented applications, exchange messages in " + "various communication scenarios, and run workflows."; //1. 用多行字符串构造AttributedString,并设置初始化字体 AttributedString as = new AttributedString(s); as.addAttribute(TextAttribute.FONT, new Font("serif", Font.PLAIN, 40)); //2. 获取文本和属性的迭代器 AttributedCharacterIterator aci = as.getIterator(); //3. 通过迭代器和Graphics的字体渲染上下文获取断行测量器 //该对象可以根据迭代器返回的文本信息和FontMetrics等属性值,再结合当前 //Graphics的渲染上下文计算出每行可以显示的文本。 LineBreakMeasurer lbm = new LineBreakMeasurer(aci,g2.getFontRenderContext()); //4. 结合JPanel的内边属性,计算每行显示的起始x坐标和宽度 Insets insets = getInsets(); float wrappingWidth = getSize().width - insets.left - insets.right; float x = insets.left; float y = insets.top; //5. 开始计算每行可以显示的字符数量同时渲染本行的字符串。 //getPosition()返回当前正在渲染的字符在整个字符串中的索引值。 while (lbm.getPosition() < aci.getEndIndex()) { //5.1 LineBreakMeasurer基于参数传入的宽度,并结合字体的Metrics, //获取当前行应该渲染的文本布局对象。 TextLayout textLayout = lbm.nextLayout(wrappingWidth); //5.2 y + ascent得到的是基线y坐标,并从该点开始绘制本行的文本 y += textLayout.getAscent(); textLayout.draw(g2, x, y); //5.3 baseline + descent + leading得到下一行的ascent的y坐标 y += textLayout.getDescent() + textLayout.getLeading(); //5.4 将baseline的x坐标回归到行起点 x = insets.left; } } public static void main(String[] args) { JFrame frame = new JFrame(); frame.setTitle("Show String with Multiline."); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.setContentPane(new MyTest()); frame.setSize(800, 500); frame.setVisible(true); } }
试试其它关键字
同语言下
.
List 切割成几份 工具类
.
一行一行读取txt的内容
.
Java PDF转换成图片并输出给前台展示
.
java 多线程框架
.
double类型如果小数点后为零则显示整数否则保留两位小
.
将图片转换为Base64字符串公共类抽取
.
sqlParser 处理SQL(增删改查) 替换schema 用于多租户
.
JAVA 月份中的第几周处理 1-7属于第一周 依次类推 29-
.
java计算两个经纬度之间的距离
.
输入时间参数计算年龄
可能有用的
.
List 切割成几份 工具类
.
一行一行读取txt的内容
.
Java PDF转换成图片并输出给前台展示
.
java 多线程框架
.
double类型如果小数点后为零则显示整数否则保留两位小
.
将图片转换为Base64字符串公共类抽取
.
sqlParser 处理SQL(增删改查) 替换schema 用于多租户
.
JAVA 月份中的第几周处理 1-7属于第一周 依次类推 29-
.
java计算两个经纬度之间的距离
.
输入时间参数计算年龄
Dezai.CN
贡献的其它代码
(
4037
)
.
多线程Socket服务器模块
.
生成随机密码
.
清除浮动样式
.
弹出窗口居中
.
抓取url的函数
.
使用base HTTP验证
.
div模拟iframe嵌入效果
.
通过header转向的方法
.
Session操作类
.
执行sqlite输入插入操作后获得自动编号的ID
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3