Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flex 列表组件上的itemRollOver和itemRollOut事件存在问题_Apache Flex_Events_Flex3_Adobe - Fatal编程技术网

Apache flex 列表组件上的itemRollOver和itemRollOut事件存在问题

Apache flex 列表组件上的itemRollOver和itemRollOut事件存在问题,apache-flex,events,flex3,adobe,Apache Flex,Events,Flex3,Adobe,我已经在列表组件上设置了itemRollOver和itemRollOut事件侦听器,但每当我将鼠标滚动到列表项上时,同一列表项的over和out事件都会紧接着相继触发。我的列表使用自定义itemRenderer 你知道为什么会这样吗?Adobe文档对此没有提供太多的见解(毫不奇怪……。它们来自同一个对象吗? 如果不是,则可能会从您刚刚离开的“项目”中获得一个项目卷展栏,并从您输入的新项目中获得一个项目卷展栏,这取决于它们的间距,并且这些项目可能彼此非常接近 如果覆盖set data(),请确保在

我已经在列表组件上设置了
itemRollOver
itemRollOut
事件侦听器,但每当我将鼠标滚动到列表项上时,同一列表项的over和out事件都会紧接着相继触发。我的列表使用自定义itemRenderer


你知道为什么会这样吗?Adobe文档对此没有提供太多的见解(毫不奇怪……。

它们来自同一个对象吗?
如果不是,则可能会从您刚刚离开的“项目”中获得一个项目卷展栏,并从您输入的新项目中获得一个项目卷展栏,这取决于它们的间距,并且这些项目可能彼此非常接近

如果覆盖set data(),请确保在项目渲染器中设置了super.data

ListBase侦听鼠标悬停,然后根据鼠标坐标和项目渲染器的位置找出它下面的项目。您可以检查ListEvent.itemRenderer以查看哪个渲染器的“翻转”和“转出”正在启动,以及启动的顺序


最糟糕的情况是,您可以在项目渲染器中侦听滚动和滚动。

我认为这是一个bug。ListBase.mouseOverHandler现在在调度ITEM_ROLL_OVER事件时设置一个名为LastHighlightItemRenderRatines的变量,然后在ListBase.clearHighlight(由mouseOutHandler调用)中调度ITEM_ROLL_OUT事件时使用该变量(与LastHighlightItemIndex一起)

问题是,当您将鼠标从一行移到另一行时,首先调用mouseOverHandler,设置lastHightlight。。。变量,然后当随后调用mouseOutHandler时,它使用lasthlight。。。刚刚设置的值,其结果是为同一渲染器获得连续的“回滚”和“回滚”事件


坦白地说,我不知道为什么ListBase.clearHighlight在调度ITEM_ROLL_OUT事件时不使用传入的渲染器(这是它在SDK 2中的工作方式),因为这是正在“推出”的实际渲染器。

也有同样的问题。super.data已被设置,该项与卷展栏和滚动事件相同。我最终选择了anirudhsasikumar的最坏情况场景,并在项目渲染器中听取了滚动和滚动。似乎工作正常。

我也遇到过同样的问题。我最终对mx.controls.List类进行了子类化,并重写了clearHighlight函数。据我所知,LastHighlightItemIndexs变量仅在该函数中读取。因此,执行以下操作可以解决此问题:

import mx.core.mx_internal;

use namespace mx_internal;

public class List extends mx.controls.List
{
    public function List()
    {
        super();
    }

    override mx_internal function clearHighlight( item:IListItemRenderer ):void
    {
        var uid:String = itemToUID( item.data );

        drawItem( UIDToItemRenderer( uid ), isItemSelected( item.data ), false, uid == caretUID );

        var pt:Point = itemRendererToIndices( item );

        if( pt )
        {
            var listEvent:ListEvent = new ListEvent( ListEvent.ITEM_ROLL_OUT );

            listEvent.columnIndex = item.x;
            listEvent.rowIndex = item.y;
            listEvent.itemRenderer = item;

            dispatchEvent( listEvent );
        }
    }
}
然后只需使用这个List类而不是Adobe类,就可以获得预期的行为。我在FlexSDK3.2上测试了这一点,它是有效的

<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:controls="com.example.controls.*">

    [ other code ... ]

    <controls:List itemRollOver="onItemRollOver( event )" itemRollOut="onItemRollOut( event )" />

</mx:Canvas>

[其他代码…]

感谢吉诺·巴索在上面的帖子中提出的想法。希望能有所帮助。

谢谢您的解决方案。这真的解决了问题!不过,修正幅度很小:

listEvent.columnIndex = item.x;
listEvent.rowIndex = item.y;
应该是

listEvent.columnIndex = pt.x;
listEvent.rowIndex = pt.y;

item.x和y以像素为单位保存渲染器的坐标。

事件由同一对象触发。这些对象没有重叠,它们彼此紧挨着(中间有0个像素)。这很有趣,可以解释这种行为。有人能证实这一点吗?(不幸的是,我现在没有时间深入研究mx代码。)谢谢你的提示。我会尝试它,当我回到这个项目的问题!