Groupに数十個のLabelを作成し、すべての Label に右クリック メニューを追加し、メニューにイベントリスナーを追加してから、右クリックした正確な Label をメニュー項目の select リスナーを介して取得する方法 ( ContextMenuEvent.MENU_ITEM_SELECT )? どうもありがとう
3 に答える
メニュー項目をクリックするたびに、mouseTarget プロパティに親の情報が含まれます。
// Handler when customized menu items are selected.
private function menuItemHandler(event:ContextMenuEvent):void {
var obj:InteractiveObject = event.mouseTarget;
if(obj is Label)
Alert.show(Label(obj).id);
}
これが役立つかどうかを確認してください。
小さなアプリ。
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
creationComplete="init()">
<s:layout>
<s:BasicLayout/>
</s:layout>
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<fx:Script>
<![CDATA[
import mx.controls.Alert;
[Bindable]
private var cm:ContextMenu;
private var cmi:ContextMenuItem;
private var item1:ContextMenuItem;
private var item2:ContextMenuItem;
private var item3:ContextMenuItem;
private var item4:ContextMenuItem;
private var item5:ContextMenuItem;
private function init():void
{
cmi = new ContextMenuItem("Some Context Item");
cmi.enabled = false;
item1 = new ContextMenuItem("Customized item", true);
item2 = new ContextMenuItem("Enable/Disable customized menu entry", true);
item3 = new ContextMenuItem("Visible/Invisible customized menu entry");
item4 = new ContextMenuItem("Copy\u00A0");
item5 = new ContextMenuItem("More Flex tutorials", true);
// Manage clicks on your customized items
item1.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, menuItemHandler);
item2.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, menuItemHandler);
item3.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, menuItemHandler);
item4.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, menuItemHandler);
item5.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, menuItemHandler);
cm = new ContextMenu();
cm.hideBuiltInItems();
cm.customItems = [cmi, item1, item2, item3, item4, item5];
cm.addEventListener(ContextMenuEvent.MENU_SELECT, onMnuSelect);
}
private function onMnuSelect(event:ContextMenuEvent):void
{
/* var obj:InteractiveObject = event.mouseTarget;
if(obj is Label)
Alert.show(Label(obj).id); */
}
// Handler when customized menu items are selected.
private function menuItemHandler(event:ContextMenuEvent):void {
var obj:InteractiveObject = event.mouseTarget;
if(obj is Label)
Alert.show(Label(obj).id);
}
]]>
</fx:Script>
<s:VGroup>
<s:Label id="label1" text="label1" contextMenu="{cm}"/>
<s:Label id="label2" text="label2" contextMenu="{cm}"/>
<s:Label id="label3" text="label3" contextMenu="{cm}"/>
<s:Label id="label4" text="label4" contextMenu="{cm}"/>
</s:VGroup>
</s:Application>
1 つの解決策は、Label および Menu スキン パーツを含むカスタム コンポーネントを作成することです。このようにして、コンポーネントを好きなようにスキンすることもでき、非常に簡単な方法でラベルとメニューにアクセスできます。
問題を解決するために、スキン パーツの名前が「label」と「menu」であるとします。ContextMenuEvent がディスパッチされると、メニュー クリック ハンドラの event.target プロパティにアクセスすることで、クリックされたメニューにアクセスできます。これで、その親はその親プロパティを介して利用できるようになり、これがラベル コンポーネントまたはスキン パーツにアクセスする方法です。したがって、次のようになります。
event.target.parent.label
どこ:
event.target - メニュー コンポーネント
event.target.parent - ラベルとメニューをラップするコンポーネント
event.target.parent.label - アクセスしたいコンポーネント
要約すると、スキン パーツとなるラベルとメニューをラップするカスタム コンポーネントを作成します。このように、(イベント ハンドラーなどで) 2 つの部分のいずれかを識別することにより、 parentプロパティを介して、対応する他のコンポーネントを簡単に判別できます。
event.target値をメニュー クラスにキャストし、event.target.parentプロパティをカスタム コンポーネント クラスにキャストする必要がある場合があります。そうすれば、ラベルを使用できるようになります。
Label をコンポーネントとして使用している場合は、次の方法でアクセスできます。
event.contextMenuOwner.text
また
ボタンを使用している場合は、次の方法でアクセスできます。
event.contextMenuOwner.label
これが役立つことを願っています。