📄 senwordscreen.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 + -