技术开发 频道

支持显示元素拖动的用户图形界面的框架实现

  对于拖动操作来说,首先要在鼠标按下时判断哪一个显示单元可能被选中,并且进而将其状态置为“activated”以表示它是当前“活动”的显示单元。我们可以这样解决,在处理鼠标动作的mousePressed方法中,先取得鼠标按下时的坐标,再逐一获得显示单元的显示区域,判断是否在其范围之中。但这种做法实现起来代码较显杂乱,且模式不够清晰。在此我们使用另一种模式,即在DisplayUnit中增加一个方法,而在需要时由DemoPane调用此方法来确定某一点是否可能是处于此显示单元的选取区域。inSelectArea方法定义如下:

1 public boolean inSelectArea(int _x, int _y){
2        if (!isActivable() )
3          return false ;
4        if ( (_x>=x)&&( _x< x+width ) && (_y>=y) && (_y<y+height) )
5          return true ;
6        else
7          return false ;
8     }
9

  此方法让DisplayUnit自己判断给定的坐标(_x, _y)是否处于其“选取区域”。返回true说明当前点位于选取此显示单元的区域之中。这种实现方法更好地体现了面向对象的思想,即DemoPane调用由此接口获得此单元选中与否的结果,而允许显示单元自己确定一种选中策略,从而给程序增加了灵活性与可扩展性。目前我们对于此方法的判断算法是考察点是否位于显示单元左上角与长、高所确定的矩形当中,如果我们需要使选取区域不局限于规则的正方形时,我们只要对相应显示单元的 inSelectArea方法进行重写就可以了,而DemoPane中代码无需做任何改动。

  框架的功能扩展设想

  此框架只是提供了一个基本的图形界面元素拖动应用解决模板,在此基础上可以很容易地进行许多方面的扩展。

  将DisplayUnit扩展为“MediaUnit”。目前DisplayUnit可以在激活状态下对显示进行一些改变,而在此基础上只要对鼠标事件的响应增加声音处理就成为了一个多媒体单元。

  在DemoPane中加入布局策略,这样在加入DisplayUnit时可以更方便地设置其显示位置,但此时要配合使用setDragBounds方法来限定显示单元可移动的区域。

  多个显示单元同时选取和拖动。这要求DemoPane要具有同时激活多个显示单元,并保存这些激活的显示单元的能力。

0
相关文章