这是很好的进度条的模板,里面涉及丰富的Java知识,值得很好研究。如:单例模式,接口等知识。。。
package com.srk.gauge;
import javax.microedition.lcdui.Display;
/**
*
* 这是仿照Smart Ticket制作的进度条观察者,这个模型的优点是
* 1,低耦合度。你可以通过Form,Canvas等来实现这个接口
* 2,支持可中断的任务,因为背景线程是无法强制性中断的,
* 所以就 没有了在观察者中回调背景线程相应方法的必要,
* 如果支持可中断的话,可以让背景线程来查询观察者的isStopped()
* 3,可以说进度条仅仅将自己绘画在屏幕上,他对后台线程毫不关心
*/
public interface ProgressObserver {
/**
* 将进度条复位
*/
public void reset();
/**
* 将进度条设置最大
*/
public void setMax();
/*
* 将自己绘制在屏幕上,如果进度条要开启自身的线程用于自动更新画面,
* 也在这里构造并开启绘画线程(常用于动画滚动条)
*/
public void show(Display display);
/**
* 滚动条退出命令,如果进度条曾经开启自身的线程用于自动更新画面,
* (常用于动画滚动条),在这里关闭动画线程
*/
public void exit();
/**
* 更新进度条
*/
public void updateProgress(Object param1);
public boolean isStoppable();
public void setStoppable(boolean stoppable);
public boolean isStopped();
public void setStopped(boolean stopped);
public void setTitle(String title);
public void setPrompt(String prompt);
}
package com.srk.gauge;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.Gauge;
public class ProgressGaugeImpl implements ProgressObserver,
CommandListener {
private static final int GAUGE_MAX = 8;
private static final int GAUGE_LEVELS = 4;
private static ProgressGaugeImpl pgUI;
private Form f;
private Gauge gauge;
private Command stopCMD;
boolean stopped;
boolean stoppable;
int current;
protected ProgressGaugeImpl() {
f = new Form("");
gauge = new Gauge("", false, GAUGE_MAX, 0);
stopCMD = new Command("Cancel", Command.STOP, 10);
f.append(gauge);
f.setCommandListener(this);
}
public static ProgressGaugeImpl getInstance() {
if (pgUI == null) {
return new ProgressGaugeImpl();
}
return pgUI;
}
public void reset() {
current = 0;
gauge.setValue(0);
stopped = false;
setStoppable(false);
setTitle("");
setPrompt("");
}
public void updateProgress(Object param1) {
//这里的参数设计为提示语
current = (current + 1) % GAUGE_LEVELS;
gauge.setValue(current * GAUGE_MAX / GAUGE_LEVELS);
if (param1 != null && param1 instanceof String) {
setPrompt((String) param1);
}
}
public boolean isStoppable() {
return stoppable;
}
public void setStoppable(boolean stoppable) {
this.stoppable = stoppable;
if (stoppable) {
f.addCommand(stopCMD);
} else {
f.removeCommand(stopCMD);
}
}
public boolean isStopped() {
return stopped;
}
public void setStopped(boolean stopped) {
this.stopped = stopped;
}
public void setTitle(String title) {
f.setTitle(title);
}
public void setPrompt(String prompt) {
gauge.setLabel(prompt);
}
public void commandAction(Command arg0, Displayable arg1) {
if (arg0 == stopCMD) {
if (isStoppable()) {
stopped = true;
} else {
setPrompt("can't stop!");
}
}
}
public void show(Display display) {
display.setCurrent(f);
}
public void exit() {
// 忽略
}
public void setMax() {
gauge.setValue(GAUGE_MAX);
}
}