Breezy簡介 -- 快速開發Swing程序!
Breezy:
sf 項目主頁: http://sourceforge.net/projects/breezy/
下載: http://sourceforge.net/project/showfiles.php?group_id=158540&package_id=177653&release_id=412125
用戶討論區: http://www.hexiao.cn/bbs/thread.php?fid=9
大家都知道開發Swing程序有三大難點:
布局設置,事件處理,和數據綁定. 使用netbean中的新的布局管理器已經解決了第一個問題, 那么后面兩個呢?
Breezy 就是用來簡化后面兩個問題而推出的.
下面我們先來看看一個簡單的例子:
package test;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import net.sf.breezy.event.EventInstaller;
import net.sf.breezy.event.annotations.ActionPerformed;
import net.sf.breezy.event.annotations.DefAction;
@SuppressWarnings("serial")
public class TestBreezy extends JFrame {
? ? ?
? ? ?private JButton button = new JButton("Test Breezy!");
? ? ?
? ? ?public TestBreezy() {
? ? ? ? ? ?this.setLayout(new BorderLayout());
? ? ? ? ? ?this.add(button,BorderLayout.CENTER);
? ? ? ? ? ?
? ? ? ? ? ?// 用來處理所有的Breezy的Annotations
? ? ? ? ? ? ? ? ? ? EventInstaller.processEventAnnotation(this);
? ? ? ? ? ?
? ? ? ? ? ?this.setSize(400, 300);
? ? ? ? ? ?this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
? ? ? ? ? ?
? ? ? ? ? ?EventInstaller.setAction(button, "action");
? ? ?}
? ? ?
? // button的事件響應方法
? ? ?@ActionPerformed("button")
? ? ?public void myButtonAction() {
? ? ? ? ? System.out.println("God, this is terrific!");//設置另外一個事件
? ? ?}
? ? ?
// 使用id注冊另外一個事件響應方法
? ? ?@DefAction(id="action", name="Button")
? ? ?void action(ActionEvent e) {
? ? ? ? ? ?System.out.println(e + ":" + e);
? ? ?}
? ? ?/**
? ? ? * @param args
? ? ? */
? ? ?public static void main(String[] args) {
? ? ? ? ? ?// TODO Auto-generated method stub
? ? ? ? ? ?JFrame frame = new TestBreezy();
? ? ? ? ? ?frame.setVisible(true);
? ? ?}
}
怎么樣, 看起來不錯吧.
現在Breezy幾乎支持所有的Swing EventListeners. 詳細情況請查看類net.sf.breezy.event.annotations.*
當然了, 作為一個優秀的框架,還要有可擴展性,在Breezy中開發者還可以自定義自己的事件響應Annotation 來實現自己的功能. 詳細情況請查看API.
數據綁定問題主要 就是 JTable 和JTree的問題:
使用Breezy來處理該問題,有點類似于Hibernate中的xml映射數據庫屬性字段差不多. 可以很方便的映射.
請看下面的例子: 和Breezy文檔:
package test;
import java.util.Date;
public class Name {
? ? ?private String name = "Starwhisperer";
? ? ?private Date time = new Date();
? ? ?public String getName() {
? ? ? ? ? ?return name;
? ? ?}
? ? ?public void setName(String name) {
? ? ? ? ? ?this.name = name;
? ? ?}
? ? ?public Date getTime() {
? ? ? ? ? ?return time;
? ? ?}
? ? ?public void setTime(Date time) {
? ? ? ? ? ?this.time = time;
? ? ?}
}
User.java
package test;
import java.util.Date;
import net.sf.breezy.datatable.TableField;
public class User {
? ? ?@TableField(head = "名稱", editable = false)
? ? ?private String name;
? ? ?@TableField(head = "年齡", editable = false, type = "number")
? ? ?private int age;
? ? ?@TableField(head = "陣營", type = "boolean", editable = false)
? ? ?private boolean light;
? ? ?@TableField(head = "時間", type = "time", pattern = "yyyy/MM/dd")
? ? ?private Date date = new Date();
? ? ?@TableField(head = "名稱", property = "name", type="string")
? ? ?private Name nameBean = new Name();
? ? ?public Name getNameBean() {
? ? ? ? ? ?return nameBean;
? ? ?}
? ? ?public void setNameBean(Name nameBean) {
? ? ? ? ? ?this.nameBean = nameBean;
? ? ?}
? ? ?public boolean isLight() {
? ? ? ? ? ?return light;
? ? ?}
? ? ?public void setLight(boolean light) {
? ? ? ? ? ?this.light = light;
? ? ?}
? ? ?public int getAge() {
? ? ? ? ? ?return age;
? ? ?}
? ? ?public void setAge(int age) {
? ? ? ? ? ?this.age = age;
? ? ?}
? ? ?public String getName() {
? ? ? ? ? ?return name;
? ? ?}
? ? ?public void setName(String name) {
? ? ? ? ? ?this.name = name;
? ? ?}
? ? ?public Date getDate() {
? ? ? ? ? ?return date;
? ? ?}
? ? ?public void setDate(Date date) {
? ? ? ? ? ?this.date = date;
? ? ?}
}
DataTableTest .java
package test;
import java.awt.BorderLayout;
import java.util.LinkedList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import net.sf.breezy.datatable.DataTable;
import net.sf.breezy.datatable.DataTableScrollPane;
public class DataTableTest {
? ? ?private JFrame mainFrm = new JFrame();
? ? ?
? ? ?protected void setUp() { ? ? ? ? ? ?
? ? ? ? ? ?mainFrm.setSize(100, 600);
? ? ? ? ? ?mainFrm.setLocationRelativeTo(null);
? ? ? ? ? ?mainFrm.setLayout(new BorderLayout());
? ? ? ? ? ?mainFrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
? ? ?}
? ? ?
? ? ?public static void main(String[] args) {
? ? ? ? ? ?DataTableTest test = new DataTableTest();
? ? ? ? ? ?test.setUp();
? ? ? ? ? ?test.testTable();
? ? ?}
? ? ?
? ? ?public void testTable() { ? ? ? ? ? ?
? ? ? ? ? ?java.util.List list = new LinkedList();
? ? ? ? ? ?for(int i = 0; i < 120; i ++) {
? ? ? ? ? ? ? ? ?User u = new User();
? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ?u.setAge(33);
? ? ? ? ? ? ? ? ?u.setName("Cain " + i);
? ? ? ? ? ? ? ? ?list.add(u);
? ? ? ? ? ?}
? ? ? ? ? ?DataTableScrollPane<User> pane = DataTable.getEntityTablePane(list, User.class);
? ? ? ? ? ?
? ? ? ? ? ?mainFrm.add(pane, BorderLayout.CENTER); ? ? ? ? ? ?
? ? ? ? ? ?mainFrm.setVisible(true);
? ? ?}
}
映射文件:datatable-mappings.xml
<?xml version="1.0"?>
<class-mapping>
? ? ?<class name="test.User">
? ? ? ? ? ?<property name="age" head="年齡" />
? ? ? ? ? ?<property name="light" head="光芒" type="boolean" editable="true"/>
? ? ? ? ? ?<property name="nameBean" property="time" head="姓名" pattern="yyyy/mm/dd" type="time"/>
? ? ? ? ? ?<property name="date" head="Date"/>
? ? ? ? ? ?<property name="name" head="Name"/>
? ? ?</class>
</class-mapping>
也是很簡單的吧. 關于JTree的應用也是很簡單的哦. 詳細情況請查看用戶文檔:
更多信息請關注 用戶交流論壇: http://www.hexiao.cn/bbs/thread.php?fid=9?