Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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
Flash 使用[Inspectable]在flex中构建对象检查器_Flash_Actionscript 3_Apache Flex - Fatal编程技术网

Flash 使用[Inspectable]在flex中构建对象检查器

Flash 使用[Inspectable]在flex中构建对象检查器,flash,actionscript-3,apache-flex,Flash,Actionscript 3,Apache Flex,我正在构建一个小工具,让用户在屏幕上放置一些几何图形,然后移动它们并更改它们的属性。我对as3/flex还很陌生 图形在as3中表示为对象。我们有圆,三角形,矩形类,它们有不同的属性 我喜欢做的是当用户选择一个图形时显示某种“对象检查器”。这个检查器窗口类似于许多IDE中的类似内容 现在的问题是:是否可以利用as3[Inspectable]标记来获取属性列表,并允许在运行时更改它们 如果不可能,那么在不编写特定于类型的代码来编辑每个对象的情况下,您将如何处理此问题 编辑: 我只是想澄清一下。考虑

我正在构建一个小工具,让用户在屏幕上放置一些几何图形,然后移动它们并更改它们的属性。我对as3/flex还很陌生

图形在as3中表示为对象。我们有圆,三角形,矩形类,它们有不同的属性

我喜欢做的是当用户选择一个图形时显示某种“对象检查器”。这个检查器窗口类似于许多IDE中的类似内容

现在的问题是:是否可以利用as3[Inspectable]标记来获取属性列表,并允许在运行时更改它们

如果不可能,那么在不编写特定于类型的代码来编辑每个对象的情况下,您将如何处理此问题

编辑:

我只是想澄清一下。考虑这个例子:

public class Shape { /* ... */ }

public class Triangle extends Shape { 
  public var a:Number;
  public var h:Number;
  //...
}

public class Circle extends Shape {
  public var r:Number;
  public var name:String;
  //...
}
我想让用户能够编辑
a
h
来自
Triangle
r
名称
来自
圆圈

根据我现在的想象,我可以走两条路:

  • 使
    三角形
    圆形
    实现
    IMyInspectable
    并为每种类型编写自定义
    getProperties():Dictionary
    getProperty(name:String):Object
    setProperty(name:String,value:Object):void
    方法。这将涉及完全不合法的转换意大利面

  • 我忘记了我在键入解决方案一时的情景:(

  • 我想你可以用它来反省物体。不过,我可能会采取一种非常不同的方法

    创建一个接口,比如IObjectIwantToCreatePropertyIndowFor,并让您的相关形状对象实现它。该接口可以以某种方式定义您希望在该对象上可用的属性列表。我甚至可以将其作为一个值对象数组,其中包含属性名称、显示名称以及它所使用的编辑器类型uld有。每个对象都可以硬编码其中的属性列表

    属性窗口可以根据接口值重写自己,我很可能会使用带有

    你想做的事情听起来并不难,但也不是小事


    Nooga要求提供更详细的解释。这都是psuedo代码,但:

    1) 创建一个接口:

    package com.propertyInspector
    {
    
        public interface IPropertyInspectable
        {
    
            function get inspectableProperties(  ):array;
        }
    }
    
    2) 创建一个实现IPropertyInspectable的类

    package com.propertyInspector
    {
    
        public class myClass implements IPropertyInspectable
        {
    
            public var property1 :String
            public var property2 : Int
    
            public function get inspectableProperties():Array{
              return [{name:'property1',type:'String'},{name:'property2',type:'String'}, ]
            }
        }
    }
    
    3) 创建属性检查器

    <s:List dataProvider="{someSelectedObjectThatImplementsIPropertyInspectable.inspectableProperties}">
     <s:itemRenderer>
       <s:Label text="data.name"/><s:TextInput />
     </s:itemRenderer>
    </s:List>
    
    
    
    您必须弄清楚如何将对象传递到属性检查器。inspectableProperties中的属性对象可能需要引用它们所引用的实际对象,以便列表可以显示默认值


    您可以使用itemRenderer函数根据类型显示不同的可编辑方法。一个字符串的文本输入,一个数字步进器,等等。

    你不能用一个创可贴来修复刀伤。我发现了:问题是它对我不起作用:[当然,我的应用程序运行时。“那么,至少选择一个不同的标签”。什么标记?:)我的主要问题是,我不知道如何实现这样的东西,更不用说为它制作标记了。我认为DescripteType在这里是一个过火的问题。我认为最优雅的解决方案是不为每种类型编写代码。这就是这里的问题:(@nooga使用您关于使用可检查metadta的建议;我认为DescripteType是在运行时获取自定义元数据的唯一方法。您是否建议了其他方法?我相信我的“接口方法”允许您对任何给定类型使用相同的“属性检查器”。您必须为每个“对象”编写的代码如下所示:“就像你需要的那样复杂“。同意flextras,没有理由使用元数据或批注。在这种情况下,我看不出它有什么好处。如果必须为每种类型编写批注来描述属性和潜在值,那么在自己的对象中而不是在元数据中这样做会有什么区别?使用“可检查”的接口”对象应该只是让它返回属性/值对象的集合,您甚至可以轻松地重用特定属性/值对象的定义,而不是在元数据中重复创建。您能提供一个简短的示例吗?恐怕我不完全理解flextras的方法:(@nooga我编辑了我的答案,添加了一些psuedo代码,希望能更好地解释这个方法。如果你需要更多,我可以作为一名顾问来雇佣你。