MVC AS3错误:通过具有静态类型的引用调用可能未定义的方法

时间:2014-10-15 03:42:23

标签: actionscript-3 model-view-controller

我是Java的AS3新手,并尝试实现Java样式as3 mvc实现,它实际上有两个带有输入字段和文本框的视图,其中的内容由按钮更改。 我一直收到错误:调用可能未定义的方法handleMouseClick通过静态类型控制器的引用:Controller。而且无法理解为什么。这是针对TextToolsView中的函数handleMouseClick

这是我的代码(抱歉这么久,我不知道如何在不丢失错误的情况下进一步压缩它):

TextModel

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

public class TextModel extends EventDispatcher
{
    private var text:String = new String();
    private var initialText:String = new String("Initial Text");

    public function TextModel() 
    {
        setText(initialText);
    }
    public function setText(text:String):void {
        this.text = text;
    }
    public function getText():String {
        return this.text;
    }

    public function updateText(text:String):void {
        setText(text);
        dispatchEvent(new Event(Event.CHANGE));
    }

    public function clearText():void {
        setText("Text has been cleared");
        dispatchEvent(new Event(Event.CHANGE));
    }

    public function resetText():void {
        setText(initialText);
        dispatchEvent(new Event(Event.CHANGE));
    }
}
}

TextController

package controller 
{
import flash.events.MouseEvent;
import model.TextModel;

public class TextController extends AbstractController 
{
    /**
     * Constructor
     * @param   m   model to modify
     */
    public function TextController(m:TextModel) 
    {
        super(m);

    }
    private function updateText(text:String):void {
        TextModel(getModel()).updateText(text);
    }

    private function clearText():void {
        TextModel(getModel()).clearText();
    }

    private function resetText():void {
        TextModel(getModel()).resetText();
    }


    /*override public function update(obj: Object) {

    }*/

    public function handleMouseClick(event:MouseEvent):void {
        switch(event.currentTarget.id) {
            case "_updateButton":
            updateText("TEXT INPUT TO BE ADDED LATER");//add text input later   
            break;

            case "_clearButton":
            clearText();
            break;

            case "_resetButton":
            resetText();
            break;

        }
    }
}
}

一个AbstractController

package controller 
{
import model.TextModel;
import view.View;
/**
 * Provides basic services for the "controller" of
 * a Model/View/Controller triad.
 *
 */
public class AbstractController
{
    private var model:TextModel;
    private var view:View;

    public function AbstractController(m:TextModel) 
    {
        setModel(m);
    }

    public function setModel(m:TextModel):void 
    {
        model = m;
    }

    public function getModel():TextModel 
    {
        return model;
    }

    public function setView(v:View):void 
    {
        view = v;
    }

    public function getView():View 
    {
        return view;
    }

    public function update(obj:Object):void {

    }
}

}

TextBoxView

package view 
{
import controller.Controller;
import flash.display.Sprite;
import flash.events.Event;
import flash.text.TextField;
import flash.text.TextFormat;
import model.TextModel;
import model.TextUpdate;

/**
 * ...
 */
public class TextBoxView extends AbstractView {
    private var wrapper:Sprite = new Sprite();
    private var textBox:TextField = new TextField();
    private var inputField:TextField = new TextField();

    public function TextBoxView(m:TextModel, c:Controller, x:int, y:int) {
        super(m, c);

        textBox.text = "This is a text Panel with lots of text!!!!!!!!!!!!dghsdfghdfghdfghdfghdfghdfghdfghdfghdfghdfghdfghdfghdfgh";
        textBox.border = true;
        textBox.borderColor = 0x000000;
        textBox.multiline = true;
        textBox.width = 425;
        textBox.height = 115;
        textBox.x = 145;
        textBox.y = 20;
        textBox.wordWrap = true;

        var myFormat:TextFormat = new TextFormat(); 
        myFormat.color = 0xAA0000;    
        myFormat.size = 24;    
        myFormat.italic = true;     
        //myFormat.align = TextFormatAlign.CENTER
        textBox.setTextFormat(myFormat); 

        addEventListener(Event.CHANGE, this.update);


        //inputable text box
        inputField.border = true;
        inputField.width = 200;
        inputField.height = 150;
        inputField.x = 200;
        inputField.y = 50;
        inputField.type = "input";
        inputField.multiline = true;

        wrapper.addChild(textBox);
        wrapper.addChild(inputField);
        addChild(wrapper);
}

    public function update(event:Event):void {
        textBox.text = super.getModel().getText();
    }

}

}

TextToolsView

package view 
{
import controller.Controller;
import flash.events.Event
import controller.TextController;
import flash.display.Sprite;
import flash.events.MouseEvent;
import model.TextModel;
import model.TextUpdate;
import ui.CustomButton;

public class TextToolsView extends AbstractView 
{
    private var updateButton:CustomButton;
    private var clearButton:CustomButton;
    private var resetButton:CustomButton;
    private var wrapper:Sprite = new Sprite();
    private var textModel:TextModel;
    private var textController:TextController;

    public function TextToolsView(m:TextModel, c:Controller, x:int, y:int) {
        super(m, c);
        makeTools(x, y);
    }

    override public function defaultController (model:TextModel):Controller {
        return new TextController(model);
    }

    private function makeTools(x:int, y:int):void {
        updateButton = new CustomButton("update", "_updateButton", 100, 22); 
        updateButton.x = 0;
        updateButton.y = 0;
        updateButton.addEventListener(MouseEvent.CLICK, handleMouseClick);          

        clearButton = new CustomButton("clear", "_clearButton", 100, 22); 
        clearButton.x = 120;
        clearButton.y = 0;
        clearButton.addEventListener(MouseEvent.CLICK, handleMouseClick);

        resetButton = new CustomButton("reset", "_resetButton", 100, 22); 
        resetButton.x = 240;
        resetButton.y = 0;
        resetButton.addEventListener(MouseEvent.CLICK, handleMouseClick);

        wrapper.x = x;
        wrapper.y = y;
        wrapper.addChild(updateButton);
        wrapper.addChild(clearButton);
        wrapper.addChild(resetButton);
        addChild(wrapper);
    }

    private function handleMouseClick(event:MouseEvent):void {
            super.getController().handleMouseClick(event);  
    }
}

}

摘要视图

package view 
{
import controller.Controller;
import flash.display.Sprite;
import model.TextModel;

/**
* Provides basic services for the "view" of
* a Model/View/Controller triad.
*/
public class AbstractView extends Sprite 

{
    private var model:TextModel;
    private var controller:Controller;

    public function AbstractView(m:TextModel, c:Controller) 
    {
        setModel(m);
        setController(c);
    }

    /** 
     * returns the default controller for this view
     */
    public function defaultController (model:TextModel):Controller {
        return null;
    }
    /**
      * Sets the model this view is observing.
      */
    public function setModel (m:TextModel):void {
        model = m;
    }

    /**
    * Returns the model this view is observing.
    */
    public function getModel ():TextModel {
        return model;
    }

    /**
    * Sets the controller for this view.
    */
    public function setController (c:Controller):void {
        controller = c;
        // Tell the controller this object is its view.
        getController().setView(this);

    }

    /**
    * Returns this view's controller.
    */
    public function getController():Controller {
        return controller;
    }


}

}

我不会发布自定义按钮,因为它基本上可以像任何普通按钮一样正常工作。

和Main

package 
{
import controller.TextController;
import flash.display.Sprite;
import flash.events.Event;
import model.TextModel;
import view.TextBoxView;
import view.TextToolsView;

/**
 * ...
 */
public class Main extends Sprite 
{
    private var text_model:TextModel;
    private var text_box:TextBoxView;
    private var text_tools:TextToolsView;
    private var textController:TextController;

    public function Main():void 
    {
        if (stage) init();
        else addEventListener(Event.ADDED_TO_STAGE, init);
    }

    private function init(e:Event = null):void 
    {
        removeEventListener(Event.ADDED_TO_STAGE, init);
        // entry point

        text_model = new TextModel();
        textController = new TextController(text_model);

        text_box = new TextBoxView(text_model, textController, 0,0);
        //text_model.addObserver(text_box);
        text_tools = new TextToolsView(text_model, textController, 120, 300);
        //text_model.addObserver(text_tools);
        addChild(text_box);
        addChild(text_tools);


    }

}

}

1 个答案:

答案 0 :(得分:0)

我没有看到Controller的代码,但我认为问题与它有关。

super.getController().handleMouseClick(event);

在此代码中,getController()方法返回Controller实例,但此类不包含方法handleMouseClick()。所以,我认为,您需要将Controller转换为TextController,如下所示:

(getController() as TextController).handleMouseClick(event);