描述Swing实现的目标
创始人
2024-04-17 10:50:23
0

Swing实现的目标

按Swing实现的目标,将开发java界面的开发人员分为两类:首先是开发独立的组件,这些组件与具体应用无关,Swing自身也提供了一套,开发者也可以开发自己的组件,这些人是组件开发者角色;然后是为某应用程序构建GUI,则是使用那些组件类建立组件实例,并且通过建立容器关系来实现界面需求,这些是GUI开发者角色。从这个清晰的划分出发可以体会Swing面向OO开发的精神。组件开发者开发的每一个组件面向所有应用,是一个高度抽象,打包封装好的类,因此高度复用;而GUI开发者的开发过程则是根据需要继续 OO---,首先整个应用界面职责被封装成一个类,该类的实例的生命周期就代表了整个应用界面的生命周期,再从应用领域角度进行界面职责划分,利用容器概念,快速通过聚合,定制组件实例打造出承担各个细分应用领域界面交互职责的“面板类/页面类”,***应用界面类实例将在整个生命周期内不断耦合托付各类“ 面板类/页面类”实例(一般通过“页面接口”实现动态性)来完成全部界面交互职责。

反过来说,Swing也正是为了这样的oo实践需要而诞生的。在以上描述的gui构建中,最频繁的就是通过容器组装出特定面板组件来。那么如何定制子组件在容器面板上的分布呢?

Swing实现的目标是Container中可以setLayout(LayoutManager mgr),该mgr给出了一种布局方式,比如按五位图布局还是表格布局;而子组件加入容器时可以给出针对此容器布局方式的各自的布局信息, Container.add(Component comp, Object constraints);***当绘制该容器的子组件时根据这些布局信息计算出各组件合适的大小位置等信息进行绘制即可。不过在Swing中,为了提高性能,不是每次绘制时都重新根据布局信息计算该如何绘制子组件,而是将在一次处理过程中把根据布局信息计算的绘制要求存储在子组件和容器中,比如调整后的子组件的位置,容器的合适大小等,以后绘制时直接绘制;除非此后发生布局变化,比如容器remove掉一个子组件,将要导致一次重新计算布局信息的处理过程;由于Swing中的组件关系是一层包一层,某一层的变化可能导致整个树都需要重新计算,这就和repaint的场景类似了,也因此,Swing将采取类似repaint的提交请求等待处理的模式,就是传说中的revalidate。下面看jre1.7中具体的实现:

  1. PublicclassJComponent{  
  2. publicvoidrevalidate(){  
  3. if(getParent()==null){  
  4. return;  
  5. }  
  6. if(SwingUtilities.isEventDispatchThread()){  
  7. invalidate();//使该组件布局失效  
  8. RepaintManager.currentManager(this).addInvalidComponent(this);//向RM请求一次重布局  
  9. }  
  10. else{//如果不是在EDT中调用需要调整到EDT中。  
  11. //ToavoidafloodofRunnableswhenconstructingGUIsoff  
  12. //theEDT,aflagismaintainedastowhetherornot  
  13. //aRunnablehasbeenscheduled.  
  14. synchronized(this){  
  15. if(getFlag(REVALIDATE_RUNNABLE_SCHEDULED)){  
  16. return;  
  17. }  
  18. setFlag(REVALIDATE_RUNNABLE_SCHEDULED,true);  
  19. }  
  20. RunnablecallRevalidate=newRunnable(){  
  21. publicvoidrun(){  
  22. synchronized(JComponent.this){  
  23. setFlag(REVALIDATE_RUNNABLE_SCHEDULED,false);  
  24. }  
  25. revalidate();  
  26. }  
  27. };  
  28. SwingUtilities.invokeLater(callRevalidate);  
  29. }  

【编辑推荐】

  1. 介绍JavaFX功能与Swing的关系
  2. 浅谈Swing中lookandfeel源代码
  3. 概述Swing中的Timer对象
  4. 浅析Swing中actionPerformed()方法
  5. 详解所有的Swing核心组件

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...