Flex/Actionscript:如何更改所有按钮的属性(标签)? [英] Flex/Actionscript : How to change property (label) of all buttons?

查看:29
本文介绍了Flex/Actionscript:如何更改所有按钮的属性(标签)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是 Flex/Actionscript 的新手,有一个非常基本的问题.

I'm new to Flex/Actionscript and have a very basic question.

假设我有大约 100 多个按钮.他们都有相同的标签.现在我想通过单击更改所有人的标签.我可以给他们 ID,然后运行 ​​for 循环,但我正在寻找更简洁的解决方案.

Let's say I have about 100+ buttons. They all have the same label. Now I want to change the label for all with a click. I could give them IDs and then run a for loop, but I'm searching for a neater solution.

感谢您的帮助.

嗯,它不起作用,因为按钮标签在运行时被修改.这是代码

Hm, it doesn't work because label of buttons are modified during the run time. This is the code

public function changeButton(event:Event):void {
    if (event.target.label != 'X') {
    event.target.label ='X';
    } else {
    event.target.label ='';
    }
}

现在我需要一个按钮,该按钮将在点击时删除/替换为空标签.

Now I need a button that will on click delete/replace this label with an empty one.

推荐答案

根据您对整洁"的定义,我可以为您提供多种解决方案.我想最简单的"会调度一个事件.但我将概述所有三个:

Off the top of my head I can offer you several solutions, depending on your definition of 'neat'. I guess the 'neatest' would be dispatching an event. But I will outline all three:

1.让标签本身成为一个事件调度器或某个对象,可以用其特定值通知任何标记"的对象.这当然可以看作是解决方案#3 的变体,但不是.您的按钮将在分配给它们的标签上注册侦听器,并且通过使标签更改操作调度更改事件,您的按钮将有机会更新其标签显示.这很好,因为您可以拥有一个可重用的通用编程模式:

1.Have label itself be an event dispatcher or some object that can notify whatever "is labelled" with its particular value. This can be seen as a variation of solution #3 of course, but is NOT. Your buttons will register listeners on the label they are assigned, and by making the label change operation dispatch a change event your buttons will have a chance to update their label display. This is neat because you can have a reusable generic programming pattern along:

class Button
{
    var label_tf: TextField;

    public function Button(label: *)
    {
        if(label is IEventDispatcher)
        {
            label.addEventListener("change", on_label_change_event, false, 0, true);
        }

        label_tf.text = label;
    }

    function on_label_change_event(event: Event)
    {
        label_tf.text = event.target;
    }
}

dynamic class DynamicEventDispatcher extends EventDispatcher
{
}

var label = new DynamicEventDispatcher();
label.value = "Cancel"
label.toString = function() { return this.value; };

var button1 = new Button(label);
var button2 = new Button(label);
var buttonN = new Button(label);

/// Now make all buttons display 'Cancel' in Spanish ;-)
label.value = "Anular";
label.dispatchEvent(new Event("change"));

2.另一个,就像你想到的但认为不够整洁,我认为更新会更快的是在一个易于迭代的容器中跟踪具有相同标签的按钮,例如字典(需要弱键,所以向量不行!)

2.Another one, like what you thought of but thought was not neat enough, which I assume would be faster to update is keeping a track of buttons with the same label in a container that is easily iteratable, e.g. a dictionary (need weak keys, so a vector won't do!)

class Button
{
    static var buttons_by_label: Dictionary;

    static function init_class()
    {
        buttons_by_label = new Dictionary(true);
    }

    static function reset_identical_labels(old_value: String, new_value: String)
    {
        if(buttons_by_label[old_value] === undefined)
        {
            throw new Error("No buttons with specified label value.");
        }

        for(var button: Button in buttons_by_label[old_value])
        {
            button.label = new_value;
        }
    }

    var label_tf: TextField;

    public function Button(label: String)
    {
        this.label = label;
    }

    public function get label()
    {
        return label_tf.text;
    }

    public function set label(new_value: String)
    {
        var old_value: String = label_tf.text;

        if(buttons_by_label[old_value] !== undefined)
        {
            delete buttons_by_label[old_value][this];
        }

        if(buttons_by_label[new_value] === undefined)
        {
            buttons_by_label[new_value] = new Dictionary(true);
        }

        buttons_by_label[new_value][this] = true;

        label_tf.text = new_value;
    }
}

Button.init_class();

var button1 = new Button("Cancel");
var button2 = new Button("Cancel");
var buttonN = new Button("Cancel");

Button.reset_identical_labels("Cancel", "Anular");

3.利用显示列表层次结构和事件流模型的优势,让 Flash Player 为您完成大部分工作:

3.Use the benefits of display list hierarchy and the event flow model to have Flash Player do most of the work for you:

class Button
{        
    var label_tf: TextField;

    public function Button(label: String)
    {
        this.label = label;

        stage.addEventListener("request.button.update_label", 
            on_update_label_request_event, 
            false, 0,true);
    }

    public function get label()
    {
        return label_tf.text;
    }

    public function set label(new_value: String)
    {            
        label_tf.text = new_value;
    }

    function on_update_label_request_event(event: LabelUpdateRequestEvent)
    {
        if(label == event.old_value)
        {
            label = event.new_value;
        }
    }
}

class LabelUpdateRequestEvent extends Event
{
    public var old_value: String;
    public var new_value: String;

    public function LabelUpdateRequestEvent(old_value: String, new_value: String)
    {
        super("request.button.update_label");

        this.old_value = old_value;
        this.new_value = new_value;
    }
}

var button1 = new Button("Cancel");
var button2 = new Button("Cancel");
var buttonN = new Button("Cancel");

stage.dispatchEvent(new LabelUpdateRequestEvent("Cancel", "Anular"));

我建议你做的是检查每个人的弱点和强项 - 他们都拥有两者 - 并使用混合解决方案.第一个具有将标签的值与值的引用分开的效果,即两个不同的标签对象都以取消"作为值不会相互改变,即使标签实际上是相同的.其他两种解决方案没有将值与参考分开.但是,使用它们,您会因添加过多按钮过多的事件侦听器而获得额外成本,这是第二种解决方案所不具备的.这一切都超出了我的想象,但你有一个有趣的问题,现在就用你的幻想:-)

What I suggest you do is examine the weaknesses and strengths of each - all of them DO have both - and use a hybrid solution. The first has the effect of separating the value of a label with a reference to the value, i.e. two different label objects both with "Cancel" as value will NOT change each other, even though the label is actually identical. The other two solutions don't separate value from reference. With them however you get the extra cost of adding too many event listeners with too many buttons, something the second solution does not do. This all was off the top of my head, but you have an interesting problem, use your fantasy now :-)

这篇关于Flex/Actionscript:如何更改所有按钮的属性(标签)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆