本文通过Swing来实现文档简易而不简单的文档编辑器,该文档编辑器的功能包括:

  • 设置字体样式:粗体,斜体,下划线,可扩展
  • 设置字体:宋体,黑体,可扩展
  • 设置字号:12,14,18,20,30,40, 可扩展
  • 设置字体颜色:红色,蓝色,绿色,黄色,黑色,可扩展
  • 设置字体背景颜色:淡蓝,淡黄,淡绿,灰色,无色,可扩展
  • 插入图片
效果如下所示:


本文档编辑器使用Swing的JTextPanel来实现,使用JTextPanel可以实现富文档化,包括设置文档字体,颜色等,还可以插入图片和HTML链接,
而本编辑器实现的关键是,对于字体样式,颜色,大小和字体使用Java封装好的StyledEditorKit的种种Action然后将这些Action通过addAction添加到下拉框对象即可。
  • StyledEditorKit.BoldAction()  粗体
  • StyledEditorKit.UnderlineAction();   下划线
  • StyledEditorKit.ItalicAction();    斜体
  • StyledEditorKit.FontFamilyAction("宋体", "宋体")  宋体
  • tyledEditorKit.FontSizeAction(“12”, 12)  字体大小
  • StyledEditorKit.ForegroundAction("Black",Color.black); 字体颜色
除了以上Java封装良好的支持之外,对字体的背景色,插入图片就没有那么好的待遇了,这些实现必须通过其他方式来实现,对于设置字体的背景色,可以通过查看StyledEditorKit.ForgroundAction的源代码,自行写出一个类,可见下面DocBackgroundAction类,但是插入图片就没有那么幸运了,最终采用的方式是使用JTextPanel提供的insertIcon方法来插入图片,但为了和其他方式保持一致性,依然使用Action的方式,具体代码可以参考如下的DocImageAction


                JTextPane docTextPane = new JTextPane();
final JComboBox fontModelCb = new JComboBox();// 字体样式下拉框,包括粗体,下划线和斜体
fontModelCb.setModel(new DefaultComboBoxModel(new String[] {
"\u7C97\u4F53", "\u4E0B\u5212\u7EBF", "\u659C\u4F53" }));
fontModelCb.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
Object sel = e.getItem();
Action ac = null;
System.out.println("fontModelCb itemStateChanged:"
+ sel.toString());
if (sel.equals("\u7C97\u4F53")) {
ac = new StyledEditorKit.BoldAction();
ac.putValue(Action.NAME, "Bold");
} else if (sel.equals("\u4E0B\u5212\u7EBF")) {
ac = new StyledEditorKit.UnderlineAction();
ac.putValue(Action.NAME, "Underline");
} else {
ac = new StyledEditorKit.ItalicAction();
ac.putValue(Action.NAME, "Italic");
}
fontModelCb.setAction(ac);
}
}); final JComboBox fontTypeCb = new JComboBox(); //设置字体下拉框,包括宋体和黑体
fontTypeCb.setModel(new DefaultComboBoxModel(new String[] {
"\u5B8B\u4F53", "\u9ED1\u4F53" }));
fontTypeCb.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
Object sel = e.getItem();
Action ac = null;
System.out.println("fontTypeCb itemStateChanged:"
+ sel.toString());
if (sel.equals("\u5B8B\u4F53")) {
ac = new StyledEditorKit.FontFamilyAction("宋体", "宋体");
} else {
ac = new StyledEditorKit.FontFamilyAction("黑体", "黑体"); }
fontTypeCb.setAction(ac);
}
}); final JComboBox fontSizeCb = new JComboBox();// 设置字体下拉框
fontSizeCb.setModel(new DefaultComboBoxModel(new String[] { "12", "14",
"18", "20", "30", "40" }));
fontSizeCb.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
Object sel = e.getItem();
fontSizeCb.setAction(new StyledEditorKit.FontSizeAction(sel
.toString(), Integer.parseInt(sel.toString())));
}
}); final JComboBox fontColorCb = new JComboBox(); //设置字体颜色下拉框
fontColorCb.setModel(new DefaultComboBoxModel(new String[] {
"\u9ED1\u8272", "\u7EA2\u8272", "\u84DD\u8272", "\u9EC4\u8272",
"\u7EFF\u8272" }));
fontColorCb.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
Object sel = e.getItem();
Action ac = null;
if (sel.equals("\u9ED1\u8272")) {
ac = new StyledEditorKit.ForegroundAction("Black",
Color.black);
} else if (sel.equals("\u7EA2\u8272")) {
ac = new StyledEditorKit.ForegroundAction("Red", Color.red);
} else if (sel.equals("\u84DD\u8272")) {
ac = new StyledEditorKit.ForegroundAction("Green",
Color.green);
} else if (sel.equals("\u9EC4\u8272")) {
ac = new StyledEditorKit.ForegroundAction("Yellow",
Color.yellow);
} else {
ac = new StyledEditorKit.ForegroundAction("Blue",
Color.blue);
}
fontColorCb.setAction(ac);
}
}); final JComboBox fontBgColorCb = new JComboBox(); //设置字体背景下拉框
fontBgColorCb.setModel(new DefaultComboBoxModel(new String[] {
"\u65E0\u8272", "\u7070\u8272", "\u6DE1\u7EA2", "\u6DE1\u9EC4",
"\u6DE1\u84DD", "\u6DE1\u7EFF" }));
fontBgColorCb.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
Object sel = e.getItem();
Action ac = null; System.out.println("fontBgColorCb:" + sel.toString());
if (sel.equals("\u7070\u8272")) {// 灰色
ac = new DocBackgroundAction("LightBlack", new Color(200,
200, 200));
} else if (sel.equals("\u6DE1\u7EA2")) {// 淡红
ac = new DocBackgroundAction("LightRed", new Color(255,
200, 200));
} else if (sel.equals("\u6DE1\u9EC4")) { // 淡黄
ac = new DocBackgroundAction("LightGreen", new Color(255,
255, 200));
} else if (sel.equals("\u6DE1\u84DD")) {// 淡蓝
ac = new DocBackgroundAction("YLightYellow", new Color(200,
200, 255));
} else if (sel.equals("\u6DE1\u7EFF")) {// 淡绿
ac = new DocBackgroundAction("LightBlue", new Color(200,
255, 200));
} if (ac != null) {
fontBgColorCb.setAction(ac);
}
}
}); JButton insertImageBt = new JButton("\u63D2\u5165\u56FE\u7247"); //插入图片按钮
insertImageBt.setAction(new DocImageAction("插入图片", docTextPane));
DocBackgroundAction类仿照StyledEditorKit.ForegroundAction而成,区别在于使用StyleConstants.setBackground(attr, fg);

public class DocBackgroundAction extends StyledTextAction {
private static final long serialVersionUID = 1L; public DocBackgroundAction(String nm, Color bg) {
super(nm);
this.bg = bg;
} public void actionPerformed(ActionEvent e) {
JEditorPane editor = getEditor(e);
if (editor != null) {
Color fg = this.bg;
if ((e != null) && (e.getSource() == editor)) {
String s = e.getActionCommand();
try {
fg = Color.decode(s);
} catch (NumberFormatException nfe) {
}
}
if (fg != null) {
MutableAttributeSet attr = new SimpleAttributeSet();
StyleConstants.setBackground(attr, fg);
setCharacterAttributes(editor, attr, false);
} else {
UIManager.getLookAndFeel().provideErrorFeedback(editor);
}
}
} private Color bg; }

DocImageAction类继承了StyledTextAction,在JtextPane中插入图片的方式其实非常简单使用panel.insertIcon方法即可,如下

public class DocImageAction extends StyledTextAction {

	private static final long serialVersionUID = 1L;

	public DocImageAction(String nm, JTextPane panl) {
super(nm);
this.panl = panl;
} public void actionPerformed(ActionEvent e) {
JFileChooser f = new JFileChooser(); // 查找文件
f.showOpenDialog(null);
System.out.println(f.getSelectedFile());
ImageIcon icon = createImageIcon(f.getSelectedFile(), "a cute pig"); JTextPane editor = this.panl;
if (editor != null) {
System.out.println("I am in here");
StyledDocument doc = getStyledDocument(editor); editor.setCaretPosition(doc.getLength()); // 设置插入位置
editor.insertIcon(icon); // 插入图片
}
} private JTextPane panl; /** Returns an ImageIcon, or null if the path was invalid. */
protected static ImageIcon createImageIcon(String path, String description) {
java.net.URL imgURL = DocImageAction.class.getResource(path);
if (imgURL != null) {
return new ImageIcon(imgURL, description);
} else {
System.err.println("Couldn't find file: " + path);
return null;
}
}
}


使用Swing实现简易而不简单的文档编辑器的更多相关文章

  1. [.NET] 打造一个很简单的文档转换器 - 使用组件 Spire.Office

    打造一个很简单的文档转换器 - 使用组件 Spire.Office [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6024827.html 序 之前,& ...

  2. 用mkdocs在gitee码云上建立一个简单的文档博客

    利用mkdocs建立简单的文档博客 一.概述 MkDocs 是一个用于创建项目文档的 快速, 简单 , 完美华丽 的静态站点生成器. 文档源码使用 Markdown 来撰写, 用一个 YAML 文件作 ...

  3. [Qt及Qt Quick开发实战精解] 第1章 多文档编辑器

      这一章的例子是对<Qt Creator快速人门>基础应用篇各章节知识的综合应用, 也是一个规范的实例程序.之所以说其规范,是因为在这个程序中,我们对菜单什么时候可用/什么时候不可用.关 ...

  4. 基于slate构建文档编辑器

    基于slate构建文档编辑器 slate.js是一个完全可定制的框架,用于构建富文本编辑器,在这里我们使用slate.js构建专注于文档编辑的富文本编辑器. 描述 Github | Editor DE ...

  5. Linux_文档编辑器_简介

    1. vi 2. vim 3. ubuntu 有一个 自己的图形化的 文档编辑器,用起来比较方便: gedit 4. 5.

  6. PowerDesigner(九)-模型文档编辑器(生成项目文档)(转)

    模型文档编辑器 PowerDesigner的模型文档(Model  Report)是基于模型的,面向项目的概览文档,提供了灵活,丰富的模型文档编辑界面,实现了设计,修改和输出模型文档的全过程. 模型文 ...

  7. Web页面引入文档编辑器报风险

    Web页面引入文档编辑器会报风险,则需要以下操作: <system.web> <httpRuntime requestValidationMode="2.0" / ...

  8. 在线HTML文档编辑器使用入门之图片上传与图片管理的实现

    在线HTML文档编辑器使用入门之图片上传与图片管理的实现: 官方网址: http://kindeditor.net/demo.php 开发步骤: 1.开发中只需要导入选中的文件(通常在 webapp ...

  9. 在asp.net core2.1中添加中间件以扩展Swashbuckle.AspNetCore3.0支持简单的文档访问权限控制

    Swashbuckle.AspNetCore3.0 介绍 一个使用 ASP.NET Core 构建的 API 的 Swagger 工具.直接从您的路由,控制器和模型生成漂亮的 API 文档,包括用于探 ...

随机推荐

  1. UVA 11292 - The Dragon of Loowater (water)

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=sh ...

  2. iOS开发--in house发布和安装(ipa重新签名)

    in house从字面意思理解就是‘内部的’,in house版本的ipa就是一个用于公司内部使用或测试的一个苹果应用程序安装包. 作为一个app应用程序开发者,在app应用程序在苹果商店上架前总需要 ...

  3. 经典系统windows xp sp3官方原版下载(附XP序列号)

    经典系统windows xp sp3官方原版下载(附XP序列号)    在过几日,微软最新的操作系统windows 7就将像外发售了!虽然Vista操作系统已经问世多年,但XP系统仍然占据着王位,在市 ...

  4. 零积分下载,2014年辛星mysql教程秋季版第一本已经完工,期待您的支持

    经过一段时间的不懈努力.终于,2014年辛星mysql教程秋季版的第一本,即夯实基础已经完工,在csdn的下载地址为:去下载地址 ,假设左边地址跪了,能够去http://download.csdn.n ...

  5. asp.net2.0安全性(1)--用户角色篇(代码实现2)--转载来自车老师

    加载所有用户 MembershipUserCollection user = Membership.GetAllUsers(); listUser.DataSource = user; listUse ...

  6. Servlet的学习(四)

    在本篇的Servlet的学习中,主要来学习由使用MyEclipse来开发Servlet的一些小细节. 细节一:在web.xml中可以对同一个Servlet配置多个对外访问路径,并如果在web.xml中 ...

  7. MapReduce调度与执行原理之作业提交

    前言 :本文旨在理清在Hadoop中一个MapReduce作业(Job)在提交到框架后的整个生命周期过程,权作总结和日后参考,如有问题,请不吝赐教.本文不涉及Hadoop的架构设计,如有兴趣请参考相关 ...

  8. php使用 _before_index() 来实现访问页面前,判断登录

    C:\wamp\www\DEVOPS\Home\Lib\Action: <?php class IndexAction extends Action { function index(){ $t ...

  9. CCNP交换实验(5) -- 网关热备冗余

    HSRP:1.启用HSRP功能,并设置虚拟地址IP, 1为standby的组号.2.相同组号的路由器属于同一个HSRP组,所有属于同一个HSRP组的路由器的虚拟地址必须一致.3.HSRP的优先级默认为 ...

  10. HBase数据存储格式

    好的数据结构,对于检索数据,插入数据的效率就会很高. 常见的数据结构 B+树 根节点和枝节点非常easy,分别记录每一个叶子节点的最小值,并用一个指针指向叶子节点.  叶子节点里每一个键值都指向真正的 ...