Grape 的编辑器 — WordEditor

WordEditor 是为 Grape 写的一个文字处理器,实现了文字加粗斜体字体大小字体样式下划线删除线、居左、居右、居中、文字颜色文字背景色、插入本地图片、插入互联网图片、分隔线、下沉上移超链接、撤销、重做以及快捷键等基本的文字处理功能。也实现了保存为文本文件和
RTF 文件的功能。

WordEditor 支持多国语言,所有的文字以及消息都配置在 properties
文件中。若要生成中文的编辑器,只需要在构造方法中传入“cn”即可。例如:new
WordEditor(”cn”);若要生成英文的编辑器,将“cn”改为”en”即可。日文也相同。当然,前提是 config
文件夹下必需要有这几个配置文件。中文:CN.properties,英文:EN.properties,日文:JP.properties。目前我只做了英文和中文的
properties。
Continue Reading »

09-06-29 | GRAPE | Permalink | No Comments |

测试Grape发布日志功能

本文不是一篇真正意义上的日志,只是为了测试 Grape 日志发布功能,请大家忽略。

刚开始打算写 Grape 的时候,只是想做一个 Swing 下快速开发的框架。当框架开发的差不多的时候,就打算利用它开发一个 Swing
应用程序。终于在这休息的一个多月的时间里,这个应用程序开发了 80%。最主要的功能已经基本实现(还没认真测试)。下图的应用程序就是基于Grape 开发出来的。

g

09-06-24 | GRAPE | Permalink | 2 Comments |

JTextPane设置背景色的问题及解决

  Swing 的 JTextPane 是非常强大的文字处理工具,它不但可以处理文本,也可以作为浏览器来显示指定的网页。利用 JTextPane 可以很轻松地开发类似 Word 之类的文字处理工具。比如要设置文本为粗体,可以这样实现:

MutableAttributeSet attr = new SimpleAttributeSet();
StyleConstants.setBold(attr, !StyleConstants
.isBold(((HTMLEditorKit) editor.getEditorKit())
.getInputAttributes()));
setCharacterAttributes(editor, attr, false);

  设置背景色为:

MutableAttributeSet attr = new SimpleAttributeSet();
StyleConstants.setBackground(attr, color);
setCharacterAttributes(editor, attr, false);

  看上去都没有什么问题,不过,若你的程序有保存功能,并且保存的是JTextPane生成的html,这样问题就来了。当利用getText方法取得生成的html代码时,我们发现虽然背景色的显示正确但html代码无法生成。这似乎是一个bug?不过没关系,我们可以利用HTMLEditorKit的insertHML来实现。


Continue Reading »

09-06-16 | JAVA开发 | Permalink | No Comments |

JTree节点的编辑事件

  利用Swing开发桌面应用程序中,JTree是必不可少的利器,比如Windows的资源管理器的文件夹侧边栏,我们常用的Outlook的侧边栏,Eclipse的Navigator、Package等都使用了Tree控件。

  很多情况下,Tree的节点是允许编辑的,调用JTree的setEditable(true)方法可以生成一棵可编辑的树。按下F2键,节点就变为可编辑状态。和Swing中很多组件一样(JList、JTable)JTree并不支持编辑,而我们按下F2时能够进行编辑的其实并不是JTree本身,而是利用另外的JTextField来实现的。所以要想捕获JTree的编辑事件,就不能直接对JTree追加Listener,而是要对当前需要编辑的节点的JTextField追加Listener。


Continue Reading »

09-06-02 | GRAPE, JAVA开发 | Permalink | No Comments |

Grape的消息设计

  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 »

09-06-01 | GRAPE, JAVA开发 | Permalink | No Comments |

JTextPane的换行问题解决

  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标签的默认样式。

  希望对你有所帮助。

09-05-31 | GRAPE, JAVA开发 | Permalink | No Comments |

Grape框架的基本思想

  在《Swing程序的基本设计结构》一文中,大概描述了Grape应用程序的基本设计思想,今天我们来简单分析如何管理Swing应用程序的生命周期。

  通过《Swing程序的基本设计结构》的分析得知,一个完整的Swing应用程序将由很多组件组合而成,这样做好处是显而易见的。组件是独立的,所以可以独立存在,如同对象一样可以被复用。组件是由领域对象、Action和View组成的。这样做的好处是每一层的任务更加明确,对象更加单纯。领域层封装了各业务的细节(关于领域对象请参照《程序设计不是这么简单》),Action负责指挥各领域对象完成业务操作,View只关心如何更好地与用户交互,对于与用户交互后所发生的一切一无所知。如此便有了应用程序结构的简单模型。


Continue Reading »

08-09-06 | GRAPE | Permalink | No Comments |

Swing程序的基本设计结构

  Swing是纯Java写的图形用户界面。JDK1.5 以前的Swing,耗资源、性能低下、不美观等诸多原因,无论 Sun 如何宣传,也很少有开发者去关注它。自从 JDK1.5 的出现,无论从性能还是外观 Swing 都发生了巨大的变化,人们眼中的丑小鸭渐渐地变成了白天鹅。

  相对Web应用来说,我更喜欢开发桌面程序。以前也开发几个应用。不过每次都会有这种感觉 — 总是写一堆控制程序启动和加载各种资源的类,还有一组数据库管理类和一堆程序界面和 Widget 类。然后就是老套路,为每个界面对应一类,用来实现应用程序的业务逻辑。每次有较新颖的想法准备开始动手时,上面这一堆机械式地开发方式总是让我提不起精神。唉!程序设计不是如此简单
Continue Reading »

08-09-02 | GRAPE | Permalink | No Comments |

Swing从丑小鸭到白天鹅

  虽然java在桌面开发方面提供了AWT和Swing,还有Eclipse的SWT。即使如此,也没能摆脱不能与VB、VC等语言在桌面编程上进行较量的尴尬处境。

  桌面开发一直是Java在不足的一个方面。由其是sun自己开发的图形包Swing,无论是在运行速度还是界面效果,都不能让人满意。不过,我还是经常用Swing开发一些程序,也用Swing做过一些项目。对Swing的前景还是很乐观的。果然,java5.0以后的版本,Swing在运行速度方面得到了明显的提升,完全不次于Windows提供的图形控件。而在界面美观性方面,由于Swing所特有的特点,大批爱好者们开发出很多开源的 Look and Feel,从而彻底改变了业界的看法。
Continue Reading »

07-09-06 | JAVA开发 | Permalink | No Comments |

如何禁止桌面程序重复启动

  许多程序只允许启动单个实例,比如我们常用的MSN、OUTLOOK等等。单实例有很多好处,其中最重要一点即是安全。想像一下多人同时修改同一文件的危险,就如我们在J2EE应用程序中所做的那样,要尽可能考虑到多用户同时访问的问题。

前些日子用SWING为朋友写了一个程序,其中就有不可同时启动多个系统实例的要求。由于没有一个好的思路,所以走了很多弯路。现在终于解决了,积累了一些心德想与大家分享。

Continue Reading »

04-11-24 | JAVA开发 | Permalink | No Comments |