簡體   English   中英

MVC AS3錯誤:通過具有靜態類型的引用調用可能未定義的方法

[英]MVC AS3 Error: Call to a possibly undefined method through a reference with static type

我是Java的AS3新手,正嘗試實現Java風格的as3 mvc實現,該實現本質上具有兩個視圖,其中包含輸入字段和文本框,其內容由按鈕更改。 我不斷收到錯誤消息:通過帶有靜態類型controller:Controller的引用調用可能未定義的方法handleMouseClick。 而且不明白為什么。 這是針對TextToolsView中的handleMouseClick函數

這是我的代碼(很長一段時間,很抱歉,我不確定如何進一步壓縮它而不會丟失我的錯誤):

文字模型

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;

        }
    }
}
}

抽象控制器

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;
    }


}

}

我不會發布自定義按鈕,因為從本質上講,它可以像任何普通按鈕一樣正常工作。

和主要

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


    }

}

}

我沒有看到Controller代碼,但我認為問題與它有關。

super.getController().handleMouseClick(event);

在此代碼中,getController()方法返回Controller實例,但此類不包含方法handleMouseClick() 所以,我認為,您需要像這樣將Controller轉換為TextController:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM