面朝测试,春暖花开.

[Funny Swing][一起学]迈出LookAndFeel的第一步(模仿)

上一篇 / 下一篇  2011-12-31 15:05:36 / 个人分类:Funny Swing

   今年在建立这个blog的时候就已经有这个栏目[FunnySwing],一直都想写点关于Swing的学习笔记,虽然我不是个专业的开发人员,但是还是蛮喜欢Swing的,我的开发经验也是从Swing开始的,虽然曾经自己带和几个测试人员开发过一个简单的web缺陷管理系统(JSP),但是始终对swing情有独钟,也许是念旧吧,呵呵.今天年中的时候 曾经想写个DB2的操作工具,给测试人员用,其实是自己想做个给自己用,但是断断续续的做到现在发现,完全可以适合于普通的测试人员工作用,功能说不上多强大,但是关键在完全的定制,说白了,只要我们测试人员需要,愿意加什么就加什么功能,每一年的开始我都会选者一个想法,并坚持把它实现,这也作为我学习各种技术和理论的最好方法,很多时候从无到有能得到的快乐与满足,不是金钱能给予的,好了不罗嗦了下面开始这次的主题,自己动手去改变 Java的Look and feek,直接点说,怎么在一个基础上改出自己想要的效果.

 java的lookandfeel,就是外观风格,现在在网上能找到很多,也有很多非常优秀的外观,下面的解决方法思路里面我也会列举出我借鉴的两个外观,这篇文章,就是迈出的第一步,开始动手改吧.

 下面先来看两张图 (下面的显示的工具是我自己做的 DB2的操作工具,支持OracleMySQL):
 1.标准的java外观风格.(带有比较闹心的XP tiltebar)



  2.经过我改变的,自己定义的Titlebar.

    
  
   来点解释吧,我参考了两种外观:下面是参考的网站:

   1.http://www.jtattoo.net/  做的非常美观的,java外观,我的Titlebar的最大最小的Icon就是来自这里 嘿嘿,有些在处理windows操作的观点和操作也来自这里.
   2.http://executequery.org/screens.jsp 这个工具的 smoothgradient 外观,这个外观是改自Smooth外观,但是不带有自定义的Titlebar的,我修改的外观也是来自这里,因为配色相对简单可以像java的官方ocean theme一样设置简单的主要配色就可以,而jtatto虽然很绚很好但是实在是配置项需要太多.我就把这executequery的外观用JTatto的方式修改了一下.
     
说实话,Jtattode 外观代码我看了一段时间,但是实在是能力有限,我没有搞定清楚,但是我明白了一个原理 如何去替换掉java自带的Xp的titlebar.自己写的工具总想有个自己的外观.

    现在的各种论坛上也有一些改变外观的方式,简单就是自定义控件,比如继承 JButton 写个自己的button,或者直接写个JComponent,作为button然后添加上各种鼠标事件啊什么的,但是你总不能自己写个jComponent来替换掉JFrame吧,工程量太大啦,而且JFrame属于重量级组件,这是跟操作系统相关的,你要是直接继承 你是没有办法实现自己定义的Titlebar的,Java2D的使用是相当必要的,听起来难,实际上确实也难,我看过Jtatto代码后 也基本上是傻眼啦,要想把所有的轻量组件都写一遍,那是需要相当的代码量和Java2D的技术的,我没那本事,但是咱可以在小范围里面改啊.
   先来了解下原理,JFrame--Jrootpane---Container来添加 轻量组件,所以我们大部分的操作是在Container中设置layout来添加组件的比如JButton什么的,但是JMenubar是通过Jrootpane来添加的,而java有个方法是可以强制取消掉本地操作系统的Titlebar的(JFrame.setDefaultLookAndFeelDecorated(true)和JDialog.setDefaultLookAndFeelDecorated(true)).所以我们自己改的时候也从这里开始,通过自己写的一个JComponent命名为titlepane在把这个titlepane,加入到JRootpane里面,让这个titlepane来实现jframe带的本地操作系统的titlebar实现的功能,比如最大最小,JFrame的图标,双击最大化什么的,至于其他的组件,比如jButton什么的我们可以通过继承MetalButtonUI ,或者basic的ButtonUI来实现个性化,只要你有想法你可以把所有的组件的UI代理类从写一遍,这就是你自己的个性化外观啦.
  因为titlebar是你自己实现的JComponent,所以你可以任意添加你想要的组件个功能.往大了说 比如说WPS2012的界面外观,比如左上角的button点击后弹出的好看的菜单,就是可以实现的.
  再来说说自己定义的titlebar一般都包含哪些.左边是 一个menu为了加载你自己的应用程序的图标和title,点击后弹出个菜单来实现最大最小关闭menuitem.最右边是最常见的最大restore和closebutton,写三个你喜欢的Icon加入到button中,在把button设置为透明的,这样整个基础的自定义titlebar就实现啦.在写个titlepane的layout把这些定义的组件添加到自己的titlebar上,在写个PropertyChangeHandler来实现当用户点击这些button时应该实现的操作,注意一点,如果你去掉JFrame的本地 titlebar,那么最大化的时候需要明白,如果你不做处理,会把你系统最下面的taskbar栏遮挡掉,需要处理,比如你的分辨率是1440X900,那么最大化的时候,就因该是最大到1440X837的size,这样才正常.
  下面是些代码的截图:

  1.menu
   
  2 最大最小什么的icon button.
    

  3.titlebarlayout

   

  4 添加PropertyChangeListener 来监控titlepane的属性变化,来实现 最大最小什么的.

   


   想完全自己实现个个性化的外观真是很难,但是我们可以抱着学习的态度去,慢慢做 一点一点的改,学习总是那么一点一点的进步,后续的步骤 还在研究,我也会继续更新FunnySWing的blog,参考别人成型的代码,可以便于自己去学习和了解原理,我已经实现了基本的功能就像上面的截图一样,叫SmartMetal,可以直接像其他的外观一样,直接使用.在这里只是想对和我一样初学的朋友不要只是 熟练 拷贝和粘贴,而不去思考,拿来主义不是只有这些.
   好了罗嗦了一堆,这次就到这里了,希望对你有帮助.


TAG:

 

评分:0

我来说两句

cypress

cypress

步子不能迈的太大,这样容易扯着蛋.

日历

« 2024-05-13  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 9738
  • 日志数: 12
  • 建立时间: 2011-02-16
  • 更新时间: 2011-12-31

RSS订阅

Open Toolbar