我有一些List和TileList控件。如何获取当前鼠标指针下的列表项的引用?
答案 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)
答案 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)
}