TWaver中的Node对象加右键菜单项

network.sendtotoponselected =false;
上面那个机柜的图片里面的每个设备都是一个对象可以拖放,有没有办法控制这些设备对象的可拖动范围,比如只能在某一范围内上下拖动,还有就是拖动这些设备时有一个问题,点击一个对象后,它总是覆盖在其它对象的上面,这样如果两个设备比较接近时下层的设备就覆盖了上层的设备,有没有办法固定它的层次关系


这里面也是有两个小技巧
1.就是每个设备作图的时候,注意满足电话中跟你说的那个构图技巧
2.给这些设备加上个location监听,当设备拖拽的时候,不允许将设备拖动超出一个范围即可.这个范围可以由几个相关的参数来共同制定,比如某个设备位于机架的第三层(当成这个设备的一个属性), 第三层的 y 坐标根据我们的底图应该是在 levelY 处,我们定义这个范围是 levelY+/- 20. ok,现在开始编码.(1)添加属性变化监听器,专门监听这种设备的location变化(2)这类设备的location发生变化后,在监听器中判断这类设备处于机架的哪一层,例如第三层,当前设备的location是否满足了Math.abs(location.y - level3)>20的条件,如果一旦满足,那么就重新设置该设备location回到指定位置 element.location = new Point(location.x,level3-element.height);

基本的思路大概如此,你看看根据实际情况变通一下
Re: 请问如何给TWaver中的Node对象加右键菜单项
如果右键点击树节点时,让此节点选中最好,不过现在还没有通过ContextMenuEvent或者MouseEvent获得TreeData的方法,可以考虑先自己继承twaver.Tree,添加如下方法(TWaver Flex 1.5版本将添加):
view plaincopy to clipboardprint?
代码:  
      public function getTreeDataByContextMenuEvent(event:ContextMenuEvent):TreeData{  
         var itemRenderer:IListItemRenderer;  
         var target:DisplayObject = event.mouseTarget;  
         while (target && target != this) {  
            if (target is IListItemRenderer && target.parent == listContent) {  
               if (target.visible) {  
                  itemRenderer =  IListItemRenderer(target);  
               }  
               break;  
            }  
              
            if (target is IUIComponent){  
               target = IUIComponent(target).owner;  
            } else {  
               target = target.parent;  
            }  
         }  
           
         if(itemRenderer != null){  
            return this.getTreeDataByIndex(this.itemRendererToIndex(itemRenderer));  
         }  
         return null;  
      }  
      public function getTreeDataByMouseEvent(event:MouseEvent):TreeData{  
         var itemRenderer:IListItemRenderer = this.mouseEventToItemRenderer(event);  
         if(itemRenderer != null){  
            return this.getTreeDataByIndex(this.itemRendererToIndex(itemRenderer));  
         }  
         return null;  
      }  
其实不难不过需要你扩展一下UI,我在CustomGridDemo里面增加了一种ClippableCell,所有代码就是下面寥寥几行 关键之处就是这一行);
view plaincopy to clipboardprint?
代码:  
package demo.network.chassis.customgrid;  
import java.awt.Color;  
import java.awt.Graphics2D;  
import java.awt.Rectangle;  
import twaver.Node;  
import twaver.network.TNetwork;  
import twaver.network.ui.ResizableNodeUI;  
public class ClippableCellUI extends ResizableNodeUI {  
   public ClippableCellUI(TNetwork network, ClippableCell clippableCell) {  
      super(network, clippableCell);  
   }  
   public void paintBody(Graphics2D g2d) {  
      ClippableCell cell = (ClippableCell)this.element;  
      Node host = cell.getHost();  
      Rectangle drawBound = null;  
      if(host == null){  
         drawBound = cell.getBounds();  
      }else{  
         Rectangle hostRect;  
         if(host instanceof CustomGrid){  
            hostRect = ((CustomGrid)host).getInnerBounds();  
         }else{  
            hostRect = host.getBounds();  
         }  
         drawBound = hostRect.intersection(cell.getBounds());  
      }  
      if(drawBound != null){  
         g2d.setColor((Color)cell.getClientProperty("color"));  
         g2d.fill(drawBound);  
      }   
   }  
}  
代码:  
package demo.network.chassis.customgrid;  
import java.awt.Color;  
import twaver.Follower;  
public class ClippableCell extends Follower {  
     
   public ClippableCell(){  
      init();  
   }  
     
   public ClippableCell(Object id){  
      super(id);  
      init();  
   }  
     
   private void init(){  
      this.putClientProperty("color", Color.red);  
   }  
     
   public String getUIClassID() {  
      return ClippableCellUI.class.getName();  
   }     
}  

你可能感兴趣的:(UI,Flex)