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

📄 senwordscreen.java

📁 一個手機程序(電子詞典),一個不可多得的源碼程序,是學習J2ME的好東東.
💻 JAVA
字号:
package org.zblog.zenghelper.screen;

import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Image;
import org.zblog.zenghelper.dbtool.EnWord;
import org.zblog.zenghelper.dbtool.SystemInfo;
import java.util.Vector;
import org.zblog.zenghelper.dbtool.DbTool;
import java.util.Random;
import org.zblog.zenghelper.dbtool.CnWord;
import org.zblog.zenghelper.util.Navigator;
import org.zblog.zenghelper.screen.sub.SetShowPropertyScreen;

/**
 * <br><strong>Z英语学习助手-查看/添加/修改单词屏幕</strong><br>
 * <br>该屏幕是采用低级API来实现.主要包括:
 * <br>1.标题栏和分隔横线
 * <br>2.正文:单词,音标,解释
 * <br>3.一个Back按钮用于返回主菜单
 * <br>4.其它Command:取消生词标记,设置显示属性,重新随机排序
 *
 * @author <a href="mailto:zcw@zblog.org">朱传伟</a><br>
 * <a href="http://www.zblog.org">www.zblog.org</a></p>
 * @version <strong>ZEnHelper</strong> Ver 1.0
 */
public class SenWordScreen extends Canvas implements CommandListener{
    public DbTool dt=DbTool.getInstance();
    /** 显示属性 */
    public SystemInfo sinfo=new SystemInfo();
    /** 屏幕上下滚动标记,凡是小于该标记的,均不显示 */
    public int base=0;
    public int step=1;
    /** 中文解释是否显示标志 */
    public boolean cnShow=false;
    /** 英文单词是否显示标志 */
    public boolean enShow=true;
    /** 音标是否显示标志 */
    public boolean ybShow=true;
    /** 当前的EnWord */
    public EnWord eword=null;
    /** 当前记录指针 */
    public int current=-1;
    /** 记录所有生词Id的集合 */
    public Vector rsIds=null;
    public Random rdm=null;
    /** Command定义 */
    public Command back=null;
    public Command cancelSbz=null;
    public Command setProperty=null;
    public Command reRandom=null;
    private static SenWordScreen sws=null;

    /**
     * 初始化方法,需要初始化以下项目:<br>
     * 1.从生词表中读出所有EnWord的rsId到Vector中<br>
     * 2.根据SystemInfo中的设置,读出第一个EnWord对象
     */
    private SenWordScreen(){
        init();
        //初始化Command
        back=new Command("返回",Command.BACK,1);
        cancelSbz=new Command("取消生词标记",Command.ITEM,1);
        setProperty=new Command("设置显示属性",Command.ITEM,2);
        reRandom=new Command("重新随机排序",Command.ITEM,3);
        addCommand(back);
        addCommand(cancelSbz);
        addCommand(setProperty);
        addCommand(reRandom);
        setCommandListener(this);
    }

    /**
     * SenWordScreen对象初始化方法
     */
    public void init(){
        rsIds=dt.getSenIds();
        cnShow=sinfo.isCnShow;
        enShow=sinfo.isEnShow;
        ybShow=sinfo.isYbShow;
        current=-1;
        if(rsIds.size()>0)
            current=0;
        if(sinfo.isRandom)
            toRandom();
        loadEnWord();
    }

    /**
     * 返回SenWordScreen实例
     * @return AddWordScreen
     */
    public synchronized static SenWordScreen getInstance(){
        if(sws==null)
            sws=new SenWordScreen();
        else
            sws.init();
        return sws;
    }

    /**
     * 负责加载EnWord
     */
    public void loadEnWord(){
        if(rsIds.size()>0){
            int trsid=Integer.parseInt((String)rsIds.elementAt(current));
            eword=new EnWord(trsid);
        }
        else{
            eword=null;
        }
    }

    /**
     * 对于随机读取方式,需要先按照随机排列方式,重新组装Vector
     */
    public void toRandom(){
        if(rdm==null)rdm=new Random();
        if(rsIds.size()>0){
            Vector tvc=new Vector();
            int id=0;
            for(int n=rsIds.size();n>1;n--){
                id=(rdm.nextInt()>>>1)%(rsIds.size()-1);
                tvc.addElement(rsIds.elementAt(id));
                rsIds.removeElementAt(id);
            }
            if(rsIds.size()>0)tvc.addElement(rsIds.elementAt(0));
            rsIds=tvc;
        }
    }

   /**
    * 页面显示说明:<br>
    * 1.顶部显示"生词卡片 5/100"<br>
    * 2.中间显示单词,音标,解释<br>
    * 3.Command包括:返回,取消生词标记,生词显示设置<br>
    * <strong>注明:</strong>前后翻页,显示解释的控制有上下左右键控制
    * @param graphics Graphics
    */
    protected void paint(Graphics gp) {
        int xx=gp.getClipWidth();
        int yy=gp.getClipHeight();
        //游动的y轴坐标
        int py=0;
        //固定的起始x轴坐标
        int px=3;
        //y轴间隔
        int ppy=1;
        //x轴间隔
        int ppx=2;
        //任意变量
        int ti=0;
        //清除屏幕
        gp.setColor(255,255,255);
        gp.fillRect(0,0,xx,yy);
        //设置字体
        Font fontBT=Font.getFont(Font.FACE_SYSTEM,Font.STYLE_BOLD,Font.SIZE_MEDIUM);
        Font fontZW=Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_MEDIUM);
        //绘制标题,以及下面的直线
        gp.setColor(0,0,123);
        gp.setFont(fontBT);
        gp.drawString("生词卡片  "+(current+1)+" / "+rsIds.size(),5,3,Graphics.TOP | Graphics.LEFT);
        //gp.setColor(128,128,128);
        py=fontBT.getHeight()+3;
        gp.drawLine(0,py,xx,py);
        py=py+1;
        gp.setColor(88,168,255);
        gp.drawLine(0,py,xx,py);
        gp.setColor(0,0,123);
        py=py+ppy;
        if(eword!=null){
            //针对上下滚动的响应,现在开始计数
            int point=0;
            //绘制"单词"及内容
            //char[] tcs = "单词:".toCharArray();
            //int twoL = fontBT.charsWidth(tcs, 0, tcs.length);
            int twoL=2;
            if (point >= base) {
                //gp.drawString("单词:", px, py, Graphics.TOP | Graphics.LEFT);
                if (enShow) {
                    ti = px + twoL + ppx;
                    gp.setFont(fontZW);
                    gp.drawString(eword.word, ti, py,
                                  Graphics.TOP | Graphics.LEFT);
                }
                py = py + fontZW.getHeight() + ppx;
            }
            //绘制"音标"及内容
            point++;
            if (point >= base) {
                gp.setFont(fontBT);
                //gp.drawString("音标:", px, py, Graphics.TOP | Graphics.LEFT);
                if (ybShow) {
                    ti = px + twoL + ppx;
                    Image pim = null;
                    try {
                        for (int i = 0, n = eword.ybs.length; i < n; i++) {
                            pim = Image.createImage(
                                    "/org/zblog/zenghelper/res/symbol/" +
                                    eword.ybs[i] + ".png");
                            gp.drawImage(pim, ti, py,
                                         Graphics.TOP | Graphics.LEFT);
                            ti = ti + pim.getWidth();
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                py = py + fontBT.getHeight() + ppy;
            }
            //绘制"解释"及标记
            point++;
            if (point >= base) {
                gp.setFont(fontBT);
                gp.drawString("解释:", px, py, Graphics.TOP | Graphics.LEFT);
                py = py + fontBT.getHeight();
            }
            if (cnShow) {
                gp.setFont(fontZW);
                CnWord tcw = null;
                for (int i = 0; i < eword.cnRSId.size(); i++) {
                    point++;
                    if (point >= base) {
                        tcw = new CnWord(Integer.parseInt((String) eword.cnRSId.
                                elementAt(i)));

                        gp.drawString(eword.cnAdj.elementAt(i) + "." + tcw.word,
                                      px + ppx, py,
                                      Graphics.TOP | Graphics.LEFT);
                        py = py + fontZW.getHeight();
                    }
                }
            }
        }
        else{
            gp.drawString("数据库中没有生词!",px+ppx,py+10,Graphics.TOP | Graphics.LEFT);
        }
    }

    /**
     * 对卡片的循环交替控制
     * @param keycode int
     */
    public void keyPressed(int keycode){
        //上,屏幕向上移动
        if(keycode==-1){
            base=base-step;
            if(base<0)base=0;
        }
        //下,屏幕向下移动
        else if(keycode==-2){
            base=base+step;
            //保证屏幕中至少显示4条解释,即size()+头部的3行-4
            if((eword!=null)&&base>(eword.cnRSId.size()-1))
                base=eword.cnRSId.size()-1;
        }
        //右,下一张卡片
        else if(keycode==-4){
            if(++current>=rsIds.size())
                current=rsIds.size()-1;
            loadEnWord();
            cnShow=sinfo.isCnShow;
            enShow=sinfo.isEnShow;
            ybShow=sinfo.isYbShow;
        }
        //左,上一张卡片
        else if(keycode==-3){
            if(--current<0){
                if (rsIds.size() > 0)
                    current = 0;
                else
                    current=-1;
            }
            loadEnWord();
            cnShow=sinfo.isCnShow;
            enShow=sinfo.isEnShow;
            ybShow=sinfo.isYbShow;
        }
        //OK,将所有属性设置成显示状态
        else if(keycode==-5){
            cnShow=true;
            enShow=true;
            ybShow=true;
        }
        repaint();
    }

    /**
     * 实现CommandListener的回调方法,用于监听Command
     * @param command Command
     * @param displayable Displayable
     */
    public void commandAction(Command command, Displayable displayable) {
        String lbstr=command.getLabel();
        if(lbstr.equals("返回")){
            Navigator.current=Navigator.Main_Screen;
            Navigator.show();
        }
        else if(lbstr.equals("取消生词标记")){
            if(eword!=null){
                cancelSbz();
                repaint();
            }
        }
        else if(lbstr.equals("设置显示属性")){
            SetShowPropertyScreen ssp=
                    new SetShowPropertyScreen(this,sinfo);
            Navigator.show(ssp);
        }
        else if(lbstr.equals("重新随机排序")){
            if(rsIds.size()>1){
                toRandom();
                current = 0;
                cnShow = sinfo.isCnShow;
                enShow = sinfo.isEnShow;
                ybShow = sinfo.isYbShow;
                loadEnWord();
                repaint();
            }
        }
    }

    /**
     * 取消该EnWord的生词标志
     */
    public void cancelSbz(){
        dt.deleteOne(DbTool.STRANGE_WORD,eword.senId);
        rsIds.removeElement(""+eword.rsId);
        eword.setSen(-1);
        eword.store();
        if(rsIds.size()==0)
             current=-1;
        loadEnWord();
        cnShow=sinfo.isCnShow;
        enShow=sinfo.isEnShow;
        ybShow=sinfo.isYbShow;
    }

}

⌨️ 快捷键说明

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