如何从Thread更新java GUI? [英] How to update java GUI from Thread?
问题描述
private void StartActionPerformed(java.awt.event.ActionEvent evt) {
Queue queue=new Queue();
int target=Integer.parseInt(Target.getText());
String path=Path.getText();
final Producer p=new Producer(queue, target);
Consumer c=new Consumer(queue);
p.start();
c.start();
while(p.finish !=true)
{
Runnable r = new Runnable() {
public void run() {
ProgressPrecent.setValue(Producer.ProgressPercent);
}
};
if(EventQueue.isDispatchThread()) {
r.run();
}
else {
EventQueue.invokeLater(r);
}
}
}
我有两个课程共享队列。其中一个是Producer,它生成直到一个目标,另一个消耗这些元素。所有两个都扩展了Thread。我想向用户显示进度百分比,但它会冻结我的GUI,所以我该怎么办?
I have two classes that have a shared Queue. one of them is Producer that produces till a target other one consume those elements. all of two extends Thread. I want to display the progress percent to the user, but it freeze my GUI so what should I do?
推荐答案
-
工人主题
默认永远不会调用EventDispatchThread
,你有Swing中的Concurency
Worker Threads
by default never to invokedEventDispatchThread
, you have issue withConcurency in Swing
对Swing的所有更新GUI必须在EDT上完成
all updates to Swing GUI must be done on EDT
Runnable
可能是正确的方式,但ProgressPrecent .setValue(Producer.ProgressPercent);
必须包装在invokeLater
Runnable
could be proper way butProgressPrecent.setValue(Producer.ProgressPercent);
must be wrapped ininvokeLater
代码
SwingUtilities.invokeLater(new Runnable(){ public void run(){ ProgressPrecent.setValue(Producer.ProgressPercent); } });
- 删除EDT测试,
代码行
if(EventQueue.isDispatchThread()) { r.run(); }
工人线程
by defaut永远不会调用EDT,然后从EDT启动无关紧要,也不测试isDispatchThread()
不会让我有所作为Workers Thread
by defaut never ever to invoke EDT, then doesn't matter if is started from EDT, nor tested forisDispatchThread()
doesn't make me some sence-
永远不要在<$ c里面使用
Thread.sleep(int
) $ c> Swing Listeners ,因为导致了Swing GUI的崩溃
never ever, don't to use
Thread.sleep(int
) insideSwing Listeners
, because caused freeze Swing GUI too
我认为你可以使用这个职位的工作者也是
这篇关于如何从Thread更新java GUI?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!