Gauge 问题请教
各位前辈帮我看一下面的代码,Gauge 怎么增加不到指定的form 里的
下面的代码的意思是如果有form传进来就在指定的form上面显示一个进度条
我是在actionCommand 里调用这个类的。
是不是要刷新这个form还是怎么,这个Gauge一直没有显示出来。
但是如果我在调用Alert返回这个界面后这个Gauge是出来的。
请各位指教,谢谢!在经等待
---------------------------------------------
import javax.microedition.lcdui.*;
public class ThreadWait implements Runnable {
private int sec;
private Form form;
private String msg;
public ThreadWait(int sec,Form form,String msg){
this.sec=sec;
this.form=form;
this.msg=msg;
new Thread(this).run();
}
public void run(){
try{
if (form==null)
Thread.sleep(sec*1000);
else
{
Gauge gauge=new Gauge(msg,false,sec*1000,Gauge.CONTINUOUS_IDLE);
form.append(msg);
form.append(gauge);
for (int i=10*sec;i<=1000*sec;i+=10*sec)
{
Thread.sleep(10*sec);
gauge.setValue(i);
}
}
}
catch (Exception e)
{
System.out.println(e);
}
}
}
[解决办法]
在你原思路上,修改了下ThreadWait类。
- Java code
import javax.microedition.lcdui.*;public class ThreadWait implements Runnable { private int sec; private Form form; private String msg; public ThreadWait(int sec, Form form, String msg) { this.sec = sec; this.form = form; this.msg = msg; new Thread(this).start(); } public void run() { try { if (form != null) { Gauge gauge = new Gauge(msg, false, 100, Gauge.CONTINUOUS_IDLE); form.append(msg); int k = form.append(gauge); while (gauge.getValue() != gauge.getMaxValue()) { gauge.setValue(gauge.getValue() + 1); Thread.sleep(10 * sec); } form.delete(k); } } catch (Exception e) { System.out.println(e); } }}
[解决办法]
package prj10_2;
import javax.microedition.lcdui.*
public class frm_MIDLet1 extends Form implements CommandListener,
ItemStateListener, ItemCommandListener {
private static frm_MIDLet1 frm;
private TextField tf_id = new TextField("用户名", "", 20, TextField.ANY);
private TextField tf_pw = new TextField("密 码", "", 20, TextField.NUMERIC
| TextField.PASSWORD);
private Command Cmd_login = new Command("登陆", Command.SCREEN, 1);
private Command Cmd_del = new Command("删除", Command.BACK, 1);
public frm_MIDLet1() {
super("登陆界面");
frm = this;
this.append(tf_id);
this.append(tf_pw);
this.addCommand(Cmd_login);
this.setCommandListener(this);
this.setItemStateListener(this);
}
public void commandAction(Command c, Displayable d) {
if (c == Cmd_login) {
Gauge g = new Gauge("登陆验证", false, 100, 0);
frm.append(g);
thread_gauge tg = new thread_gauge(g);
tg.start();
try {
tg.join();
} catch (Exception ex) {
ex.printStackTrace();
}
System.out.println("验证完毕");
}
}
public void commandAction(Command c, Item i) {
TextField tf = (TextField) i;
int p = tf.getCaretPosition();
if (p > 0) {
tf.delete(p - 1, 1);
}
if (tf.size() == 0) {
tf.removeCommand(Cmd_del);
}
}
public void itemStateChanged(Item i) {
TextField tf = (TextField) i;
if (tf.size() != 0) {
tf.addCommand(Cmd_del);
tf.setItemCommandListener(this);
}
}
class thread_gauge extends Thread {
private Gauge g1;
public thread_gauge(Gauge g) {
this.g1 = g;
}
public void run() {
for (int i = 0; i < 100; i += 20) {
g1.setValue(i);
System.out.println(i);
try {
Thread.currentThread().sleep(1000);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
}
我这样,直接在form类里面写进度条,怎么进度条总是在时间结束后才显示出来?而不是一点击就出现?
[解决办法]
appand(g)是添加进Form了
不过屏幕还得刷新后才能看到
而你阻塞了,导致屏幕无法及时刷新了
要在线程结束后处理其他事,可以另外解决
比如放线程后边操作
[解决办法]
哦,了解。那其实是要在form刷新后再启动线程。。可惜我们好像获取不到form刷新后的事件。
楼上说的没错,是可以放在线程后边操作。
但是有时候就怕遇到要在主线程做这部分工作的情况。这时候就要加上join了吧?不然的话,join这个方法不是没用?
[解决办法]
友情up
[解决办法]