急,各位牛人请进,关于一个SWT GUI延时的问题。

freeleons 2007-07-08 12:13:47
用SWT Designer设计了一个二叉树的遍历示意器,用Text(文本输入框) 表示二叉树的节点,在中序、前序、后序遍历示希望 Text的颜色会有变化,用绿色代表遍历时走过的节点,红色表示遍历过程中访问的节点。但是遍历的速度太快了,根本看不出来颜色的变化,就一瞬间全都变红了,在网上查了一些资料了 试了一下 用
try {Thread.currentThread().sleep(1000);}
catch(InterruptedException e) {}
是不行的,它是起到了延时的作用,但是在延时的过程中整个窗口什么都不显示,一片空白,等到完成后一起显示,看不多遍历的过程。我就希望在那个遍历递归函数执行一条语句停2秒钟 在执行下一条,并能在窗口中看到遍历的过程。我的这个中序遍历函数是这样的
public void inorderTraversal(Node probe)
{
if (probe!=null)
probe.t.setBackground(probe.t.getDisplay().getSystemColor(SWT.COLOR_GREEN)); //经过的节点变绿色
inorderTraversal(probe.leftChild);
sum=sum+probe.getData()+" ";
probe.t.setBackground(probe.t.getDisplay().getSystemColor(SWT.COLOR_RED)); //表示经过的节点变红色
inorderTraversal(probe.rightChild);
}
是不用Timer什么的,还是多线程控制?那位好心人解答一下,谢谢!
...全文
232 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
freeleons 2007-07-14
  • 打赏
  • 举报
回复
感谢zhuokai(海鸥)
现在我的弄好了。
原因就是SWT不允许其他非UI线程直接操作主线程上的图形,因为SWT作为一种桌面程序,比普通的Java程序要多一个UI线程,UI线程负责不断地画出显示的UI控件,和负责事件的处理。当某个队列中的事件是一个非常耗时的事件时,用户就需要长时间等待,这是就要为长时间处理的程序单独开辟出一个线程来执行,这样就给用户的感觉就是,虽然后台运行着程序,但也不会影响界面上的操作。当从非UI线程执行widget图形和事件操作时就要提供Runnable来调用UI线程,类Display中方法syncExec (Runnable) 和asyncExec(Runnable)用来执行UI线程中的runnable 。
zhuokai 2007-07-11
  • 打赏
  • 举报
回复
Display.getDefault().asynExec(new Runnable()
{
public void run()
{
try {Thread.currentThread().sleep(1000);}
catch(InterruptedException e) {}
}
}
);
freeleons 2007-07-08
  • 打赏
  • 举报
回复
自己顶一个

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧