J2ME 技术的学习与实践者

[导入]OpenBaseMovil Action <--> View <--> Controller


网站: JavaEye  作者: iwinyeah  链接:http://iwinyeah.javaeye.com/blog/172974  发表时间: 2008年03月17日

声明:本文系JavaEye网站发布的原创博客文章,未经作者书面许可,严禁任何网站转载本文,否则必将追究法律责任!

Action: 规定了与用户交互的View可以触发的动作,在某个View新建之后显示之前,应先为其指定具体的Action,当用户按下了相应的Command按钮之后,View将该Command对应的Action发送到该View的Controller进行处理。
//
public class Action{
    String name; // 名称 
    Command command; // 命令 
    int code; // 代码 (将由该View的传递到其Controller使用)
    Item item; // 数据项 
    boolean defaultAction; // 是否是默认的Action 
    //...省略
}


请看View的基类的代码节选
public abstract class AbstractView{

    //...省略

    // 为该View增加Action
    public void addAction( final Action action, final boolean active )
    {
        if( !actions.containsKey( action.getName() ) )
        {
            // 将Action存入Actions表中
            actions.put( action.getName(), action );
            if( active )
            {
                activateAction( action );
            }
        }
    }

    // 使Action生效可用
    private void activateAction( final Action action )
    {
        final Command command = action.getCommand();
        activeActions.put( command, action );
        final Item item = action.getItem();
        if( item == null )
        {
            addCommand( command ); // 该Action是屏幕相关的命令
        }
        else
        {
            item.addCommand( command ); // 该Action是数据项相关的命令
            if( action.isDefaultAction() )
            {
                item.setDefaultCommand( command );
            }
        }
    }

    //...省略

    // 用户按下相应的命令键后,触发执行与其关联的Action
    public void commandAction(
            final Command       command,
            final Displayable   displayable
    )
    {
        if( !handleAction( command ) )
        {
            if( displayable instanceof Choice )
            {
                AbstractController.commandAction(
                        this,
                        command,
                        (Choice) displayable
                );
            }
            else
            {
                AbstractController.commandAction( this, command );
            }
        }
    }

    // 用户在某个指定了命令的Item按下了命令按钮时触发执行与其关联的Action
    public void commandAction( final Command command, final Item item )
    {
        if( !handleAction( command ) )
        {
            AbstractController.commandAction( this, command );
        }
    }

    // 根据所触发的命令查找关联的Action,并新它发送到Controller进行处理
    public boolean handleAction( final Command command )
    {
        if( activeActions.containsKey( command ) )
        {
            final Action action = (Action) activeActions.get( command );
            // 以Action代码为参数生成ControllerEvent并传递到controller处理
            final ControllerEvent event = new ControllerEvent(
                    action.getCode(),
                    this
            );
            controller.handle( event );
            return true;
        }
        else
        {
            return false;
        }
    }

    //...省略

}

本文的讨论也很精彩,浏览讨论>>


JavaEye推荐




文章来源:http://iwinyeah.javaeye.com/blog/172974

posted on 2008-03-17 14:06 iwinyeah 阅读(342) 评论(0)  编辑  收藏 所属分类: OpenBaseMovil 资料

View <--> Controller" trackback:ping="http://www.blogjava.net/iwinyeah/services/trackbacks/187974.aspx" /> -->

只有注册用户登录后才能发表评论。


网站导航: