我是Flex / Actionscript的新手,有一个非常基本的问题。
假设我有大约100多个按钮。它们都有相同的标签。现在我想通过点击更改所有标签。我可以给他们ID,然后运行for循环,但我正在寻找一个更整洁的解决方案。
感谢您的帮助。
嗯,它不起作用,因为在运行时修改了按钮的标签。 这是代码
public function changeButton(event:Event):void {
if (event.target.label != 'X') {
event.target.label ='X';
} else {
event.target.label ='';
}
}
现在我需要一个按钮,用于点击删除/替换此标签为空。
答案 0 :(得分:3)
如果您正在使用Flex,则可以使用数据绑定:
[Bindable] myButtonLabel:String = "Default Label";
<mx:Label id="label1" text="{myButtonLabel}"/>
<mx:Label id="label2" text="{myButtonLabel}"/>
function buttonClick(evt:Event):void {
myButtonLabel = "New Label";
}
每当您更改myButtonLabel的值时,所有标签都将更改。
答案 1 :(得分:1)
根据您对“整洁”的定义,我可以为您提供多种解决方案。我想“最好的”就是派遣一个活动。但我将概述所有三个:
1.Have标签本身是一个事件调度程序或某个对象,可以通过其特定值通知任何“标记”。当然,这可以看作是解决方案#3的变体,但不是。您的按钮将在分配的标签上注册侦听器,并通过使标签更改操作发送更改事件,您的按钮将有机会更新其标签显示。这很简洁,因为您可以拥有可重用的通用编程模式:
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.另一个,就像你想到的那样,但是思想不够整洁,我认为更新更快就是在易于迭代的容器中保持具有相同标签的按钮的轨迹,例如字典(需要弱键,所以矢量不会!)
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为您完成大部分工作:
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"));
我建议你做的是检查每个的弱点和优势 - 所有这些都有两个 - 并使用混合解决方案。第一个具有将标签的值与对值的引用分开的效果,即,两个不同的标签对象都具有“取消”作为值将不会彼此改变,即使标签实际上是相同的。另外两个解决方案不会将值与参考值分开。然而,使用它们会增加太多按钮添加太多事件监听器的额外成本,这是第二种解决方案无法做到的。这一切都是我的头脑,但你有一个有趣的问题,现在使用你的幻想: - )