轻松实现Java用户界面编程

2016-02-19 19:09 123 1 收藏

给自己一点时间接受自己,爱自己,趁着下午茶的时间来学习图老师推荐的轻松实现Java用户界面编程,过去的都会过去,迎接崭新的开始,释放更美好的自己。

【 tulaoshi.com - 编程语言 】

  Buoy 是一个构建在 Swing 之上的免费用户界面(UI)工具包,它为 UI 开发人员提供了方便性和简单性。在本文中作者用一个简单的 fractal 用户界面程序,介绍了 Buoy 可以做什么、为什么这么做。第一次尝试用 Java 语言构建简单的用户界面时,我对 Swing 接口的复杂性感到有些惊奇。老实说,有点想打退堂鼓。最近,一个朋友向我提到,他使用的渲染程序 Art of Illusion(请参阅 参考资料)基于一个不同的工具包:Buoy。推荐它的原因之一是它的界面更友好。当他第一次提到它时,我以为他在谈 "BUI",而它与 GUI 这个名字的相似是故意的。在这里 B 代表 better(更好),但是名字 Buoy 并不是缩写。
  
  Buoy 是免费的。实际上,它是公共的东西。它并没有在某个开放程度合理的许可下发布,实际上它根本不受任何许可控制。这意味着在任何用 Java 语言编写的能够运行 Buoy 的项目中都可以使用 Buoy,而不用考虑许可问题。因为提供了完整的源代码,所以这个工具包很轻易修改和扩展。本文基于 Buoy 1.3 发行版,要求读者对 Swing 有基本的了解,虽然不了解也能对付过去。
  
  示例程序
  
  我曾经尝试用 Swing 构建的第一个应用程序最后以失败告终。为了看出工具包之间的对比情况,我决定使用 Buoy 来构建这同一个程序。文章中的代码示例全部来自该程序的 Buoy 版本。程序生成了一些分形,具体地说,是迭代的分形。基本思想很简单:在平面上定义一系列的线条区段,从(0,0) 到(1,0),围绕任意一个单位线条定位。绘制这些区段之后,绘制同一套变形线条,用这个区段作为单位向量。做起来比说的更轻易,就像在图 1 中看到的。
  
  图 1. 分形编辑器中的分形
  
  这个程序的界面相当简单。它有一些界面小部件,有一个画布,在画布上绘制漂亮的图片,还支持用鼠标操纵图片。实际上,必须要做的全部工作就是操纵构成原始曲线的点,原始曲线会迭代地绘制出来。界面还有一个最小化的菜单;它可以打开和关闭文件,关闭窗口,或者把当前图像保存为 PNG 格式的文件。虽然简单,但是这个界面简要地提供了一个 Buoy 小部件的合理示例,还有相当数量对事件处理系统的体验。
  
  程序实际的核心代码 —— 分形生成器 —— 已经写好了,这把这个示例变成一个很好的测试程序。当然,在更新它的过程中,我也发现并且修补了一些 bug。
  

  发行包中包含示例程序的源代码,还有编译好的类文件和 Buoy 的 JAR 文件(单击本文顶部或底部的 Code 图标,下载 factal.tar)。包中还包含一个叫做 frac 的目录,里面包含一些示例分形。假如使用一台 UNIX 风格的机器,在路径中有 Java 编译器,那么只要运行 make 就能运行它。 !-- frame contents --

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)!-- /frame contents -- 否则,需要设置 classpath 包含当前路径和 Buoy 的 JAR 文件所在的目录,然后运行 FractalViewer 类。在 Windows 系统上,正确的命令行应当是 java -classpath .;Buoy.jar FractalViewer。
  
  sed -e s/J/B/g
  
  在第一次深入研究代码时,也许会形成这样的印象:把 Swing 代码转换成 Buoy 代码简单得就像把 UI 元素名称中的字母 J 换成 B 一样简单。例如, FractalViewer 类不再扩展 JFrame;它现在扩展的是 BFrame。主要的小部件名称也可以照此推测得到。Spinner 和 slider 像以前一样有相同的名字,只是换了一个字母。 MenuBar(菜单条) 仍然由 Menus(菜单)构成,菜单则容纳 MenuItems。
  
  有些命名转换略有不同。在 Swing 引用 BorderLayout 的地方,Buoy 有 BorderContainer。一般来说,Buoy 的命名转换相当统一,虽然不总是与 Swing 的命名一样。一个明显的区别是 Buoy 几乎组合了容器和布局治理器的概念;每种容器类型都知道自己如何布局。这大大简化了设计。例如,在分形生成器中使用的 LabelWidget 类是一个 BorderContainer;在 Swing 中,这可能是一个带有 BorderLayout 布局治理器的 JPanel。
  
  但是,两者还是有许多相似之处。这对适应新东西有很大帮助。更重要的是,Buoy 构建在 Swing 之上。这意味着,一般来说,假如需要做的事不能轻松地用 Bouy 完成时,可以把 Buoy 对象传递给它包装的 Swing 对象。对于这种情况,假如想访问一些没有 Buoy 对应物的 Swing 对象,可以简单地把它包装在 AWTWidget 对象中,这个对象提供了非常薄的包装器,通过它,不仅 Buoy 自己的小部件,而且所有的小部件都能访问 Buoy 的小部件 API。例如,假如发现确实需要 GridBagLayout,可能就需要这样做。
  
  例如,FractalPanel 类是一个 AWTWidget。在早期设计中, 它是 JPanel 的子类, 但实际上我并不需要 JPanel 代码。相反,我构建了包装定制类的类 FractalCanvas, 它本身是普通的 Canvas 类的一个子类。把它变成一个 AWTWidget,就可以在它上面利用 Buoy 高效的事件处理机制。
  
  事件处理代码非常简单。在按下鼠标按钮时,通过 addEventLink() 的魔力,Buoy 发送一个新的 MousePressedEvent 事件到 mousePressed() 函数。我忽略了按下哪个按钮这个问题,只考虑按住 shift 单击或普通单击。普通单击选择最靠近的点,而按住 shift 单击则重新把显示居中。然后,假如鼠标移动,那么每次 Buoy 注重到移动时都会开始发送 MouseDraggedEvent 事件。在处理这些事件时,FractalPanel 会生成自己的事件。
  

来源:http://www.tulaoshi.com/n/20160219/1620147.html

延伸阅读
一、实现原理 图中两个窗口的实现类是从CControlBar派生出来的,我们并不需要从头到尾实现该类,因为Cristi Posea先生已经为我们实现了一个称为CSizingControlBar的类,而且做得相当完美!我们所要做的便是好好地利用该类,为了尽可能地简洁,笔者将CSizingControlBar类修改了一下并命名为CCoolBar,接下来我们将详细介绍如何利用该类实现我们所...
轻松实现类MSDN2002界面(二) 作者:Cuick 下载源代码 前段时间在VC知识库发表了《轻松实现类MSDN2002界面》,仅仅实现了标签页的拖放、停靠、浮动等功能,而上面的图钉按钮也只是一个假的^_^。通过参考http://www.codeproject.com/docking/pinnabledock.asp的代码对程序进行了加强。现在...
在Java中使用JCOM和JXL注重要点: (1)在你的lib下要有jdom-1.0.jar,jxl-2.5.5.jar,jcom-2.2.4.jar,jcom.dll。 (2)要把jcom.dll同时放到你JDK的bin目录下或者放到系统盘的windows下(推荐放到JDK的BIN下) 把上面的JAR包都放好后开始写应用中的工具类(申明一下在JCOM中得到的都是IDispatch对象,以下还会抛...
一、使用的背景(也不能算是使用的背景,最多只能算是一个在什么条件下面我想到了使用动态代理实现AOP的拦截功能):因为在项目中程序的结构是使用SOAP调用JNI,因此在SOAP服务端里面没有任何实现代码,仅仅是new一个JNI的对象,然后调用JNI对应的方法。但是在调用JNI方法之前需要对传进JNI的JavaBean进行初始化,而且还需要记录日志。而SOAP服...
       UDP协议 UDP协议的全称是用户数据报,在网络中它与TCP协议一样用于处理数据包。在OSI模型中,在第四层传输层,处于IP协议的上一层。UDP有不提供数据报分组、组装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。 为什么要使用UDP 在选择使用协议的时候,选择UDP必须...

经验教程

945

收藏

67
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部