博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
格式化文本支持:JTextPane
阅读量:5840 次
发布时间:2019-06-18

本文共 2656 字,大约阅读时间需要 8 分钟。

http://www.cnblogs.com/xingqi/archive/2011/04/20/2022188.html

————————————————————————————————————————————————————————

Java Swing的JTextPane支持格式化文本,即字体、大小、加粗、倾斜、下划线、颜色等,还支持图片、任意组件Component及段落格式等,相关 概念还有文档StyledDocument、编辑器StyledEditorKit、格式集AttributeSet和格式工具 StyleConstants。

常见的聊天窗口之记录框和输入框的显示不太一样,记录框每次都要添加格式化文本,这时需要用到文档模型 的插入文本接口:JTextPane.getDocument().insert(int position, String content, AttributeSet attributes),位置通常可取JTextPane.getDocument().getLength(),格式集可以先new SimpleAttributeSet(),然后用StyleConstants.setFontFamily(attributes,family)等 配置格式,这样格式化文本就可以正常添加了。记录框一般会有两个或多个人的消息,可以将各人的格式分别保存起 来,JTextPane.getStyledDocument().add(String userid, AttributeSet attributes),收到消息时检查是否有格式信息,有的话取出他的格式并适当修改即 可,JTextPane.etStyleDocument().getStyle(String userid),插入文本时可直接从文档获取发送者的格式,如果没有则提供一个默认值。

 

输入框不太一样,修改格式时所有文本都要跟者改变以预览效果,同时输入框还有输入格式的 概念,即格式配置好后再输入内容都是以预定的格式,获得输入格式可用JTextPane.getInputAttributes(),用 StyleConstants配置它后就可以影响之后输入文字的格式了。如果修改了格式,输入框已有的文字需要修改格式,可以用 JTextPane.getStyledDocument().setCharacterAttributes(int offset, int length, Attributes attributes, boolean replace),由于要修改所有输入框文本,所以offset可取0,length可取 JTextPane.getDocument().getLength(),格式集是重新配置的,replace可取false,即不清空原有的格式。如 果只是修改所选文本的格式,用JTextPane.setCharacterAttributes(Attributes attributes, boolean replace)就够了。

 

格式集的配置用 StyleContants,字体setFontFamily,大小setFontSize,颜色setForeground,加粗setBold,倾斜 setItalics,下划线setUnderlined等,获得字体名可用 GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(), 字体包含名字、大小、样式(加粗、倾斜)三要素。如果格式改变了,就把它绑定到即将要发的消息中,对方就可以识别格式并正确显示了。

 

表 情属于图片,加入输入框时需要使用文本插入的接口,JTextPane.getDocument().insert(int position, String emoticon, Attributes attributes),其格式集可为new SimpleAttibuteSet(),StyleConstants.setIcon(attributes, icon),这样显示时就是表情图片了,通过JTextPane.getText()仍能获得全部文本,两个相同表情连续出现时可能只显示一个,这时可以 简单插入空格。

 

记录框显示时需要分析文本,因为表情、超链接等在下层都是纯文本,表情查找可用 String.indexOf,超链接检索可用Pattern.compile("(https?|ftp|file)://[-a-zA- Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]"),这样就能将各类文本以正确的格式添加 了。超链接的格式可以自己配,比如12号+蓝色+下划线等,要响应超链接点击可监听mouseClicked事件,定位鼠标位置 JTextComponent.viewToModel(e.getPoint()),获得文档元素Element = JTextPane.getStyledDocument().getCharacterElement(pos),获得链接地址 (String)element.getAttributes().getAttribute("link"),先插入链接时保存了地址到格式 AttributeSet.addAttibute("link", address),最后打开链接Desktop.getDesktop().browse(URL url)。

 

表 情的删除需要对AbstractDocument设置特殊的DocumentFilter,在remove方法中判断当前位置offset处的元素 Element=StyledDocument.getCharacterElement(pos)是否表情元素,比如获取其格式集 AttributeSet=Element.getAttributes(),提取其icon属性是否为空 StyleConstants.getIcon(as)!=null,如果不空则从位置element.getStartOffset()删除 element.getEndOffset()-element.getStartOffset()个字符即可(需要遍历offset+length之内 的字符,如果有表情则拓宽删除范围),否则交给父类默认处理。

效果图:

 
你可能感兴趣的文章
CITRIX XenAPP/TS打印管理ThinPrint.
查看>>
SQL Server以Online模式创建索引
查看>>
微软开放 .NET 框架源代码
查看>>
Jira迁移及内存调整
查看>>
Exchange Server 2010 SP2 新功能简述
查看>>
使用wxWidgets for C++从资源文件中静态装载图像
查看>>
提高数据库安全性的办法
查看>>
工作流编程循序渐进(8:状态机工作流)
查看>>
3.VMware View 4.6安装与部署-connection server(View Standard Server)
查看>>
Lync Server 2013 实战系列之六:标准版-安装和更新LyncServer 系统
查看>>
MariaDB日志审计 帮你揪出内个干坏事儿的小子
查看>>
Reporting Services目录临时数据库文件存在
查看>>
一个Windows Mobile, Windows Embedded CE工程师的找工经历(一)
查看>>
终于有了MSDN上的Blog
查看>>
PHPUnit学习03---使用Mock对象解决测试依赖
查看>>
java类型与Hadoop类型之间的转换
查看>>
允许SQL Server 2005远程连接
查看>>
微软为asp.net ajax和jquery创建了CDN
查看>>
Chris:怎样成为一名Android应用开发
查看>>
常见的makefile写法【转】
查看>>