知识大全 轻松实现Java用户界面编程

Posted 事件

篇首语:时间,就象海棉里的水,只要愿挤,总还是有的。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 轻松实现Java用户界面编程相关的知识,希望对你有一定的参考价值。

轻松实现Java用户界面编程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  Buoy 是一个构建在 Swing 之上的免费用户界面(UI)工具包 它为 UI 开发人员提供了方便性和简单性 在本文中作者用一个简单的 fractal 用户界面程序 介绍了 Buoy 可以做什么 为什么这么做

  第一次尝试用 Java 语言构建简单的用户界面时 我对 Swing 接口的复杂性感到有些惊讶 老实说 有点想打退堂鼓 最近 一个朋友向我提到 他使用的渲染程序 Art of Illusion(请参阅 参考资料)基于一个不同的工具包 Buoy 推荐它的原因之一是它的界面更友好 当他第一次提到它时 我以为他在谈 BUI 而它与 GUI 这个名字的相似是故意的 在这里 B 代表 better(更好) 但是名字 Buoy 并不是缩写

  Buoy 是免费的 实际上 它是公共的东西 它并没有在某个开放程度合理的许可下发布 实际上它根本不受任何许可控制 这意味着在任何用 Java 语言编写的能够运行 Buoy 的项目中都可以使用 Buoy 而不用考虑许可问题 因为提供了完整的源代码 所以这个工具包很容易修改和扩展 本文基于 Buoy 发行版 要求读者对 Swing 有基本的了解 虽然不了解也能对付过去

  示例程序

  我曾经尝试用 Swing 构建的第一个应用程序最后以失败告终 为了看出工具包之间的对比情况 我决定使用 Buoy 来构建这同一个程序 文章中的代码示例全部来自该程序的 Buoy 版本 程序生成了一些分形 具体地说 是迭代的分形 基本思想很简单 在平面上定义一系列的线条区段 从( ) 到( ) 围绕任意一个单位线条定位 绘制这些区段之后 绘制同一套变形线条 用这个区段作为单位向量 做起来比说的更容易 就像在图 中看到的

>

  图 分形编辑器中的分形

  这个程序的界面相当简单 它有一些界面小部件 有一个画布 在画布上绘制漂亮的图片 还支持用鼠标操纵图片 实际上 必须要做的全部工作就是操纵构成原始曲线的点 原始曲线会迭代地绘制出来 界面还有一个最小化的菜单;它可以打开和关闭文件 关闭窗口 或者把当前图像保存为 PNG 格式的文件 虽然简单 但是这个界面简要地提供了一个 Buoy 小部件的合理示例 还有相当数量对事件处理系统的体验

  程序实际的核心代码 —— 分形生成器 —— 已经写好了 这把这个示例变成一个很好的测试程序 当然 在更新它的过程中 我也发现并且修补了一些 bug

  发行包中包含示例程序的源代码 还有编译好的类文件和 Buoy 的 JAR 文件(单击本文顶部或底部的 Code 图标 下载 factal tar) 包中还包含一个叫做 frac 的目录 里面包含一些示例分形 如果使用一台 UNIX 风格的机器 在路径中有 Java 编译器 那么只要运行 make 就能运行它 否则 需要设置 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 对象 可以简单地把它包装在 AWidget 对象中 这个对象提供了非常薄的包装器 通过它 不仅 Buoy 自己的小部件 而且所有的小部件都能访问 Buoy 的小部件 API 例如 如果发现确实需要 GridBagLayout 可能就需要这样做

  例如 FractalPanel 类是一个 AWidget 在早期设计中 它是 JPanel 的子类 但实际上我并不需要 JPanel 代码 相反 我构建了包装定制类的类 FractalCanvas 它本身是普通的 Canvas 类的一个子类 把它变成一个 AWidget 就可以在它上面利用 Buoy 高效的事件处理机制

  事件处理代码非常简单 在按下鼠标按钮时 通过 addEventLink() 的魔力 Buoy 发送一个新的 MousePressedEvent 事件到 mousePressed() 函数 我忽略了按下哪个按钮这个问题 只考虑按住 shift 单击或普通单击 普通单击选择最靠近的点 而按住 shift 单击则重新把显示居中 然后 如果鼠标移动 那么每次 Buoy 注意到移动时都会开始发送 MouseDraggedEvent 事件 在处理这些事件时 FractalPanel 会生成自己的事件

  近观 PointChangedEvent

  为了让一些讨论更加具体 请来看 PointChangedEvent 这是一个试验性的类 如果不喜欢它 那也只能怪老天了 这个类的想法是 让一个类来表示状态点中的变化 编辑器跟踪 当前 点 —— 也就是编辑器小部件目前正在编辑的点 可以用这些小部件或在分形面板中单击选择新的点 选择的是最靠近的点

  我得出这样一个结论 在代码中 大概有三类涉及到点的事件需要从一个类发送到另一个类

  一个是改变某个点的特征 POINT 事件类型 如果由编辑器发送 就是告诉分形改变原型线条上的点 并要求重画线条 如果由分形发送 则是告诉编辑器刚刚选中的点的特性

  下一个是选择某个点 可以按索引或位置进行选择 所以 如果只提供了索引或位置 那么构造函数会认为意图是填充其他值 有一点特殊的地方 点索引 用来表示没有选中的点 所以必须用 表示编辑器正在寻找指定位置的点 这可能不漂亮 但是有效

  有点意思的是 Fractal 类响应 SELECT 事件的方式 如果成功地选择了一个点 就会发回一个新的 POINT 类型的 PointChangedEvent 事件 如清单 所示

  清单 用事件回答事件

  case PointChangedEvent SELECT:

  if (e getIndex() >= )

  selectPoint(e getIndex());

  else

  selectPoint(e getPoint());

  // just in case they dont know

  event(new FractalChangedEvent(FractalChangedEvent SIZE size));

  if (selectedPoint >= && selectedPoint < size)

  event(new PointChangedEvent(selectedPoint points[selectedPoint]));

  else

  event(new PointChangedEvent(selectedPoint null));

  event(new FractalChangedEvent(FractalChangedEvent REDRAW));

  break;

  最后 移动点是一个特殊情况 如果不需要改变点的其他属性(例如颜色) 那么所要处理的就是位置 这就是 MOVE 事件类型 在效果上 它与 POINT 事件类型效果很像 但它不需要事件生成器(通常是 FractalPanel 类)去关心那些它根本不知道的属性

  INSERT 和 DELETE 事件类型只有部分相关 可能应当属于 FractalChangedEvent 事件

  事件处理

  正如已经开始看到的 事件处理是 Buoy 与 Swing 最明显的不同之处 事件处理提供了大量灵活性 Buoy 本身的事件集相当丰富 且允许您挑选自己感兴趣的事件 从任何小部件向其他对象发送事件 例如 如果想在 Swing 中捕获鼠标事件 捕获事件的类需要实现 MouseListener 接口 这个接口有 个函数需要实现 即使它们就是摆设也必须实现 而且必须使用接口提供的函数名称 更糟的是 函数必须是侦听器接口的公共部分;要么把这作为公共接口的一部分公开 要么创建一个什么都不做 只是包装事件侦听器代码的内部类

  在 Buoy 中 每个小部件都是 EventSource 这意味着可以从每个小部件侦听事件 什么类型的事件呢?任何类型都可以 关键的函数是 addEventLink() 这允许您指定类 侦听器以及可选的方法 每当 EventSource 分派这个类或它的子类的事件时 侦听器都会接收到事件 要么是通过一个叫做 processEvent()的方法 要么是通过在开始调用 addEventLink() 时提供的方法名称 提供的函数不能接受参数 也不能接受与指定事件类型兼容的类的对象;父类和接口可以

  这是一个方便的设置 可以把不同的事件路由到不同的函数或相同的函数 例如 MousePressedEvent 和 MouseReleasedEvent 会被分别处理 在示例程序中 鼠标的按下 释放和拖动分别有不同的线程 如清单 所示 注意 这远远超过 Swing 的 MouseListener 所能做的 如果用 Swing 编程的话 就需要实现 MouseListener 和 MouseMotionListener 这两个接口

  清单 只挑感兴趣的事件

  this addEventLink(MousePressedEvent class this mousePressed );

cha138/Article/program/Java/hx/201311/26664

相关参考

知识大全 Java GUI用户界面编程的基础

JavaGUI用户界面编程的基础  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java的GUI

知识大全 C#编程轻松实现对文件的操作技巧

C#编程轻松实现对文件的操作技巧  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!    和Java一

知识大全 C#编程技巧轻松实现对文件的操作

C#编程技巧轻松实现对文件的操作  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  和Java一样C

知识大全 以前没有接触过软件编程,java的初学者要怎样才能学好

以前没有接触过软件编程,java的初学者要怎样才能学好不知道你以前是否有接触过其他编程语言例如CC++java很好学的如果以前有过编程经验的那就学起来很轻松了鄙人是计算机专业的本科生学java表示没压

知识大全 轻松实现对文件的操作

C#编程技巧:轻松实现对文件的操作  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  和Java一样

知识大全 轻松实现对文件的操作

C#编程实用技巧:轻松实现对文件的操作  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  和Java

知识大全 想学编程首先该怎么做

想学编程首先该怎么做这得要看你的目的是什么,比如你想写网页,那么就需要熟悉HTML,如果你只是对编程感兴趣那么你可以学C#java之类的,它可以更轻松的写出些实际的东西,如果你想要了解编程原理之类的事

知识大全 Delphi编程轻松实现大图像浏览

Delphi编程轻松实现大图像浏览  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!本实例演示如何不用

知识大全 Java网络编程-Java Socket编程(五)

Java网络编程-JavaSocket编程(五)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 Java网络编程-Java Socket编程(一)

Java网络编程-JavaSocket编程(一)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!