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

Swing第六刀:老婆不能换,窗户框可以

阅读更多

闲话

到了第六刀,JavaEye社区这股刚刚被掀起的Swing学习热情,似乎正如天上飘过的这朵小乌云,在狂暴的烈日暴晒中,已迅速消散殆尽。刚才驻足抬首、啧啧称奇的人群已经迅速消散,继续在每天忙忙碌碌中烦躁,浮躁中无聊。写程序的生活,似乎总少那么一丝颜色,一股激情,一抹精彩。

谈论别人的精彩使我们永恒的话题。可是精彩却从未在我们身上发生,这似乎成了我们普通人的宿命。程序员有一个聪明的大脑和颗追求精彩的年轻的心,却不一定有强健的双腿和马拉松一样的耐力。因此那块精彩的大馅饼未砸在自己头上,也就似乎不难理解了。谈论别人的精彩,让自己永远是一个看客。我们何不利用闲暇时间,自己动手,勤学苦练、笔耕不辍,打造巧夺天工、鬼斧神工的编程手艺呢?本来,程序员就是一名现代“手工匠”。

那些满嘴之乎者也、非“框架”不编程、干过多少项目、跳过多少槽、写过多少书,而连synchronized、transient等关键字都没用过、甚至不用金山词霸捣鼓半天都拼不出来这些单词的人,我相信我们身边始终不乏这类“大牛人”。让一个根本不知道地基怎么挖、砖头怎么烧、水泥怎么浇、钢筋怎么焊、墙体怎么垒的建筑师来负责设计陆家嘴的金茂大厦,那是不可思议的事。而在我们软件行业,这似乎是再常见不过的事。怎么,你的老大在会上怒吼“周末一定要发布”、“月底打死要验收”的同时,他很清楚你正在修改的“订单编号要允许任意修改”的“客户合理需求”要导致数据库、PO、VO、EJB、通讯层、界面、设计文档、测试用例、用户手册等所有地方都要修改吗?他理解这需要2天甚至20天而不是2个小时吗?如果答案是肯定的,无疑你很Lucky,别抱怨了,偷着乐吧。

 

言归正传

三年前,微软发布了新一代操作系统Vista。Vista最大的卖点,无疑是那个具有半透明效果的窗口系统:Aero界面风格。虽然直到现在性能稳定性更加的Win 7都已经上市,但坚守在Windows XP上的朋友还有相当大的比例。不过没有人否认的是,Aero风格的半透明界面风格,甚是非常讨人喜欢。

Swing大刀砍刀这里,大家肯定知道我们想做什么了:Swing砍一个类似Vista的Aero窗口风格。如果你还坚守在Windows XP阵营,那么不妨用Swing给你的程序换个彩色的、半透明的“窗户框”,透透新鲜空气和阳光,让我们死板的编程生活也多一点精彩!先来一张效果图。如果有点审美疲劳,注意看窗口的边框,而不是花里胡哨的内部。这个窗户框可不是操作系统的,而是Swing活生生画出来的。

基本思路

要用Swing实现这种风格的窗户框,要解决的问题不少。

  • 首先要解决去掉原来窗户框的问题。这个在以前的《Swing大刀》系列文章中提到具体做法,不难;
  • 其次,仔细观察Vista风格的窗体,其拐角是透明的圆角,而不是直角。要做到这一点,要让窗体透明。这个在以前的《Swing大刀》系列文章中也提到了具体做法,同样不难;
  • 自己绘制四周边框。这个可以用一些JLabel之类的组件放置在四周,并用美工制作的素材图打底。罗嗦一点,但是同样可以做到;
  • 窗口的操作。包括resize、move、标题栏双击等动作,都要统统自己来。还有,右上角的最小化、最大化、关闭窗口,也要自己动手;
  • 半透明。这个是关键,也是难点。我们用半透明的图片来解决,还要配上程序控制的半透明底色的动态渲染,以做到颜色动态的“千变万化”。例如,仔细观察Vista和Win7,窗口在active和inactive时候,边框的颜色、透明度等都是有变化的。我们Swing怎么能含糊呢?
  • 窗口标题的模糊背景。仔细观察Vista的窗口标题背景,有白色的一抹光晕。这个弄模拟出来吗?当然!既然Swing是大刀,就要刀刀见血、刀刀致命!当然这个也是本文中技术难度最大的一块,消耗了我一个周六上午才弄出来;
  • 难题还没结束。在具体写代码过程中,还遭遇了一个JDK的bug,几乎断送了所有的努力。最终,凭借在吃中午饭的路上差点被一辆飞驰的搅拌车kill的一瞬间迸发出的大量肾上腺激素,得到一个超凡脱俗的idea,几行代码,绕过了这个bug,终于应来了最终的春天。这个技术不难,思路却很诡异,有兴趣的请继续看。

下面,我们一起来用Swing这把大刀,给你的程序换上一张全新的“自制窗户框”吧!

 


 

文章很长,贴起来实在很累。已经快12点了,两个眼睛直打架。要看全文或要源代码的朋友,请点击这里。以后的文章,也可能同时贴在这个新地方

  • 大小: 547.3 KB
分享到:
评论
42 楼 salutonmondo 2013-05-27  
几年前看到你的Swing三刀,那叫一个向往,可惜当时在一家小公司做实施,忙得跟本没时间做自己感兴趣的事,跳槽去了一家外企,也有时间搞Swing了,做了一些pivot table,自定义组件,对Swing的paint机制的了解让我有了一丝以前从未有过的”知所以源“的骄傲。虽然到现在从未使用到过Swing,但还是这样默默坚持.今天无意间再进来,发现你都更新到第6刀了,佩服你对Swing的坚持,感射你的分享的精彩。
41 楼 x844010689 2013-04-08  
  有个问题,请较下 拉动窗口大小时 cpu比较高,有什么方法处理吗?
40 楼 liujohnfeng 2010-12-26  
学java有两三年了,楼主让我彻底改变了对swing的看法
39 楼 okjacky 2010-11-25  
太牛叉了 以为这样的界面只有在.net中才能出现。 膜拜
38 楼 xiaobadi 2010-11-09  
膜拜。。。
这位大哥。我的问题你能帮我看看吗?
http://www.iteye.com/topic/806760
谢谢!!!!!!
37 楼 iaimstar 2010-11-08  
刀刀精华。。。
36 楼 chenjie100 2010-11-02  
Java适合做后台应用,Swing这种东西少花精力研究!
35 楼 dopic 2010-11-02  
老大,这是twaver
34 楼 忧里修斯 2010-08-19  
一个字:牛!学习了!
33 楼 zhangqingxin 2010-08-18  
前面的闲话实在太精彩了~
32 楼 xiaozhonghua 2010-08-18  
CodingMouse 写道
sulifeng 写道
额...............我的系统是win7,用鼠标按住标题栏进行拖放的时候似乎出现了点毛病,无法进行拖放..........................



很明显你没有认真读过代码!

在 Shell 这个类中,将initSwing()这个方法中第113行的:

            @Override
            public void componentMoved(ComponentEvent e) {
//                syncBounds();
            }


中的 syncBounds(); 前面的注释符号去掉即可。

呵呵,正解。当初初始掉了这个代码,是为了故意让它分离,然后抓图放在文章中用于演示之用;后来忘记改回来了。能认真读代码感觉非常敬佩!
31 楼 CodingMouse 2010-08-17  
sulifeng 写道
额...............我的系统是win7,用鼠标按住标题栏进行拖放的时候似乎出现了点毛病,无法进行拖放..........................



很明显你没有认真读过代码!

在 Shell 这个类中,将initSwing()这个方法中第113行的:

            @Override
            public void componentMoved(ComponentEvent e) {
//                syncBounds();
            }


中的 syncBounds(); 前面的注释符号去掉即可。
30 楼 kezhon 2010-08-17  
请问敬爱的大侠,Swing有没有WebBrowser控件可用,并且可以用此控件调用Web的DOM接口?
29 楼 sulifeng 2010-08-17  
额...............我的系统是win7,用鼠标按住标题栏进行拖放的时候似乎出现了点毛病,无法进行拖放..........................

28 楼 xiaozhonghua 2010-08-16  
CodingMouse 写道
我认真读过了楼主的关于2BizBox代码,看到有几个问题(不是挑刺,只是希望这个DEMO越来越好),希望楼主看看能否解决,内容都在以下图片中:








烦请楼主看下,看是不是我理解上有误?还是确实存在这样的问题。

期待楼主的更多刀法分享!谢谢!

不得不说你真是一个有心人!你提到的问题应当说都是这个demo的粗糙和不足之处,在项目使用中我也会再进行改进。不过例如效率等方面的问题确实不好处理,因此XP等操作系统如果资源确实不够好,还是建议去掉边框的特效。当然好在ERP类的软件大多都是最大化后很少去拿鼠标折腾resize。最近在忙其他的东西,这块内容没怎么碰了;不过还是很感谢你的建议和细心!希望一起学习,共同进步!
27 楼 CodingMouse 2010-08-16  
我认真读过了楼主的关于2BizBox代码,看到有几个问题(不是挑刺,只是希望这个DEMO越来越好),希望楼主看看能否解决,内容都在以下图片中:








烦请楼主看下,看是不是我理解上有误?还是确实存在这样的问题。

期待楼主的更多刀法分享!谢谢!
26 楼 goldendays 2010-08-03  
Swing在lz手中简直是神兵利器
25 楼 njnu_zhoubo 2010-08-02  
楼主就是java程序员中的令狐冲啊,练就了独孤九剑啊
24 楼 jianfeihit 2010-08-02  
Java的桌面编程已经很长时间不再碰了,曾经一度没有看到桌面编程的前途,现在没有想到这个可以做到这么酷
23 楼 CodingMouse 2010-08-02  
很NICE!感谢分享!期待更多刀法的演示。

相关推荐

    SWING大刀系列源码

    主题:Swing是一把刀 ...主题:Swing第二刀:枝间新绿一重重 ...主题:Swing第二小刀刀:星星之火可以燎原 ...Swing第三刀:做套ERP,要配得上我的登录界面!...Swing第四刀:代码尽散换...Swing第六刀:老婆不能换,窗户框可以

    Swing_大刀系列.pdf

    Swing大刀系列: 1.1 Swing是一把刀 1.2 Swing第二刀:枝间新绿一重重 1.3 Swing第三刀:做套ERP,要配得上我的登录界面! 1.4 Swing第四刀:代码尽散换芳华 ...1.6 Swing第六刀:老婆不能换,窗户框可以

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

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

    Swing第六刀(转)

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

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

    As a professional in the IT field, I'll be detailing the knowledge points from the given title, description, and tags, specifically focusing on creating a simple text editor using Swing in Java. ...

    java swing 边框事件

    Swing中的边框不仅仅是装饰,它们还可以具有功能性,比如可以添加监听器来处理用户的交互行为。边框可以通过`Border`接口的实现类来设置,如`TitledBorder`、`EmptyBorder`、`LineBorder`等,每种边框都有不同的样式...

    Swing大刀系列

    ### Swing大刀系列知识点概述 #### 1. Swing的地位与争议 - **Swing的现状**: Swing作为一种桌面应用开发框架,在Web技术和RIA(富互联网应用)兴起后受到了冷落。很多人认为Swing已经过时或者即将被淘汰。 - **...

    swing登录框登录框登录框

    swing登录框swing登录框swing登录框swing登录框

    精通java-swing开发.doc

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

    Swing第二刀(转)

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

    java swing是一把刀

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

    Swing第一刀(转)

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

    Swing第三刀(转)

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

    Swing第四刀(转)

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

    Swing第五刀(转)

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

    swing table加复选框

    `JTable`的单元格默认不能显示复选框,我们需要创建一个`DefaultCellEditor`来编辑复选框。`DefaultCellEditor`通常使用`JCheckBox`作为其组件,这样我们就可以在`JTable`的单元格中看到复选框。 3. **设置列的...

    swing弹出框

    在Swing中,弹出框是用于与用户交互的重要组件,它们可以显示警告、确认信息或者请求用户的输入。Swing提供了多种类型的弹出框,包括`JOptionPane`,`JDialog`,以及自定义对话框。 1. JOptionPane `JOptionPane`是...

    java Swing带复选框的树

    通过以上这些知识点,你可以创建一个功能完善的Java Swing应用,其中包含带有复选框的树控件。这个控件可以方便用户进行多选操作,同时也可以通过监听选择变化来执行相应的业务逻辑。在实际项目中,可以根据需求进行...

    swing教程之经典

    - **轻量级组件**:Swing中的组件被称为轻量级组件,这是因为它们不依赖于本地平台的具体实现,而是直接在Java虚拟机中绘制,这意味着它们可以在任何支持Java的平台上运行。 - **Swing组件的分类**: - **顶层容器...

    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...

Global site tag (gtag.js) - Google Analytics