如何在Flex中找到鼠标指针下当前的列表项?

时间:2010-02-03 16:06:25

标签: flex

我有一些List和TileList控件。如何获取当前鼠标指针下的列表项的引用?

3 个答案:

答案 0 :(得分:4)

为列表中的每个项添加一个事件监听器,用于mouseOver,然后在您的函数中,它将是event.currentTarget

答案 1 :(得分:2)

Flex 3的List / TileList中有一个简单的方法可以执行此操作:

<mx:TileList id="tileList" itemRollOver="{trace('found item ' + event.itemRenderer)}"/>

ListEvent.ITEM_ROLL_OVER也有许多有用的属性:

  • event.itemRenderer
  • event.rowIndex
  • event.columnIndex

您可以通过event.itemRenderer.data获取已覆盖的数据,并使用tileList.dataProvider.getItemIndex(event.itemRenderer.data)

从那里获取selectedIndex

答案 2 :(得分:2)

感谢目前为止的答案。我最终提出了一些不同的东西,并认为我也会分享它。我选择此解决方案的主要原因是因为我实际上正在响应外部事件,因为我使用custom context menu库来捕获Javascript中的右键单击。当发生右键单击时,用户可能不一定正在移动鼠标。我可以随时跟踪指针所在的项目,但我认为这会变得复杂。无论如何我的解决方案通过子类化List工作,有些事情如下:

package components{
    import mx.controls.List
    use namespace mx_internal

    public class MyList extends List{

        public function findItemIndexForMouse(stageX:Number, stageY:Number):Number{
            var item
            var pt:Point = new Point(stageX, stageY)
            pt = listContent.globalToLocal(pt)
            var rc:int = listItems.length
            for (var i:int = 0; i < rc; i++)
            {
                if (rowInfo[i].y <= pt.y && pt.y < rowInfo[i].y + rowInfo[i].height)
                {
                    item = listItems[i][0]
                    break
                }
            }
            return itemRendererToIndex(item)
        }
    }
}

现在,您可以调用list.findItemIndexForMouse()来获取给定鼠标舞台坐标的项目的索引。确保使用mx_internal命名空间,否则您将无法访问某些必需的实例变量。对于TileList,你必须做同样的事情,除了方法看起来有点不同:

public function findItemIndexForMouse(stageX:Number, stageY:Number):Number{
    var item
    var pt:Point = new Point(stageX, stageY)
    pt = listContent.globalToLocal(pt)
    var rc:int = listItems.length;
    for (var i:int = 0; i < rc; i++)
    {
        if (rowInfo[i].y <= pt.y && pt.y < rowInfo[i].y + rowInfo[i].height)
        {
            var cc:int = listItems[i].length;
            for (var j:int = 0; j < cc; j++)
            {
                if (listItems[i][j] && listItems[i][j].x <= pt.x
                    && pt.x < listItems[i][j].x + listItems[i][j].width)
                {
                    item = listItems[i][j];
                    if (!DisplayObject(item).visible)
                        item = null;
                    break;
                }
            }
            break;
        }
    }
    return itemRendererToIndex(item)

}