`
xiaozhonghua
  • 浏览: 253648 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Swing第二刀:枝间新绿一重重

阅读更多

 

不喜欢看文字的朋友:可直接下载可执行程序。要源代码的朋友:容我再整理几天,但一定会奉上。喜欢更多抓图的朋友:可以在上篇文章《Swing是一把刀》中看到更多抓图。

 

关于绿色

喜欢绿色,喜欢雅黑,无可救药。在这个吵吵闹闹的软件行业,绿色也忽然从“春风一拂千山绿”唯美变成俗不可耐的buzzword。比如:

 

  • 绿色软件:大大的buzzword。忽然一夜之间,所有的软件都绿色了,好像不“绿”就跟不上形势。比如绿色杀毒,绿色OFFICE,绿色ERP,绿色windows。反正全绿。
  • 绿色征途:看,精神鸦~片也可以很“绿”的;
  • 绿~坝-花季护航:呃,老好的软件,不多说了;
  • 绿色世博:嗯,喊的老响了。至今一头雾水。
绿色还有一些不好的词,比如人人避之不及的“绿帽子”之类。台湾的绿营也代表了大坏蛋那帮人(至少陈水扁带了个头)。还有“我把老板气的脸都绿了”、”老板整天灯红酒绿“,也都不是什么好词。

不过绿色更多的还是代表了“春天、自然、环保、低碳”等没好的东西。皮尤慈善信托基金(Pew)在一份名为《绿色改变世界》的研究报告中指出,计算机屏幕如果使用绿色可以节省大量电能并降低辐射,保护使用者双眼和皮肤。例如一个全屏显示的绿色软件界面可以让一台液晶显示器消耗功率降低13.7瓦;假设美国电脑拥有量为5299万台来计算,每年仅关机状态功耗一项可以节约 6.2亿度电。如果我们把所有的软件都设计成“绿色”这个环保色,每台计算机都会减少5%的电能和辐射,人的情绪也会更加平缓舒畅,心脏和双肺由此减少12%的血液循环负担,从而降低人类对氧气的需求和二氧化碳的呼出达到14%。加上节省下来的对皮肤护理保养、心肺疾病治疗、近视以及眼镜相关行业对自然资源的消耗,每年全球可以节省1400亿美元的资源消耗,相当于减少砍伐8500平方公里的亚马逊热带雨林,对于处于正在复苏之中的世界经济具有说一不二的作用。看来,“绿色软件”,先把自己的界面搞“绿”了,就是地球的一大幸事!

(注意:上述报告和数据纯属胡诌八扯,如有雷同,纯属巧合。)

但是制作一个绿色的软件界面确实一个心愿。尤其是能够体现“枝间新绿一重重,小蕾深藏数点红”的那种感觉!现在终于有了,经过一个多星期的折腾,终于有了一个雏形,在上一篇博文《Swing是一把刀》中给大家看到的:


 

 

 

 

框架,还是框架

这个程序的设计初衷是快速建立一个美观的Swing应用程序外观。但是,具体来说,它又并非完全是下面几个东西:

  • LookAndFeel:这个程序并非一个LnF。一个LnF会对所有的Swing组件进行重新定义Paint并可以通过UIManager.setLookAndFeel进行启用。这个程序用到了大量LookAndFeel的机制,甚至也直接定义了不少UI。不过它并不是一个完整的LookAndFeel。这些定制完全是为这个程序框架服务的。也就是说,这些UI和重绘机制只有在当前的程序框架起作用,而无法指望一句UIManager.setLookAndFeel就将你的任意Swing程序变成上图风格。
  • 组件库:也不是组件库。其实里面的组件,除了这个OutlookPane(左侧的模块树)是完全新做出来的(而且没有从JTabbedPane继承,也许理论上还经不起太严谨的推敲),其他的组件都是很简单、现成的。例如列表、按钮、菜单等,都是直接用Swing的,只是重载了一些方法或者定义了UI而已。而且我并非是想让大家直接new OutlookPane()这样来使用,而是使用XML文件对整个界面进行配置使用;
  • GUI程序框架:似乎有点大。这仅仅是一个很小的程序而已。

做Java的喜欢满嘴Framework。你要是不能气定神闲一口气提到20个Framework并有意无意的暗示自己很精通,那~都不好意思跟人家说话;最好再能挑一个有点名气的,指手画脚、评头论足、怒其不争一下下,那就像大牛了(例如Hibernate就是个很不错的candidate)。所以,咱这个小程序也就死乞白赖往“框架”上凑凑,反正已经带上了“绿帽子”,也不怕丢人丢到底。

 

好吧,这是一个框架,虽然我也不知道框架该怎么定义。反正我的设计初衷是:如果你用Swing开发一个类似上图结构的应用程序,那么你可以直接用这个框架。这个程序框,包含了上面菜单、地下状态条、左边模块栏、右边功能快捷列表,中间多tab标签页的各种内容(也提供了几个常用的内容页风格,例如列表、流程图等)。这个窗口已经被封装好,通过XML配置文件来定义菜单、状态条、模块栏、流程图、右边的快捷列表。同时,这些都是联动的。例如:点击左边的模块栏中的子模块,一个对应的流程图会显示在中间tab页;选中流程图中的节点,可以把该节点相关的功能列在右侧。点击右侧列表,可以执行各种定义好的动作(动作通过动作码定义,后面会详细介绍)。使用么,直接new 一个窗口类,set各个部分的XML文件名,然后setVisible(true)就OK了。至于中间的各个组件和大家关心的LookAndFeel,则都定义好了,基本上不用太关心细节。

 

不管怎么说,我们就叫它“框架”吧。

 

XML配置

每个应用程序都千奇百怪,功能各异。如何用一个同样的界面来组织呢?的确,这个界面并非适合所有人。不过这里的所有菜单、按钮、流程图、图标等,其动作都是可以用一个“动作码”类定义的,所有的动作都会回调一个统一的函数。而我们只要在这个函数处插入监听,就可以拦截具体动作码,执行我们想做的任何事情,例如格式化C盘、往aobama@whitehouse.com邮箱发个垃圾邮件啥的。

 

例如,要定义主菜单,通过这个XML:

 

<?xml version="1.0" encoding="UTF-8"?>
<menubar>
  <menu text="System">
    <menu text="One Sub Module">
      <menuitem text="Test Report Item" tooltip="Tooltip" 
                            icon="/free/email.png" action="A001"/>
      <menuitem text="Test Report Item" tooltip="Tooltip" 
                            icon="/free/email.png" action="A001"/>
      <menuitem text="Test Report Item" tooltip="Tooltip" 
                            icon="/free/email.png" action="A001"/>
      <menuitem text="Test Report Item" tooltip="Tooltip" 
                            icon="/free/email.png" action="A001"/>
...
  </menu>
</menubar>

 

 以上XML可以定义一个System的主菜单,以及一个One Sub Module的菜单项,以及一系列的二级菜单。每个菜单都可以设置icon图标、文字、tooltip文字,以及动作码(就是那个action)。如下图:


 

左侧的模块栏就是典型的Outlook的风格,很多软件干脆都叫它OutlookPane(我这里也是如此)。这个OutlookPane的配置,通过如下类似XML:

 

<outlook>
  <module text="Engineering Box" 
                 icon="/free/test/module_unselected.png" 
                 selected_icon="/free/test/module_selected.png" 
                 network="network.xml">
  </module>
</outlook>

同样,主模块(也就是每个大分栏)包含了模块栏的文字、icon图标(选中和未选中两个),以及一个xml文件。这个xml文件包含了一个流程图,流程图包含了具体的子模块。点击展开大模块栏后,所有的子模块也会显示在栏目中,同时模块的流程关系会通过对应的xml文件中定义的方式,显示在一个图形化的流程图界面中,最终显示在中间的tab页上。

 


可以看到,左侧的模块列表和中间的图形节点是一一对应的。当鼠标选中节点后(变成橙色),左侧的列表对应的项也会被选中。同时,和这个节点(代表了一个具体子模块)相关的功能,都会显示在右侧的快捷列表中(这是通过指向的network.xml文件定义的)

 

上面例子中的Network.xml内容举例如下:

 

<?xml version="1.0" encoding="UTF-8"?>
<network>
    <node x="30" y="50"
          text="AP Prepay"
          network_text="AP Prepay"
          tooltip="This is a tooltip of a node"
          icon="/free/test/module.png"
          list_icon="/free/test/submodule.png">
        <button1 tooltip="Tooltip" 
                            icon="/free/test/module_attachment.png" action="X002"/>
        <button2 tooltip="Tooltip" 
                            icon="/free/test/module_attachment.png" action="X002"/>
        <button3 tooltip="Tooltip" 
                            icon="/free/test/module_attachment.png" action="X002"/>
        <shortcuts>
            <separator text="Most Often Used Reports"/>
            <shortcut text="Add a Part" tooltip="Tooltip" 
                            icon="/free/submodule.png" action="Z010"/>
            <shortcut text="Delete a Part" tooltip="Tooltip" 
                            icon="/free/submodule.png" action="Z010"/>
            <shortcut text="AP Aging Report" tooltip="Tooltip" 
                            icon="/free/chart.png" action="Z010"/>
            <shortcut text="MRP for All Parts Used this Month" tooltip="Tooltip" 
                            icon="/free/user.png" action="Z010"/>
            <shortcut text="Dashboard of this Month" tooltip="Tooltip" 
                            icon="/free/email.png" action="Z010"/>
            <shortcut text="All Open Purchase Orders" tooltip="Tooltip" 
                            icon="/free/chart.png" action="Z010"/>
            <shortcut text="Search in Address Book" tooltip="Tooltip" 
                            icon="/free/user.png" action="Z010"/>
            <shortcut text="All Online Users" tooltip="Tooltip" 
                            icon="/free/email.png" action="Z010"/>
            <separator text="Common Reports"/>
            <shortcut text="All Open Purchase Orders" tooltip="Tooltip" 
                            icon="/free/chart.png" action="Z010"/>
            <shortcut text="Search in Address Book" tooltip="Tooltip" 
                            icon="/free/user.png" action="Z010"/>
            <shortcut text="All Online Users" tooltip="Tooltip" 
                            icon="/free/email.png" action="Z010"/>
            <shortcut text="All Open Purchase Orders" tooltip="Tooltip" 
                            icon="/free/chart.png" action="Z010"/>
            <shortcut text="Search in Address Book" tooltip="Tooltip" 
                            icon="/free/user.png" action="Z010"/>
            <shortcut text="All Online Users" tooltip="Tooltip" 
                            icon="/free/email.png" action="Z010"/>
            <shortcut text="All Open Purchase Orders" tooltip="Tooltip" 
                            icon="/free/chart.png" action="Z010"/>
            <shortcut text="Search in Address Book" tooltip="Tooltip" 
                            icon="/test/user.png" action="Z010"/>
            <shortcut text="All Online Users" tooltip="Tooltip" 
                            icon="/free/email.png" action="Z010"/>
        </shortcuts>
    </node>
</network>

 其中,每个node定义了一个子模块节点。节点上包含x、y坐标信息、文本信息、tooltip、icon图标(中间大的主图标),以及三个按钮。每个node如图所示,可以携带3个按钮。每个按钮可以挂一个图标、tooltip、icon以及动作码。我们可以定义其任意动作。

 


然后,每个node又携带了一个shortcuts列表,包含了这个节点所有相关的功能点,在node被选中后,以右侧的列表方式列出。如图所示:

 


此外,流程图中的箭头是通过类似如下XML在network.xml中定义:

 

<arrow x="170" y="80" direction="left" rotation="0"/>

 其中x、y是坐标,direction是方向,可以是上下左右以及斜向共8个方向。此外rotation还提供了旋转角度。如果right_up这个45度的右上角度不符合要求,可以在增加rotation进行进一步调节。

 

右侧快捷列表的分割文字,也是通过如下xml进行定义:

 

<shortcuts>
            <separator text="Most Often Used Reports"/>
            <shortcut text="Add a Part" tooltip="Tooltip" 
                            icon="/free/test/submodule.png" action="Z010"/>
...

 分隔条可以携带一个文字,用来对很多列表项进行分组:


 

还有工具条也是可以配置的。工具条在这个框架里被放在了模块栏的顶部。通过如下XML配置其按钮:

 

 

<?xml version="1.0" encoding="UTF-8"?>
<toolbar>
	<button tooltip="Tooltip" icon="/free/test/message.png" action="B001" />
	<separator/>
    <button tooltip="Tooltip" icon="/free/test/user.png" action="B001" />
	<separator/>
    <button tooltip="Tooltip" icon="/free/test/email.png" action="B001" />
	<separator/>
    <button tooltip="Tooltip" icon="/free/test/viewer.png" action="B001" />
	<separator/>
    <button tooltip="Tooltip" icon="/free/test/chart.png" action="B001" />
	<separator/>
    <button tooltip="Tooltip" icon="/free/test/capture.png" action="B001" />
	<separator/>
    <button tooltip="Tooltip" icon="/free/test/image_edit.png" action="B001" />
	<separator/>
</toolbar>

 

其中<separator>定义了一个分割竖线 ,完全美观之用。显示效果如下:



 

 

最后一个配置项是软件右上角的LOGO。每个系统都想有一个地方漂亮的显示咱家的LOGO,那才有成就感!这里通过menubar菜单的XML文件如下配置:

 

 

<logo image="/free/test/logo_company.png" tooltip="WPT Power Transmission" />

 

可以对图片、tooltip进行定义。显示效果如下:

 


这样,一个完整的”纯绿色“应用程序框架就差不多被”配置“出来了。

 

程序接口

其实设计初衷是无需使用源代码,直接使用下方提供的jar包即可进行二次开发。因为毕竟通过XML就可以对界面元素进行定义了。如果要把这个框架集成到你的应用程序中,并执行你的具体动作,只需要对free.Shell这个类进行一个函数重载即可。

 

public void command(String action) {
        String message = "Perform action " + action + ".";
        this.lbStatusMessage.setText(message);
}

 

在Shell这个类中,界面上所有的按钮、菜单、列表等被点击后,都会回调这个Shell的command方法,并传回action字符串,也就是我们在XML中定义的动作码。接着你就用if else或者case啥的进行处理动作吧!当然也可以调用addTab方法在Shell界面中添加一个tab页面。其使用方法会下次详细阐述。 

 

关于效率、内存、布局和其他

有朋友说很担心执行效率、内存占用。这是对Swing常被攻击的的一个老话题了。简单直接的回答是:Swing效率没问题。内存占用没问题。满眼哗哗一片字符串,就一定占内存吗?table有1000行,渲染的花里胡哨,就内存问题吗?完全不是这么一回事。例如,如果你了解Swing的table的renderer机制,其实无论表格有多少行,一个列是用同一个renderer实例来paint的。注意,是一个实例哈。editor也是一样。很多初学者以为这一列用JComboBox编辑,1000行就会create成1000个ComboBox。那就完全错了。Renderer就是一个“橡皮章”,一个章,不停的在每个格子里面“盖章”,重绘就重新盖;Editor就是当一个“萝卜”,哪个“坑”需要编辑时,table动态把它“放”在这个单元格(坑)上面,下次下个单元格需要编辑,再被挪过去。对于一个列来说,就一个萝卜,一个橡皮章。怎么会说“占用内存”?如果说1000行字符串占用内存,那这些字符串用什么语言和平台不占用内存呢?同样字符串在不同的语言和平台上可以说占用内存几乎没什么差别。这个以后可以专门讨论。

 

在这个本程序中,状态栏上有一个封装好的内存监控工具条:


它的作用是监测目前Java的总的申请的堆内存以及使用的内存。相关代码如下:

MemoryMXBean memorymbean = ManagementFactory.getMemoryMXBean();

long usedMemory = memorymbean.getHeapMemoryUsage().getUsed();
long totalMemory = memorymbean.getHeapMemoryUsage().getMax();

上面图片中的“18M/63M”标明默认Java堆大小是64M目前使用了18M。尝试多打开一些表格界面、拓扑图界面,可见内存使用并不是很多。

 

说Swing的效率低,也不是很有说服力。其实Swing本质还是Java2D在paint东西,看看那些杂乱的Metal***UI源码就知道了。不过Swing确实设计的够复杂啰嗦,一个LnF就能绕死人。这些机制会导致Swing慢一些。不过说到底程序的快慢瓶颈还不是在Swing上,还是在如何设计和使用上。例如线程的处理等等,这些都不是初学者很容易搞定的东西。这也导致Swing总是被贴上“慢”的标签。

 

自动布局方面,也是比较啰嗦的。如果用IDE的话,推荐NetBeans里面的GUI编辑工具,它使用的实际是Matisse这个layout。这里有两篇官方文章介绍:
http://wiki.netbeans.org/UsingGUIEditor
http://netbeans.org/features/java/swing.html

 

如果手写代码,我还是推荐一个超强但比较复杂的TableLayout。这里有其介绍:
http://java.sun.com/products/jfc/tsc/articles/tablelayout/

 

其他简单的布局,大多可以用Swing内置的几个layout搞定。另外尽量多套用Panel进行嵌套,化繁为简。不要试图一次一个Panel+Layout把一个复杂的界面搞定,那样会很累。

 

有朋友很不齿这里使用到了JGoodies和TWaver,这里也说明一下。在JGoodies的基础上再去定制UI确实美观了不少,不过理论上确实可以彻底抛开JGoodies。这样就要完全彻底重写一整套的LnF了,包括文本框按钮啊所有的东西。目前确实还没有这样的时间和精力,以后会考虑出一个WithoutJGoodies版本。使用TWaver主要是为了做中间的流程图和拓扑图,并且使用的也比较顺手了。如果不需要中间的拓扑图流程图,也可以without TWaver,以后会考虑改一版。不过这些东西都是很不错的工具,能用就拿来为我所用,不喜欢用就借鉴一下了事。

程序下载

本程序可以在这里下载

 

执行方法:解压zip文件,双击其中的run.bat。

运行环境:Java 6。

其他说明:zip包中的free.jar就是本文提到的框架。其他两个jar包是jgoodies lnf和twaver做流程图的支撑包,可不用理会。

 

由于牵扯到公司的业务,程序的源代码还在整理之中,预计还要一周左右会整理完毕。到时候一定会跟大家分享整个程序的源代码。下一次我会详细介绍每一个组件的制作方法和相关代码。

  • 大小: 2.7 KB
  • 大小: 195.7 KB
  • 大小: 7.1 KB
分享到:
评论
24 楼 zonel 2010-07-01  
程序无法运行,
Exception in thread "main" java.lang.NoClassDefFoundError: free/Shell
23 楼 youjianbo_han_87 2010-07-01  
楼主在赛瓦工作过?
22 楼 jjx 2010-07-01  
另外,说道layout,在delphi和.net 中devexpress的layoutcontrol 相当不错,我可以在其上创建完全自定义界面的效果

下面两幅图是我做的一个delphi框架的
21 楼 jjx 2010-07-01  
lz同我的windows forms配置类似,不过我使用的是spring.net 的自定义扩展schema的方法。不过,现在,我有点后悔使用xml配置,因为更新比较麻烦,如果现在,我会使用db4o这样的对象数据库,另外,如果xml文件太多,管理上也是个问题

我的大体上是这样的



<?xml version="1.0" encoding="utf-8" ?>
<objects  xmlns="http://www.springframework.net" xmlns:a="http://www.soho-works.net/app"
    xmlns:db="http://www.springframework.net/database"  default-autowire="no" default-lazy-init="false">
  <a:application name="xxx" text="电压监测信息管理系统" version="1.80" helpFile="help\xxx.chm">
    <a:securityKey name="数据通讯" text="数据通讯"/>
    <a:securityKey name="TCP" text="TCP" parent="数据通讯"/>
    <a:securityKey name="短消息" text="短消息" parent="数据通讯"/>
    <a:securityKey name="电缆通讯" text="电缆通讯" parent="数据通讯"/>
    <a:securityKey name="短信工具" text="短信工具" parent="数据通讯"/>
    <a:securityKey name="数据采集" text="数据采集"/>
    <a:securityKey name="直接电缆采集" text="直接电缆采集" parent="数据采集"/>
    <a:securityKey name="通过电卡采集" text="通过电卡采集" parent="数据采集"/>
    <a:securityKey name="通过GSM采集" text="通过GSM采集" parent="数据采集"/>
    <a:securityKey name="通过USB采集" text="通过USB采集" parent="数据采集"/>


    <a:menuitem  name="labelEditor" type="ToolsDevelopToolsLabelLabelEditor" securityKey="用户组"/>
    <a:menuitem name="stateform_menuitem" type="stateForm" text="省/直辖市/自治区" securityKey="省份"/>
    <a:menuitem name="cityform_menuitem" type="cityForm" text="市/县" securityKey="地址"/>
    <a:menuitem name="dayform_menuitem"  type="dayForm" text="日数据" securityKey="日数据"/>
    <a:menuitem name="monthform_menuitem" type="monthForm" text="月数据" securityKey="月数据"/>

    <a:menuitem name="电压合格率统计汇总表" text="电压合格率统计汇总表" type="电压合格率统计汇总表" menuitemType="Output"/>
    <a:menuitem name="红河报表" text="红河报表" type="红河报表" menuitemType="Output"/>
    <a:menuitem name="红河报表2" text="红河报表2" type="红河报表2" menuitemType="Output"/>
    <a:menuitem name="test2" type="test2" menuitemType="Action"/>
    <a:command image="~/bitmaps/1.gif" menuitem="options" />
    <a:command image="~/bitmaps/2.gif" menuitem="importexportwizard_menuitem" />
  

    <a:menu text="数据通讯" name="数据通讯" securityKey="数据通讯">
      <a:menu text="无线通讯" name="无线通讯">
        <a:menu text="TCP" name="GPRS" menuitem="gprsform_menuitem" helpText="提供使用TCP协议的仪表的的显示"/>
        <a:menu text="GSM 自动采集设置" name="GSM 自动采集设置"  helpText="设置哪些仪表需要进行自动采集" menuitem="gsm_menuitem"/>
        <a:menu text="GSM 工具" name="GSM 工具"  helpText="通过短信进行通讯协议的调试操作" menuitem="gsmtoolform_menuitem"/>

      </a:menu>
    
      <a:menu text="电缆通讯工具" name="电缆通讯工具" menuitem="cableform_menuitem" helpText="使用直接RS232直接电缆连接进行通讯协议的调试"/>
      <a:menu text="GSM Modem工具" name="GSM Modem工具" menuitem="smstoolform_menuitem" helpText="通过短信设置GSM MODEM"/>
    </a:menu>
    <a:menu text="数据采集" name="数据采集" securityKey="数据采集">
      <a:menu text="采集日志" name="采集日志">
        <a:menu text="GSM 采集日志" name="GSM 采集日志"  menuitem="gsmcollectlogform_menuitem" >
        </a:menu>
        <a:menu text="TCP 采集日志" name="TCP 采集日志" menuitem="gprscollectlogform_menuitem">
        </a:menu>
      </a:menu>
      <a:menu name="数据采集" text="数据采集" securityKey="数据采集">
        <a:menu name="TCP 手动采集" text="通过TCP采集" helpText="通过TCP手动进行数据采集" menuitem="gprs_manual_collect_job_menuitem"/>
        <a:menu name="通过 GSM 采集" text="通过 GSM 采集" menuitem="gsmdatacollectform_menuitem"/>

          <a:menu name="直接电缆采集" text="直接电缆采集" menuitem="cabledatacollectform_menuitem">
        </a:menu>
        <a:menu name="通过USB采集" text="通过USB采集" menuitem="usbcollectform_menuitem">


        </a:menu>
         
        
        <a:menu name="通过 Modem 采集" text="通过 Modem 采集">

        </a:menu>
      </a:menu>
   
      
    </a:menu>
    <a:menu text="数据报表" name="数据报表" securityKey="数据报表">
      <a:menu name="日数据" text="日数据" menuitem="dayform_menuitem"/>
      <a:menu name="月数据" text="月数据" menuitem="monthform_menuitem"/>
      <a:menu name="报表" text="报表">
        <!--report03_menuitem-->

        <a:menu name="可靠性运行统计表" text="可靠性运行统计表" menuitem="可靠性运行统计表"/>
        <a:menu name="供电电压监测点最高最低电压记录表" text="供电电压监测点最高最低电压记录表" menuitem="供电电压监测点最高最低电压记录表"/>


      </a:menu>
      <a:menu text="数据维护" name="数据维护" menuitem="maintenanceWizard_menuitem"/>

    </a:menu>
    <a:menu text="报警处理" name="报警处理" securityKey="报警处理">
      <a:menu text="报警设定" name="报警设定" menuitem="alarmsettingform_menuitem"/>
     
      <a:menu text="报警" name="报警" menuitem="alarmform_menuitem"/>

    </a:menu>


  </a:application>


</objects>
20 楼 dajian 2010-07-01  
jspine 写道
国内还真没看到多少应用。。。以前在机房看过华为的一套网管系统,除此之外少见SWING的应用。



HW,ZTE等电信厂商的网管系统的swing用的还真不错~~ 界面也很漂亮

俺虽然一直做电信网管,确还没真正领会swing的精髓~~  向LZ学习
19 楼 wwwwwhg 2010-07-01  
<div class="quote_title">xiaozhonghua 写道</div>
<div class="quote_div">
<p> </p>
<div style="background-color: #ffffff; margin: 8px; font-family: Verdana, Arial, Helvetica, sans-serif; color: #000000; font-size: 12px;">
<p style="margin: 0px;"><span style="color: #ff0000;"><span style="color: #339966;">不喜欢看文字的朋友:可直接</span></span><a href="http://dl.iteye.com/topics/download/ac24482b-5b7a-309f-93d4-7e01b198c5eb"><span style="color: #ff0000;"><span style="color: #339966;">下载可执行程序</span></span></a><span style="color: #ff0000;"><span style="color: #339966;">。要源代码的朋友:容我再整理几天,但一定会奉上。喜欢更多抓图的朋友:可以在上篇文章</span></span><a href="/topic/699515"><span style="color: #ff0000;"><span style="color: #339966;">《Swing是一把刀》</span></span></a><span style="color: #ff0000;"><span style="color: #339966;">中看到更多抓图。</span></span></p>
<p style="margin: 0px;"> </p>
<h1 style="font-size: 2em;">关于绿色</h1>
<p style="margin: 0px;">喜欢绿色,喜欢雅黑,无可救药。在这个吵吵闹闹的软件行业,绿色也忽然从“春风一拂千山绿”唯美变成俗不可耐的buzzword。比如:</p>
<p style="margin: 0px;"> </p>
<ul>
<li>绿色软件:大大的buzzword。忽然一夜之间,所有的软件都绿色了,好像不“绿”就跟不上形势。比如绿色杀毒,绿色OFFICE,绿色ERP,绿色windows。反正全绿。</li>
<li>绿色征途:看,精神鸦~片也可以很“绿”的;</li>
<li>绿~坝-花季护航:呃,老好的软件,不多说了;</li>
<li>绿色世博:嗯,喊的老响了。至今一头雾水。</li>
</ul>
<div>绿色还有一些不好的词,比如人人避之不及的“绿帽子”之类。台湾的绿营也代表了大坏蛋那帮人(至少陈水扁带了个头)。还有“我把老板气的脸都绿了”、”老板整天灯红酒绿“,也都不是什么好词。</div>
<div><br></div>
<div>不过绿色更多的还是代表了“春天、自然、环保、低碳”等没好的东西。皮尤慈善信托基金(Pew)在一份名为《绿色改变世界》的研究报告中指出,计算机屏幕如果使用绿色可以节省大量电能并降低辐射,保护使用者双眼和皮肤。例如一个全屏显示的绿色软件界面可以让一台液晶显示器消耗功率降低13.7瓦;假设美国电脑拥有量为5299万台来计算,每年仅关机状态功耗一项可以节约 6.2亿度电。如果我们把所有的软件都设计成“绿色”这个环保色,每台计算机都会减少5%的电能和辐射,人的情绪也会更加平缓舒畅,心脏和双肺由此减少12%的血液循环负担,从而降低人类对氧气的需求和二氧化碳的呼出达到14%。加上节省下来的对皮肤护理保养、心肺疾病治疗、近视以及眼镜相关行业对自然资源的消耗,每年全球可以节省1400亿美元的资源消耗,相当于减少砍伐8500平方公里的亚马逊热带雨林,对于处于正在复苏之中的世界经济具有说一不二的作用。看来,“绿色软件”,先把自己的界面搞“绿”了,就是地球的一大幸事!</div>
<div><br></div>
<div><strong>(注意:上述报告和数据纯属胡诌八扯,如有雷同,纯属巧合。)</strong></div>
<div><br></div>
<div>但是制作一个绿色的软件界面确实一个心愿。尤其是能够体现“<strong><span style="background-color: #ffffff; color: #339966;">枝间新绿一重重</span>,小蕾深藏<span style="color: #ff0000;">数点红</span></strong>”的那种感觉!现在终于有了,经过一个多星期的折腾,终于有了一个雏形,在上一篇博文<a href="/blog/699515">《Swing是一把刀》</a>中给大家看到的:</div>
<div><br></div>
<div><br></div>
<p style="margin: 0px;"><img style="border-width: 0px;" src="http://dl.iteye.com/upload/attachment/270776/56a40471-bbe5-3a93-8906-e452b5ee7fc7.png" alt=""></p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> <br><img src="http://dl.iteye.com/upload/attachment/270966/5f732e50-4dc4-30a2-827f-4b407e57e2cb.png" alt=""><br> </p>
<h1 style="font-size: 2em;">框架,还是框架</h1>
<p style="margin: 0px;">这个程序的设计初衷是快速建立一个美观的Swing应用程序外观。但是,具体来说,它又并非完全是下面几个东西:</p>
<ul>
<li>LookAndFeel:这个程序并非一个LnF。一个LnF会对所有的Swing组件进行重新定义Paint并可以通过UIManager.setLookAndFeel进行启用。这个程序用到了大量LookAndFeel的机制,甚至也直接定义了不少UI。不过它并不是一个完整的LookAndFeel。这些定制完全是为这个程序框架服务的。也就是说,这些UI和重绘机制只有在当前的程序框架起作用,而无法指望一句UIManager.setLookAndFeel就将你的任意Swing程序变成上图风格。</li>
<li>组件库:也不是组件库。其实里面的组件,除了这个OutlookPane(左侧的模块树)是完全新做出来的(而且没有从JTabbedPane继承,也许理论上还经不起太严谨的推敲),其他的组件都是很简单、现成的。例如列表、按钮、菜单等,都是直接用Swing的,只是重载了一些方法或者定义了UI而已。而且我并非是想让大家直接new OutlookPane()这样来使用,而是使用XML文件对整个界面进行配置使用;</li>
<li>GUI程序框架:似乎有点大。这仅仅是一个很小的程序而已。</li>
</ul>
<p style="margin: 0px;">做Java的喜欢满嘴Framework。你要是不能气定神闲一口气提到20个Framework并有意无意的暗示自己很精通,那~都不好意思跟人家说话;最好再能挑一个有点名气的,指手画脚、评头论足、怒其不争一下下,那就像大牛了(例如Hibernate就是个很不错的candidate)。所以,咱这个小程序也就死乞白赖往“框架”上凑凑,反正已经带上了“绿帽子”,也不怕丢人丢到底。</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;">好吧,这是一个框架,虽然我也不知道框架该怎么定义。反正我的设计初衷是:如果你用Swing开发一个类似上图结构的应用程序,那么你可以直接用这个框架。这个程序框,包含了上面菜单、地下状态条、左边模块栏、右边功能快捷列表,中间多tab标签页的各种内容(也提供了几个常用的内容页风格,例如列表、流程图等)。这个窗口已经被封装好,通过XML配置文件来定义菜单、状态条、模块栏、流程图、右边的快捷列表。同时,这些都是联动的。例如:点击左边的模块栏中的子模块,一个对应的流程图会显示在中间tab页;选中流程图中的节点,可以把该节点相关的功能列在右侧。点击右侧列表,可以执行各种定义好的动作(动作通过动作码定义,后面会详细介绍)。使用么,直接new 一个窗口类,set各个部分的XML文件名,然后setVisible(true)就OK了。至于中间的各个组件和大家关心的LookAndFeel,则都定义好了,基本上不用太关心细节。</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;">不管怎么说,我们就叫它“框架”吧。</p>
<p style="margin: 0px;"> </p>
<h1 style="font-size: 2em;">XML配置</h1>
<p style="margin: 0px;">每个应用程序都千奇百怪,功能各异。如何用一个同样的界面来组织呢?的确,这个界面并非适合所有人。不过这里的所有菜单、按钮、流程图、图标等,其动作都是可以用一个“动作码”类定义的,所有的动作都会回调一个统一的函数。而我们只要在这个函数处插入监听,就可以拦截具体动作码,执行我们想做的任何事情,例如格式化C盘、往aobama@whitehouse.com邮箱发个垃圾邮件啥的。</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;">例如,要定义主菜单,通过这个XML:</p>
<p style="margin: 0px;"> </p>
<pre name="code" class="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;menubar&gt;
  &lt;menu text="System"&gt;
    &lt;menu text="One Sub Module"&gt;
      &lt;menuitem text="Test Report Item" tooltip="Tooltip"
                            icon="/free/email.png" action="A001"/&gt;
      &lt;menuitem text="Test Report Item" tooltip="Tooltip"
                            icon="/free/email.png" action="A001"/&gt;
      &lt;menuitem text="Test Report Item" tooltip="Tooltip"
                            icon="/free/email.png" action="A001"/&gt;
      &lt;menuitem text="Test Report Item" tooltip="Tooltip"
                            icon="/free/email.png" action="A001"/&gt;
...
  &lt;/menu&gt;
&lt;/menubar&gt;</pre>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> 以上XML可以定义一个System的主菜单,以及一个One Sub Module的菜单项,以及一系列的二级菜单。每个菜单都可以设置icon图标、文字、tooltip文字,以及动作码(就是那个action)。如下图:</p>
<p style="margin: 0px;"><br><img style="border-width: 0px;" src="http://dl.iteye.com/upload/attachment/270796/70f2140f-ddea-3218-9d5f-f60eb296949f.png" alt=""></p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;">左侧的模块栏就是典型的Outlook的风格,很多软件干脆都叫它OutlookPane(我这里也是如此)。这个OutlookPane的配置,通过如下类似XML:</p>
<p style="margin: 0px;"> </p>
<pre name="code" class="xml">&lt;outlook&gt;
  &lt;module text="Engineering Box"
                 icon="/free/test/module_unselected.png"
                 selected_icon="/free/test/module_selected.png"
                 network="network.xml"&gt;
  &lt;/module&gt;
&lt;/outlook&gt;</pre>
<p style="margin: 0px;">同样,主模块(也就是每个大分栏)包含了模块栏的文字、icon图标(选中和未选中两个),以及一个xml文件。这个xml文件包含了一个流程图,流程图包含了具体的子模块。点击展开大模块栏后,所有的子模块也会显示在栏目中,同时模块的流程关系会通过对应的xml文件中定义的方式,显示在一个图形化的流程图界面中,最终显示在中间的tab页上。</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"><br><img style="border-width: 0px;" src="http://dl.iteye.com/upload/attachment/270813/f22fa7f5-7f08-30e1-8630-9cd9dee39df9.png" alt=""></p>
<p style="margin: 0px;">可以看到,左侧的模块列表和中间的图形节点是一一对应的。当鼠标选中节点后(变成橙色),左侧的列表对应的项也会被选中。同时,和这个节点(代表了一个具体子模块)相关的功能,都会显示在右侧的快捷列表中(这是通过指向的network.xml文件定义的)</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;">上面例子中的Network.xml内容举例如下:</p>
<p style="margin: 0px;"> </p>
<pre name="code" class="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;network&gt;
    &lt;node x="30" y="50"
          text="AP Prepay"
          network_text="AP Prepay"
          tooltip="This is a tooltip of a node"
          icon="/free/test/module.png"
          list_icon="/free/test/submodule.png"&gt;
        &lt;button1 tooltip="Tooltip"
                            icon="/free/test/module_attachment.png" action="X002"/&gt;
        &lt;button2 tooltip="Tooltip"
                            icon="/free/test/module_attachment.png" action="X002"/&gt;
        &lt;button3 tooltip="Tooltip"
                            icon="/free/test/module_attachment.png" action="X002"/&gt;
        &lt;shortcuts&gt;
            &lt;separator text="Most Often Used Reports"/&gt;
            &lt;shortcut text="Add a Part" tooltip="Tooltip"
                            icon="/free/submodule.png" action="Z010"/&gt;
            &lt;shortcut text="Delete a Part" tooltip="Tooltip"
                            icon="/free/submodule.png" action="Z010"/&gt;
            &lt;shortcut text="AP Aging Report" tooltip="Tooltip"
                            icon="/free/chart.png" action="Z010"/&gt;
            &lt;shortcut text="MRP for All Parts Used this Month" tooltip="Tooltip"
                            icon="/free/user.png" action="Z010"/&gt;
            &lt;shortcut text="Dashboard of this Month" tooltip="Tooltip"
                            icon="/free/email.png" action="Z010"/&gt;
            &lt;shortcut text="All Open Purchase Orders" tooltip="Tooltip"
                            icon="/free/chart.png" action="Z010"/&gt;
            &lt;shortcut text="Search in Address Book" tooltip="Tooltip"
                            icon="/free/user.png" action="Z010"/&gt;
            &lt;shortcut text="All Online Users" tooltip="Tooltip"
                            icon="/free/email.png" action="Z010"/&gt;
            &lt;separator text="Common Reports"/&gt;
            &lt;shortcut text="All Open Purchase Orders" tooltip="Tooltip"
                            icon="/free/chart.png" action="Z010"/&gt;
            &lt;shortcut text="Search in Address Book" tooltip="Tooltip"
                            icon="/free/user.png" action="Z010"/&gt;
            &lt;shortcut text="All Online Users" tooltip="Tooltip"
                            icon="/free/email.png" action="Z010"/&gt;
            &lt;shortcut text="All Open Purchase Orders" tooltip="Tooltip"
                            icon="/free/chart.png" action="Z010"/&gt;
            &lt;shortcut text="Search in Address Book" tooltip="Tooltip"
                            icon="/free/user.png" action="Z010"/&gt;
            &lt;shortcut text="All Online Users" tooltip="Tooltip"
                            icon="/free/email.png" action="Z010"/&gt;
            &lt;shortcut text="All Open Purchase Orders" tooltip="Tooltip"
                            icon="/free/chart.png" action="Z010"/&gt;
            &lt;shortcut text="Search in Address Book" tooltip="Tooltip"
                            icon="/test/user.png" action="Z010"/&gt;
            &lt;shortcut text="All Online Users" tooltip="Tooltip"
                            icon="/free/email.png" action="Z010"/&gt;
        &lt;/shortcuts&gt;
    &lt;/node&gt;
&lt;/network&gt;</pre>
<p style="margin: 0px;"> 其中,每个node定义了一个子模块节点。节点上包含x、y坐标信息、文本信息、tooltip、icon图标(中间大的主图标),以及三个按钮。每个node如图所示,可以携带3个按钮。每个按钮可以挂一个图标、tooltip、icon以及动作码。我们可以定义其任意动作。</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"><br><img style="border-width: 0px;" src="http://dl.iteye.com/upload/attachment/270829/79f68da5-6163-3307-b36e-7f3889b4955f.png" alt=""></p>
<p style="margin: 0px;">然后,每个node又携带了一个shortcuts列表,包含了这个节点所有相关的功能点,在node被选中后,以右侧的列表方式列出。如图所示:</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"><br><img style="border-width: 0px;" src="http://dl.iteye.com/upload/attachment/270827/c3de7c76-d4e0-3d31-93a0-dffc0807a4ba.png" alt=""></p>
<p style="margin: 0px;">此外,流程图中的箭头是通过类似如下XML在network.xml中定义:</p>
<p style="margin: 0px;"> </p>
<pre name="code" class="xml">&lt;arrow x="170" y="80" direction="left" rotation="0"/&gt;</pre>
<p style="margin: 0px;"> 其中x、y是坐标,direction是方向,可以是上下左右以及斜向共8个方向。此外rotation还提供了旋转角度。如果right_up这个45度的右上角度不符合要求,可以在增加rotation进行进一步调节。</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;">右侧快捷列表的分割文字,也是通过如下xml进行定义:</p>
<p style="margin: 0px;"> </p>
<pre name="code" class="xml">&lt;shortcuts&gt;
            &lt;separator text="Most Often Used Reports"/&gt;
            &lt;shortcut text="Add a Part" tooltip="Tooltip"
                            icon="/free/test/submodule.png" action="Z010"/&gt;
...</pre>
<p style="margin: 0px;"> 分隔条可以携带一个文字,用来对很多列表项进行分组:</p>
<p style="margin: 0px;"><br><img style="border-width: 0px;" src="http://dl.iteye.com/upload/attachment/270835/fa6cdd95-e346-39e5-8528-c57caba5282a.png" alt=""></p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;">还有工具条也是可以配置的。工具条在这个框架里被放在了模块栏的顶部。通过如下XML配置其按钮:</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> </p>
<pre name="code" class="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;toolbar&gt;
&lt;button tooltip="Tooltip" icon="/free/test/message.png" action="B001" /&gt;
&lt;separator/&gt;
    &lt;button tooltip="Tooltip" icon="/free/test/user.png" action="B001" /&gt;
&lt;separator/&gt;
    &lt;button tooltip="Tooltip" icon="/free/test/email.png" action="B001" /&gt;
&lt;separator/&gt;
    &lt;button tooltip="Tooltip" icon="/free/test/viewer.png" action="B001" /&gt;
&lt;separator/&gt;
    &lt;button tooltip="Tooltip" icon="/free/test/chart.png" action="B001" /&gt;
&lt;separator/&gt;
    &lt;button tooltip="Tooltip" icon="/free/test/capture.png" action="B001" /&gt;
&lt;separator/&gt;
    &lt;button tooltip="Tooltip" icon="/free/test/image_edit.png" action="B001" /&gt;
&lt;separator/&gt;
&lt;/toolbar&gt;</pre>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;">其中&lt;separator&gt;定义了一个分割竖线 ,完全美观之用。显示效果如下:</p>
<p style="margin: 0px;"><br><img src="http://dl.iteye.com/upload/attachment/271170/3355742c-e78b-3c27-ac60-e25d19315552.png" alt=""><br> </p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;">最后一个配置项是软件右上角的LOGO。每个系统都想有一个地方漂亮的显示咱家的LOGO,那才有成就感!这里通过menubar菜单的XML文件如下配置:</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"> </p>
<pre name="code" class="xml">&lt;logo image="/free/test/logo_company.png" tooltip="WPT Power Transmission" /&gt;</pre>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;">可以对图片、tooltip进行定义。显示效果如下:</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"><br><img style="border-width: 0px;" src="http://dl.iteye.com/upload/attachment/270843/6e74c851-7801-38a5-9c1a-b2c134b691df.png" alt=""></p>
<p style="margin: 0px;">这样,一个完整的”纯绿色“应用程序框架就差不多被”配置“出来了。</p>
<p style="margin: 0px;"> </p>
<h1 style="font-size: 2em;">程序接口</h1>
<p style="margin: 0px;">其实设计初衷是无需使用源代码,直接使用下方提供的jar包即可进行二次开发。因为毕竟通过XML就可以对界面元素进行定义了。如果要把这个框架集成到你的应用程序中,并执行你的具体动作,只需要对free.Shell这个类进行一个函数重载即可。</p>
<p style="margin: 0px;"> </p>
<pre name="code" class="java">public void command(String action) {
        String message = "Perform action " + action + ".";
        this.lbStatusMessage.setText(message);
}</pre>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;">在Shell这个类中,界面上所有的按钮、菜单、列表等被点击后,都会回调这个Shell的command方法,并传回action字符串,也就是我们在XML中定义的动作码。接着你就用if else或者case啥的进行处理动作吧!当然也可以调用addTab方法在Shell界面中添加一个tab页面。其使用方法会下次详细阐述。 </p>
<p style="margin: 0px;"> </p>
<h1 style="font-size: 2em;">关于效率、内存、布局和其他</h1>
<p style="margin: 0px;">有朋友说很担心执行效率、内存占用。这是对Swing常被攻击的的一个老话题了。简单直接的回答是:Swing效率没问题。内存占用没问题。满眼哗哗一片字符串,就一定占内存吗?table有1000行,渲染的花里胡哨,就内存问题吗?完全不是这么一回事。例如,如果你了解Swing的table的renderer机制,其实无论表格有多少行,一个列是用同一个renderer实例来paint的。注意,是一个实例哈。editor也是一样。很多初学者以为这一列用JComboBox编辑,1000行就会create成1000个ComboBox。那就完全错了。Renderer就是一个“橡皮章”,一个章,不停的在每个格子里面“盖章”,重绘就重新盖;Editor就是当一个“萝卜”,哪个“坑”需要编辑时,table动态把它“放”在这个单元格(坑)上面,下次下个单元格需要编辑,再被挪过去。对于一个列来说,就一个萝卜,一个橡皮章。怎么会说“占用内存”?如果说1000行字符串占用内存,那这些字符串用什么语言和平台不占用内存呢?同样字符串在不同的语言和平台上可以说占用内存几乎没什么差别。这个以后可以专门讨论。</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;">在这个本程序中,状态栏上有一个封装好的内存监控工具条:</p>
<p style="margin: 0px;"><br><img src="http://dl.iteye.com/upload/attachment/270941/51494390-32b8-305a-8e5a-f6771cc83f9f.png" alt=""></p>
<p style="margin: 0px;">它的作用是监测目前Java的总的申请的堆内存以及使用的内存。相关代码如下:</p>
<pre name="code" class="java">MemoryMXBean memorymbean = ManagementFactory.getMemoryMXBean();

long usedMemory = memorymbean.getHeapMemoryUsage().getUsed();
long totalMemory = memorymbean.getHeapMemoryUsage().getMax();</pre>
<p style="margin: 0px;">上面图片中的“18M/63M”标明默认Java堆大小是64M目前使用了18M。尝试多打开一些表格界面、拓扑图界面,可见内存使用并不是很多。</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;">说Swing的效率低,也不是很有说服力。其实Swing本质还是Java2D在paint东西,看看那些杂乱的Metal***UI源码就知道了。不过Swing确实设计的够复杂啰嗦,一个LnF就能绕死人。这些机制会导致Swing慢一些。不过说到底程序的快慢瓶颈还不是在Swing上,还是在如何设计和使用上。例如线程的处理等等,这些都不是初学者很容易搞定的东西。这也导致Swing总是被贴上“慢”的标签。</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;">自动布局方面,也是比较啰嗦的。如果用IDE的话,推荐NetBeans里面的GUI编辑工具,它使用的实际是Matisse这个layout。这里有两篇官方文章介绍:<br><a href="http://wiki.netbeans.org/UsingGUIEditor">http://wiki.netbeans.org/UsingGUIEditor</a><br><a href="http://netbeans.org/features/java/swing.html">http://netbeans.org/features/java/swing.html</a></p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;">如果手写代码,我还是推荐一个超强但比较复杂的TableLayout。这里有其介绍:<br><a href="http://java.sun.com/products/jfc/tsc/articles/tablelayout/">http://java.sun.com/products/jfc/tsc/articles/tablelayout/</a></p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;">其他简单的布局,大多可以用Swing内置的几个layout搞定。另外尽量多套用Panel进行嵌套,化繁为简。不要试图一次一个Panel+Layout把一个复杂的界面搞定,那样会很累。</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;">有朋友很不齿这里使用到了JGoodies和TWaver,这里也说明一下。在JGoodies的基础上再去定制UI确实美观了不少,不过理论上确实可以彻底抛开JGoodies。这样就要完全彻底重写一整套的LnF了,包括文本框按钮啊所有的东西。目前确实还没有这样的时间和精力,以后会考虑出一个WithoutJGoodies版本。使用TWaver主要是为了做中间的流程图和拓扑图,并且使用的也比较顺手了。如果不需要中间的拓扑图流程图,也可以without TWaver,以后会考虑改一版。不过这些东西都是很不错的工具,能用就拿来为我所用,不喜欢用就借鉴一下了事。</p>
<h1 style="font-size: 2em;">程序下载</h1>
<p style="margin: 0px;"><a href="http://dl.iteye.com/topics/download/ac24482b-5b7a-309f-93d4-7e01b198c5eb">本程序可以在这里下载</a>。</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;">执行方法:解压zip文件,双击其中的run.bat。</p>
<p style="margin: 0px;">运行环境:Java 6。</p>
<p style="margin: 0px;">其他说明:zip包中的free.jar就是本文提到的框架。其他两个jar包是jgoodies lnf和twaver做流程图的支撑包,可不用理会。</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;">由于牵扯到公司的业务,程序的源代码还在整理之中,预计还要一周左右会整理完毕。到时候一定会跟大家分享整个程序的源代码。下一次我会详细介绍每一个组件的制作方法和相关代码。</p>
</div>
</div>
<p> </p>
18 楼 hatedance 2010-07-01  
以前做delphi的时候,也有类似的东西,叫skin什么的,还支持换肤。在swing里就叫Look&Feel了。
首先佩服lz的功力,再说点个人的看法。
论做花哨的界面,还是html+css有优势,基础广泛技术成熟.反观swing或者类似的native的平台上做外观,要么贴图,要么画像素,均不如css简便。
会用html+css做漂亮按钮或者表格,列表的人不计其数,而会用swing自定义一个漂亮组件的人恐怕就难找了。
17 楼 JavaRunway 2010-07-01  

期待下一步大作!推荐连载精华!
16 楼 norwind 2010-07-01  
膜拜,学习!
15 楼 mybw7601 2010-07-01  
这不是个玩具了,期待融合了业务的真正产品
14 楼 Silence_Smile 2010-07-01  
我觉得lz可以考虑出本书啊,关于Swing的书太少了,有的全是讲基础,讲实例的几乎没有!
13 楼 davepkxxx 2010-07-01  
LZ可以考虑吧边框改成自己的样式
12 楼 javazeke 2010-07-01  
膜拜//////
11 楼 marmot 2010-07-01  
TWaver的授权费用很昂贵...
10 楼 mlw2000 2010-07-01  
看到好贴过来学习一下
9 楼 wese345 2010-07-01  
从来都以为swing只能通过LookAndFeel变得和windows差不多的界面,现在看来,比windows好看多了,对lz的功力敬佩啊
8 楼 jspine 2010-07-01  
国内还真没看到多少应用。。。以前在机房看过华为的一套网管系统,除此之外少见SWING的应用。
7 楼 piziqie 2010-07-01  
膜拜啊~..
  
6 楼 phoenixup 2010-07-01  
现在一直用QT,觉得还对付~~年纪大了有点懒了。。。。不过Swing玩成LZ这样还有点意思~~回头试试,关键是要上源码~~上文档~~要做大,要做强。。。。
5 楼 huhuanqadn 2010-07-01  
swing还是很牛逼的,只是复杂了点

相关推荐

    SWING大刀系列源码

    主题:Swing第二刀:枝间新绿一重重 http://www.iteye.com/topic/707540 主题:Swing第二小刀刀:星星之火可以燎原 http://www.iteye.com/topic/707514 Swing第三刀:做套ERP,要配得上我的登录界面! ...

    Swing_大刀系列.pdf

    1.2 Swing第二刀:枝间新绿一重重 1.3 Swing第三刀:做套ERP,要配得上我的登录界面! 1.4 Swing第四刀:代码尽散换芳华 1.5 Swing第五刀:走马观花看世博 1.6 Swing第六刀:老婆不能换,窗户框可以

    Swing第三刀:做套ERP,要配得上我的登录界面

    Swing第三刀:做套ERP,要配得上我的登录界面

    Swing第二刀(转)

    Swing第*刀(转) 觉得很好,发给大家看看,不需要分

    java swing是一把刀

    文件名列表中的"swing第一刀.doc、swing第三刀.doc、swing第二刀.doc、swing第四刀.doc"可能包含了一系列教程或示例,指导读者如何利用Swing的特性。这些文档可能涵盖了从基本组件的使用到高级主题,如布局管理、...

    基于Swing应用程序设计:一个简易的文本编辑框

    标题: "基于Swing应用程序设计:一个简易的文本编辑框" 这个标题表明我们将讨论如何使用Java的Swing库来设计一个基本的文本编辑器。Swing是Java提供的一个用于构建图形用户界面(GUI)的工具包,它包含了各种组件,如...

    Swing第一刀(转)

    Swing第*刀(转) 觉得很好,发给大家看看,不需要分

    Swing大刀系列

    - **Swing的现状**: Swing作为一种桌面应用开发框架,在Web技术和RIA(富互联网应用)兴起后受到了冷落。很多人认为Swing已经过时或者即将被淘汰。 - **Swing的价值**: 实际上,Swing仍然是一种强大的工具,适合用于...

    Java Swing大神必经之路

    第2篇 Java Swing大神必经之路2:啃透JDK源码-JCheckBox详解 本篇文章详细介绍了 JCheckBox 的继承体系和常用方法,包括构造方法、isSelected()、setText() 等,幫助讀者更好地理解 JCheckBox 的使用。 第3篇 Java ...

    精通java-swing开发.doc

    在Java Swing开发中,Swing组件库是一个强大的工具集,用于构建图形用户界面(GUI)。这个库主要围绕着`javax.swing`包展开,它提供了丰富的组件、布局管理器以及事件处理机制,使得开发者可以创建出复杂的桌面应用...

    Java.Swing第二版

    《Java.Swing第二版》是Java开发者不可或缺的经典教程,它深入浅出地讲解了Java Swing库的使用,帮助程序员创建美观且功能丰富的图形用户界面(GUI)。Swing是Java Foundation Classes (JFC)的一部分,提供了丰富的...

    java swing三把刀

    在提供的文件列表中,我们看到有四份文档分别命名为“swing第一刀.doc”、“swing第二刀.doc”、“swing第三刀.doc”和“swing第四刀.doc”,它们可能详细介绍了这些核心概念和技术。同时,“src.zip”可能包含了...

    Swing第三刀(转)

    Swing第*刀(转) 个人觉得不错,发来大家学习,不要分

    Swing第四刀(转)

    Swing第*刀(转) 个人觉得不错,发来大家学习,不要分

    Swing第六刀(转)

    Swing第*刀(转) 个人觉得不错,发来大家学习,不要分

    Swing这一刀

    "Swing这一刀"指的是在Java编程领域中对Swing库的深入理解和应用。Swing是Java的一个图形用户界面(GUI)工具包,它提供了丰富的组件和功能,用于创建桌面应用程序。这篇博客文章可能详细探讨了Swing在构建用户界面...

    Swing第五刀(转)

    Swing第*刀(转) 个人觉得不错,发来大家学习,不要分

    Java Swing(第二版)

    在Java Swing第二版中,涵盖了更深入的Swing组件使用、布局管理、事件处理以及自定义组件等内容。这本书的源码提供给读者实践和探索Swing API的机会。 1. **Swing组件**:Swing提供了许多组件,如JButton、JLabel、...

    swing-layout-1.0.3

    swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3...

    Java Swing创建自定义闪屏:在闪屏上添加Swing进度条控件(二)

    NULL 博文链接:https://yshjava.iteye.com/blog/1326539

Global site tag (gtag.js) - Google Analytics