WordEditor2 中编辑器的初期字体被配置到 config 目录下的配置文件中,默认为“宋体”文字大小默认为“14”。系统初期化时从配置文件中读取并以 Style 的方式设置为编辑器的默认值。WordEditor2 的编辑器是继承自 JTextPane ,所以它拥有解析 html 代码的能力。为了能够设置编辑器的全局字体,我在这里的处理是为编辑器追加 body 的 css 配置。
StringBuffer style = new StringBuffer();
style.append("body {");
style.append("font-size:");
style.append(wep.get("editor.font.size"));
style.append(";font-family:");
style.append(wep.get("editor.font.family"));
style.append(";margin:");
style.append(wep.get("editor.margin"));
style.append(";background:");
style.append(wep.get("editor.background"));
style.append(";");
this.doc.getStyleSheet().addRule(style.toString());
Continue Reading »
昨天追加了一些功能,经过测试发现了几个问题,今天对其进行了修正。
1、对自定义树节点图标的改进。
问题:自定义树节点图标是用文件选择框(JFileChooser)实现的。但是 Swing 的 JFileChooser
是不支持图片预览的,这样使用起来非常不方便。
改进:在文件选择框右侧追加了图片预览框。当选中某个图片时,该框会显示出图片。
2、修正了点击弹出的密码输入框的“取消”按钮后文章依然被打开的 bug。
3、修正了可修改有密码文章标题的 bug。
今天比较空闲,把 Grape 做了一点修改。
1、修改了几个 bug :
a、修复了更换皮肤导致所有打开的文章变为修改状态。
b、修复了设置文章为“只读”后,状态栏没有改变。
2、修改并追加了几个小功能:
a、密码输入框改为了 JPasswordField。
b、追加了文章密码设置。
c、查找对话框显示时,将选择的文字做为要查找的对象。
d、自定义节点(文章)图标。
Continue Reading »
接下来的时间又要开始忙了,估计这个程序一时半会做不完了。干脆把目前的成果先放出来,大家可以看看。
本程序分为两部分,Grapevine 和 Grape。Grapevine 是一个 Swing 开发框架,写的比较粗,没时间细写。实现了 OR/M、IOC、Interseptor 等功能,有兴趣的朋友可以了解一下。Grape 是建立在 Grapevine 上的一个知识管理的应用,实现了多文件、多文档编辑、发布日志到 WordPress 等功能。还是没时间,设置基本上都还没时间写,发布日志也比较简化,有时间再好好修改。
config目录下的classes.xml是类的配置文件,所有的对象都是由 Grapevine 生成并注射到程序中去的。包括画面、菜单、事件处理等等。Grapevine.jar 在 lib 目录下。
要运行程序,需要安装 jdk 6,否则程序将无法运行,切记。
程序基本上可以完成基础需求了,不过还没有测试过,可能有很多Bug。我在使用中也遇到了几个小Bug。
本次不是发布,只是接下来没有时间写了,所以把半成品给大家预览一下。目前源代码还没有整理过,注释也乱七八糟的,比较乱,有些地方也不是很合理,还需要调整,有想要学习或正在开发相同应用的朋友可以参考一下。
应用:Grape
源码:Grape Grapevine WordEditor
Grape 是使用了 Swing 的 Look And Feel 机制来进行换肤的。当然仅仅使用 Look And Feel
是不够的,例如界面图标、浏览样式等等。
为了能够使换肤功能更易扩展,Grape 专门设计了一组皮肤类,结构如下:

Continue Reading »
WordEditor 是为 Grape 写的一个文字处理器,实现了文字加粗、斜体、字体大小、字体样式、下划线、删除线、居左、居右、居中、文字颜色、文字背景色、插入本地图片、插入互联网图片、分隔线、下沉、上移、超链接、撤销、重做以及快捷键等基本的文字处理功能。也实现了保存为文本文件和
RTF 文件的功能。
WordEditor 支持多国语言,所有的文字以及消息都配置在 properties
文件中。若要生成中文的编辑器,只需要在构造方法中传入“cn”即可。例如:new
WordEditor(“cn”);若要生成英文的编辑器,将“cn”改为”en”即可。日文也相同。当然,前提是 config
文件夹下必需要有这几个配置文件。中文:CN.properties,英文:EN.properties,日文:JP.properties。目前我只做了英文和中文的
properties。
Continue Reading »
本文不是一篇真正意义上的日志,只是为了测试 Grape 日志发布功能,请大家忽略。
刚开始打算写 Grape 的时候,只是想做一个 Swing 下快速开发的框架。当框架开发的差不多的时候,就打算利用它开发一个 Swing
应用程序。终于在这休息的一个多月的时间里,这个应用程序开发了 80%。最主要的功能已经基本实现(还没认真测试)。下图的应用程序就是基于Grape 开发出来的。

从去年开始设计Grape到现在,已经快一年了。期间总是有一天没一天断断续续的更新,从来没有连续的时间。由其是上一个项目开始后,就一点时间都没有了,导致这段时间没有更新过一段代码。项目大概做了6、7个月,也就是说有6、7个月没有更新Grape了。算了一下从开始到现在投入到Grape上的人时还不到一个月。哎~~
上个月18号项目做完后,终于有了时间,可是半年多没有接触,连自己设计编码的程序都不知从何下手了。于是花了半天将设计和程序大概的过了一遍后,终于重新投入到Grape的开发当中。到现在已经连续更新了18天。什么是grape?grape分为两部分,一部分为内核,提供了简化Swing开发的框架(测试版已经完成)。另一部分为基于grape内核开发的Swing应用。该应用分为几个大功能(在完工前,我保证不说出来),其中最主要的一个功能已经基本实现,目前还在测试中。
不得不承认我是个懒人,若将目标定的很大的话,90%完不成。像现在一样,将目标定的小一点,将工程功能分的细一点,逐一击破是我能够坚持到底的方法。我又是个完美主义者,每次程序时(项目除外),总试图将程序写的漂亮一点、易懂一点、性能更高一点。因为这个思想导致很多次程序写到一半发现了一些不如意的地方,就重新返工。这次,我努力控制自己这个毛病,告诉自己先将功能实现,再进行重构。如果你跟我一样,总是不能坚持完成一个工程时,不妨试试这个方法。
不多说了,还有很多工作要做。如果还有18天的空闲时间,相信又会完成几个功能(痴人说梦,老板你会同意吗?)。
Java是面向对象的语言,却不是纯面向对象的语言。为什么这么说呢?在Swing的API中,消息框被设计成静态方法。要知道静态本身就与面向对象相违背的。首先静态是不需要进行实例化的,它的初始化是在任何对象生成之前完成的。若对象中的某个类变量被定义为静态的,那么意味着该对象的所有实例共享该变量。我们可以用一个简单的例子验证,如下:
public class Cat {
private static String name = “mimi”;
public String getName() {
return name;
}
public void setName(String n) {
name = n;
}
public static void main(String[] args) {
Cat c1 = new Cat();
Cat c2 = new Cat();
System.out.println(“c1 name is ” + c1.getName());
System.out.println(“c2 name is ” + c2.getName());
c1.setName(“hoho”);
System.out.println(“c1 name is ” + c1.getName());
System.out.println(“c2 name is ” + c2.getName());
}
}
执行上面这段程序,输出的结果为:
c1 name is mimi
c2 name is mimi
c1 name is hoho
c2 name is hoho
再回过头来说Swing的消息框。Swing中,想要弹消息框,可以利用如下语句:
JOptionPane.showMessageDialog(parentCompent, message, title, messageType);
JOptionPane提供了很多重载方法,用来弹出不同的消息框。就消息框而言,并不需要完全遵循面向对象的理论,因为其并不是有状态的事务,且生命周期短暂,我们不需要维护消息框的实例。因此,在Grape中,消息框也被设计为静态方法。不同的是,Grape的消息更易维护,也简化了用户调用。Grape消息框的调用方法为:
Continue Reading »
Swing包中的JTextPane功能非常强大,利用它,可以给容易地制做html、word等文字编辑器。但是JTextPane默认情况下按下Enter键,输出的html代码中总是显示如下:
<p style=”margin-top: 0px”></p>
margin-top: 0px的意思为上边距为0。也就是说当前行与前一行没有行间距。如果你正在制做类似Word这样的编辑器,很显然这并不是我们想要的。我们更希望<p>标签使用定义的css中的样式显示。说来惭愧,这个问题困扰了我很久,一直没有好的解决方法。曾经试图重写JTextPane的document,为其追加rule。也试过监控enter事件,并利用insertHtml插入<p>,结果都不理想。今天偶然的情况下,发现了解决方法,非常非常简单,只要在初始化JTextPane后,设置其默认文本即可。如下:
JTextPane tp = new JTextPane();
tp.setText(“<p></p>”);
这样设置后,输出的html代码就变为<p></p>了。越是简单的东西,越难找到问题所在,就是这么简单的设置,困扰了我很久。通过这个例子,也可以举一反三,实现例如<div>等html标签的默认样式。
希望对你有所帮助。