0

我想出了如何创建一个随处可用的静态方法,例如:

UtilLib.as:

package
{   
     public final class UtilLib
     {  
          public static function getTimeStamp():uint
          {
               var now:Date = new Date();
               return now.getTime();
          }
     }
}

我可以通过执行 UtilLib.getTimeStamp() 在任何地方访问它 - 现在,我想创建一个名为 log(msg:String) 的新静态方法。这应该将消息记录到多行输入字段。

然而问题是这个输入字段必须在某个地方创建并且必须始终可以访问和可见,并且我不想一直通过函数参数传递它,因为这会造成很多麻烦(我有也可以通过对象传递它..)。

那么,如何创建一个“公共文本字段”以便我的静态日志方法可以写入它?

更新: 我现在尝试了下面的类,带有一个静态构造函数(我认为)。但是,文本字段对象未显示。当我在创建它后执行 addChild(debugField) 时,它给了我错误 1180。

记录器.as

package
{
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.text.TextFieldType;

    public class Logger extends Sprite
    {
        public static var debugField:TextField;

        /* static block */
        {
            trace("Logger initializing.");
            debugField = new TextField();
            debugField.width = 500;
            debugField.height = 100;
            debugField.x = 100;
            debugField.y = 400;
            debugField.background = true;
            debugField.backgroundColor = 0xFFFFFF;
            debugField.defaultTextFormat = new CustomTextFormat();
            debugField.mouseWheelEnabled = true;
            debugField.multiline = true;
            debugField.type = TextFieldType.DYNAMIC;
        }

        public static function log(msg:String):void
        {
            if (debugField) debugField.appendText(msg);
        }

    }
}

我这样初始化它:

var test:Logger = new Logger();
addChild(test);

我记录了这样一条新消息:

Logger.log("test");

不幸的是,textField 没有显示。

4

4 回答 4

2

基本上你需要:

  • 在某处记录可全局访问的消息
  • 每当日志消息更改时更新文本字段的能力

使用对象的简单解决方案可能如下所示:

例子

package {
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.events.Event;

    public class Example extends Sprite {
        private var messageLog:TextField;

        public function Example() {
            createTextField();
            MessageLogger.getInstance().addEventListener( MessageLogger.LOG, handleMessageLoggerUpdate );
            MessageLogger.getInstance().log( "Message!" );
        }

        private function handleMessageLoggerUpdate( event:Event ):void {
            messageLog.text = MessageLogger.getInstance().getLog();
        }

        private function createTextField():void {
            messageLog = new TextField();
            addChild( messageLog );
        }
    }
}

消息记录器

package {
    import flash.events.EventDispatcher;
    import flash.events.Event;

    public class MessageLogger extends EventDispatcher {
        private static var instance:MessageLogger;
        public static function getInstance():MessageLogger {
            if ( !instance ) {
                instance = new MessageLogger( new InstanceKey() );
            }
            return instance;
        }

        public static var LOG:String = "MessageLoader#log";

        private var messageLog:String;

        public function MessageLogger(key:InstanceKey) {
            messageLog = "";
        }

        public function log( message:String ):void {
            messageLog += message;
            notify();
        }

        public function getLog():String {
            return messageLog;
        }

        private function notify():void {
            dispatchEvent( new Event( LOG ) );
        }
    }
}
class InstanceKey {}

这里重要的是,可以使用从任何地方记录消息

MessageLogger.getInstance().log( "Your Message Here" );

并且可以在使用记录消息时通知任何内容

MessageLogger.getInstance().addEventListener( MessageLogger.LOG, listenerFunction );

在任何时候都可以使用获取当前消息日志

MessageLogger.getInstance().getLog();
于 2009-06-28T20:56:09.973 回答
1

创建一个新的 Logging 类并让该类具有静态构造函数。将您的日志记录方法添加到此类。使静态构造函数将日志记录字段保存到私有变量。现在,在您调用日志记录方法之前,只需使用您想要使用的输入字段调用您的静态构造函数。这将创建类,将输入字段设置为目标,现在您可以从任何地方简单地调用日志函数。

于 2009-06-28T20:09:01.237 回答
0

传统上,让静态方法与私有变量交互的方式是将它们传入。传入指向文本框的指针。

所以而不是

public static function getTimeStamp():uint { ... }

你有

public static function writeTimeStamp(messageBox):uint { ... }

语法可能不正确,因为我不是 AS 开发人员,但是,你明白我的意思吗?从那里,该代码块可以messageBox像访问局部变量一样访问。嗯,它是。

(为了清楚起见,我重命名了方法名称。如果不需要,您甚至可以停止它返回变量,但您需要进一步更改声明。)

于 2009-06-28T20:06:38.140 回答
0

在您更新的帖子中,需要将调试文本字段添加到某处的显示列表中。现在看起来它只是在该日志方法期间创建和使用的。您可以通过调用 addChild( displayObject:DisplayObject ):Boolean; 将显示对象添加到显示列表中。在已经是舞台子级的 DisplayObjectContainer 上。

于 2009-06-28T21:38:38.717 回答