如何使我的公共静态日志记录方法写入输入字段?

时间:2009-06-28 19:42:36

标签: actionscript-3 flex3 static methods public

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

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)的新staic方法。这应该将消息记录到多行输入字段。

然而问题是这个输入字段必须在某处创建并且必须始终可访问和可见,并且我不想一直传递它通过函数参数,因为这会导致很多麻烦(我我必须通过物体传递它。)。

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

更新 我现在尝试了以下类,使用静态构造函数(我认为)。但是,文本字段对象未显示。当我在创建它之后执行addChild(debugField)时,它会给出错误1180。

Logger.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 个答案:

答案 0 :(得分: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 );
        }
    }
}

MessageLogger

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();

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

所以而不是

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

你有

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

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

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

答案 3 :(得分:0)

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