DOC-07-08 PaperDoll拖放程序

本章用纸娃娃(PaperDoll)程序进一步说明拖放特性。

在这个更加高级的程序中使用了第7章中介绍的基本原则,该程序让用户拖放表示衣服的图片并把它们放到一个表示纸娃娃的图片上。

PaperDoll程序的布局

PaperDoll程序显示了4张表示衣服的图片和一个纸娃娃来参与拖放操作。程序窗口显示如图8-1所示:

图8-1 纸娃娃程序

7_8_1 paper_doll

该程序的图形化场景由两部分组成:

● 窗口上部是一个VBox对象,它包含一个图像和“Paper Doll”文本,只是用来装饰用的。

● 窗口下部是一个GridPane对象。

○ 第一列是一个FlowPane对象,里面是衣服图像。

○ 第二列是一个Pane对象,里面是纸娃娃的图像。

衣服的图像可以拖放到纸娃娃的图像上面,也可以拖回原位置。纸娃娃程序提供了一个拖放操作的示例,在该程序中,同一个对象既可以是拖放源也可以是拖放目标。

纸娃娃程序的结构

纸娃娃程序包含如下几个包和类:

PaperDoll.java是主类,布局UI元素并实现了程序逻辑。

● body包含定义了“身体”容器的类,“身体”可以接收拖放数据。

Body.java

BodyElement.java

● clothes包含定义了可拖放的衣服的类。

Cloth.java

ClothListBuilder.java

● images包含程序的图形资源文件。

注意:本章中并未提供构建纸娃娃程序的一步步的过程。你可以下载PaperDoll.zip来查看完整的NetBeans工程。

纸娃娃程序的UI创建过程如例8-1所示。

例8-1

itemPane对象表示分开的各件衣服,bodyPane对象表示穿上衣服的娃娃身体。

开始拖放操作

拖放操作的源是表示Cloth项的ImageView对象其中之一。在任何时候每个currentImage都表示itemPane或bodyPane中的节点。setOnDragDetected方法的实现如例8-2中的粗体部分。

例8-2

注意在该例子中lambda表达式的用法。通过调用startDragAndDrop(TranferMode.MOVE)方法,setOnDragDetected方法中启动了仅支持MOVE传输模式的拖放手势。

处理数据的放下(drop)

拖放手势的目标可以是itemPane也可以是bodyPane对象,取决于拖放手势在哪儿开始。因此两个对象均需要实现setOnDragOver和setOnDragDropped方法。

前面已经提到,itemPane对象是在PaperDoll.java中创建的。例8-3补充了例8-1中的代码,并提供了创建itemPane容器的完整代码。

例8-3

注意:itemPane.setOnDragOver方法只有当拖放手势源不是itemPane对象自己并且拖放板包含一个字符串时才接受该传输模式(译者注:传输模式是MOVE)。

当在接收了前面的DRAG_OVER事件的itemPane对象上松开鼠标按键时会调用itemPane.setOnDragDropped方法。在这里是可拖放的衣服添加到itemPane中并从bodyPane中移除。通过调用事件的setDropCompleted(Boolean)方法来使拖放手势完成。

相似地,bodyPane容器的setOnDragOver和setOnDragDropped方法实现如例8-4所示。

例8-4

例8-5展示了BodyElement类的完整代码。

例8-5

应用程序文件

源码

PaperDoll.java

Cloth.java

ClothListBuilder.java

Body.java

BodyElement.java

NetBeans工程

PaperDoll.zip

打赏一下
支付宝
微信
除非注明,博客文章均为原创,转载请标明文章地址
本文地址: http://www.javafxchina.net/blog/2015/09/doc0708-paper-doll/
百度已收录