⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cardeditor.java

📁 J2ME程序设计实例教程的源码
💻 JAVA
字号:
import javax.microedition.pim.*;
import javax.microedition.lcdui.*;
import java.util.*;

/**
 * CardEditor类是个名片编辑器,提供了名片的编辑视图,及相关的编辑命令。
 */
public class CardEditor extends MicroComponent implements CommandListener, ItemCommandListener {
    //
    private CardcaseMIDlet midlet;
    private MicroComponent backScreen; //返回屏幕
    private Cardcase cardcase;          //名片盒
    private Contact card;               //名片
    private Form cardView;              //名片视图
    private Hashtable fieldTable = new Hashtable(); //存储视图中的Item项与对应的字段
    private Command cmdBack = new Command("返回", Command.BACK, 1);
    private Command cmdAddField = new Command("添加字段", Command.SCREEN, 2);
    private Command cmdSave = new Command("保存名片", Command.SCREEN, 3);
    private Command cmdEditArray = new Command("编辑数组字段", Command.SCREEN, 4);
    private Command cmdDelField = new Command("删除字段", Command.SCREEN, 5);
    private Command cmdShowPhoto = new Command("显示照片", Command.SCREEN, 6);
    
    //构造方法,创建一个名片编辑器
    public CardEditor(Cardcase cardcase, Contact card, CardcaseMIDlet midlet, MicroComponent backScreen) {
        this.cardcase = cardcase;
        this.card = card;
        this.midlet = midlet;
        this.backScreen = backScreen;
        
        cardView = new Form("名片——" + cardcase.getCardLabel(card));
        cardView.addCommand(cmdBack);
        cardView.addCommand(cmdSave);
        cardView.setCommandListener(this);
    }
    
    //显示名片视图
    public void show() {
        updateView();   //更新视图
        Display.getDisplay(midlet).setCurrent(cardView);
    }
    
    //更新名片视图
    private void updateView() {
        //清除
        cardView.deleteAll();
        fieldTable.clear();
        
        //获取名片card使用的字段
        int[] usedFields = cardcase.getUsedFields(card);
        for(int i=0; i<usedFields.length; i++) {    //构造新视图
            if(usedFields[i]==Contact.CLASS) {  //忽略CLASS字段
                continue;
            }
            
            populateField(usedFields[i]); //在视图中添加被使用的字段
        }
        int[] supportedFields = cardcase.getSupportedFields(card);
        if(usedFields.length < supportedFields.length) {
            cardView.addCommand(cmdAddField);
        }
        else {
            cardView.removeCommand(cmdAddField);
        }
    }
    
    //向视图中添加一个表示field字段的Item组件,该方法在更新视图时调用。
    private void populateField(int field) {
        //获取字段field的标签和数据类型
        String fieldLabel = cardcase.getFieldLabel(card, field);
        int fieldType = cardcase.getFieldType(card, field);
        
        Item fieldView = null;  //字段视图
        switch(fieldType) {
            case Contact.BOOLEAN: {   //处理boolean类型的字段
                fieldView = new ChoiceGroup(fieldLabel, Choice.EXCLUSIVE);
                ((ChoiceGroup)fieldView).append("是", null);
                ((ChoiceGroup)fieldView).append("否", null);
                boolean boo = card.getBoolean(field, 0);
                if(boo) {
                    ((ChoiceGroup)fieldView).setSelectedIndex(0, true);
                }
                else {
                    ((ChoiceGroup)fieldView).setSelectedIndex(1, true);
                }
                break;
            }
            case Contact.INT: {   //处理int类型字段
                String intVal = String.valueOf(card.getInt(field, 0));
                fieldView = new TextField(fieldLabel, intVal, 
                                    intVal.length()*2, TextField.NUMERIC);
                break;
            }                
            case Contact.DATE: {  //处理日期类型的字段
                long dt = card.getDate(field, 0);
                if(field == Contact.REVISION) {     //REVISION字段不可编辑
                    Calendar cale = Calendar.getInstance();
                    cale.setTime(new Date(dt));
                    StringBuffer sb = new StringBuffer();
                    sb.append(cale.get(Calendar.YEAR));   sb.append("年");
                    sb.append(cale.get(Calendar.MONTH) + 1); sb.append("月");
                    sb.append(cale.get(Calendar.DAY_OF_MONTH)); sb.append("日");
                    fieldView = new StringItem(fieldLabel, sb.toString());
                }
                else {
                    fieldView = new DateField(fieldLabel, DateField.DATE);
                    ((DateField)fieldView).setDate(new Date(dt));
                }
                break;
            }
            case Contact.STRING: {      //处理字符串类型的字段
                String str = card.getString(field, 0);
                if(field == Contact.UID) {      //UID字段不可编辑
                    fieldView = new StringItem(fieldLabel, str);
                }
                else {
                    int constraints = TextField.ANY;
                    if(field == Contact.EMAIL) {
                        constraints = TextField.EMAILADDR;
                    }
                    else if(field == Contact.TEL) {
                        constraints = TextField.PHONENUMBER;
                    }
                    else if(field == Contact.URL || field == Contact.PHOTO_URL) {
                        constraints = TextField.URL;
                    }
                    fieldView = new TextField(fieldLabel, str, 160, constraints);
                }
                break;
            }
            case Contact.STRING_ARRAY: {    //处理字符串数组类型的字段
                String[] a = card.getStringArray(field, 0);
                if(a != null) {
                    fieldView = new StringItem(fieldLabel, cardcase.joinStringArray(a), 
                                                Item.HYPERLINK);
                    fieldView.setDefaultCommand(cmdEditArray);  //添加字段编辑命令
                }
                break;
            }
            case Contact.BINARY: {      //处理二进制类型的字段
                byte[] data = card.getBinary(field, 0);
                if (data != null) {
                    fieldView = new StringItem(fieldLabel + "  ", 
                                        data.length + " bytes", Item.HYPERLINK);
                    if(field == Contact.PHOTO) {    //照片
                        fieldView.setDefaultCommand(cmdShowPhoto);  //添加显示照片命令
                    }
                }
                break;
            }
        }
        if(fieldView != null) {
            cardView.append(fieldView);
            fieldTable.put(fieldView, new Integer(field));  //记录Item组件和对应字段
            fieldView.addCommand(cmdDelField);  //为每个字段的Item组件添加删除命令
            fieldView.setItemCommandListener(this);
        }
    }
    
    //处理视图中的命令
    public void commandAction(Command cmd, Displayable d) {
        if(cmd == cmdBack) {    //返回
            backScreen.show();
        }
        else if(cmd == cmdSave) {   //保存名片
            try {
                this.getViewData();     //获取视图数据
                card.commit();          //提交
                this.updateView();      //更新视图
            }
            catch(PIMException pime) {
                midlet.showError("保存名片错误!原因:\n" + pime.toString());
            }
        }
        else if(cmd == cmdAddField) {   //添加字段
            //创建字段选择对话框,并显示该对话框,提示用户选择要添加的字段。
            SelectionDialog fsDialog = createFeildSelectionDialog();
            fsDialog.show();
        }
    }
    
    //处理字段Item上的命令
    public void commandAction(Command cmd, Item item) {
        int field = ((Integer) fieldTable.get(item)).intValue();    //获取的字段
        if(cmd == cmdEditArray) {   //编辑数组字段
            //创建字段数组编辑器,然后显示编辑器
            ArrayElementEditor arrElemEditor = new ArrayElementEditor(cardcase, card, field, midlet, this);
            arrElemEditor.show();
        }
        else if(cmd == cmdShowPhoto) {  //显示照片
            /*-------------请读者完成该功能--------------------*/
        }
        else if(cmd == cmdDelField) {   //删除字段
            if(field == Contact.REVISION || field == Contact.UID) {
                String fieldLabel = cardcase.getFieldLabel(card, field);    //
                midlet.showError("\"" + fieldLabel+"\"是只读字段,不能删除!");
            }
            else {
                card.removeValue(field, 0);
                updateView();   //更新视图
            }
        }
    }
    
    //把视图中的数据存储到名片card中,该方法在添加字段,提交名片数据时将被调用。
    private void getViewData() {
        int fieldCount = cardView.size();   //视图中的字段数
        for (int i = 0; i < fieldCount; i++) {
            Item viewItem = cardView.get(i);    //字段视图
            int field = ((Integer)fieldTable.get(viewItem)).intValue();
            if (card.countValues(field) < 1) {
                continue;
            }
            int fieldType = cardcase.getFieldType(card, field);
            switch (fieldType) {
                case PIMItem.STRING: {
                    if(field == Contact.UID) {  //不可编辑
                        //
                    }
                    else {
                        String s = ((TextField)viewItem).getString();
                        card.setString(field, 0, PIMItem.ATTR_NONE, s);
                    }
                    break;
                }
                case PIMItem.DATE: {
                    if(field == Contact.REVISION) { //不可编辑
                        //
                    }
                    else {
                        long dt = ((DateField)viewItem).getDate().getTime();
                        card.setDate(field, 0, PIMItem.ATTR_NONE, dt);
                    }
                    break;
                }
                case PIMItem.INT: {
                    String s = ((TextField)viewItem).getString();
                    int j = Integer.parseInt(s);
                    card.setInt(field, 0, PIMItem.ATTR_NONE, j);
                    break;
                }
                case PIMItem.BOOLEAN: {
                    boolean boo = ((ChoiceGroup)viewItem).isSelected(0);
                    card.setBoolean(field, 0, PIMItem.ATTR_NONE, boo);
                    break;
                }
            }
        }
    }
    
    //创建字段选择对话框
    private SelectionDialog createFeildSelectionDialog() {
        final SelectionDialog fsDialog = new SelectionDialog(Display.getDisplay(midlet), 
                                            "请选择添加的字段", Choice.MULTIPLE);
                                            
        int[] unField = cardcase.getUnusedFields(card);
        final Vector unusedFields = new Vector();
        for(int i=0; i<unField.length; i++) { 
            if(unField[i] == Contact.CLASS ||      
                unField[i] == Contact.REVISION || 
                unField[i] == Contact.UID) {           //忽略CLASS,REVISION,UID字段
                continue;
            }
            fsDialog.append(cardcase.getFieldLabel(card, unField[i]));
            unusedFields.addElement(new Integer(unField[i]));
        }
        fsDialog.setSelectionDialogListener(new SelectionDialogListener() {
            public void actionDialog(SelectionDialog sDialog) {
                int handle = sDialog.getHandle();   //用户的操作
                if(handle == SelectionDialog.OK) {
                    boolean[] flags = new boolean[unusedFields.size()];
                    fsDialog.getSelectedFlags(flags);
                    for(int i=0; i<flags.length; i++) {
                        if(flags[i]) {  //选中字段
                            int fieldCode = ((Integer)unusedFields.elementAt(i)).intValue();
                            cardcase.addFieldToCard(card, fieldCode);//
                        }
                    }
                    
                    getViewData();
                    CardEditor.this.show();
                }
                else if(handle == SelectionDialog.CANCEL) {
                    Display.getDisplay(midlet).setCurrent(cardView);
                }
            }
        });
        
        return fsDialog;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -