首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swing Worker延迟

Swing Worker延迟
EN

Stack Overflow用户
提问于 2012-06-10 20:50:22
回答 1查看 862关注 0票数 2

我有一个按钮点击事件,它将触发一个swing工作线程,作为回报,它将触发另一个线程来执行长时间的计算,包括写一个文件。然后读取该文件以绘制一些图形。但是,如果我不在其间添加延迟,则绘制部分永远不会发生。(它显示找不到文件,尽管文件是there..What是修复此问题的更好方法,而不增加延迟。

代码语言:javascript
复制
 private void buttonFragmentActionPerformed(java.awt.event.ActionEvent evt) {                                               
    try
    {
        ESIPlusFragmenterWorker epfw = new ESIPlusFragmenterWorker(10, sdfFile, cidSpectrum);
        epfw.execute();

        Thread.sleep(1000);

        holder.molTable1.drawMolViewPanel(currDir+sep+"esiFragments"+sep+"esiFrag.sdf");
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

摆动工人

代码语言:javascript
复制
public class ESIPlusFragmenterWorker extends SwingWorker<Void, Void>{

int mzppm_;
String SDF_;
String spectrum_;
Double mion_;
MolTable holder_;

ESIPlusFragmenterWorker(int mzppm, String SDF, String spectrum)
{
    mzppm_ = mzppm;
    SDF_ = SDF;
    spectrum_ = spectrum;
}

@Override
protected Void doInBackground() {
    try
    {
    Molecule mol;
    MolImporter importer = new MolImporter(SDF_);
    ExecutorService te = Executors.newFixedThreadPool(1);
    while ((mol  = importer.read()) != null) 
    {
     Runnable epf = new ESIPlusFragmenter(mol, spectrum_, mzppm_);
     Thread t = new Thread(epf);
     te.execute(epf);
    }
    importer.close();
    te.awaitTermination(10, TimeUnit.MINUTES);
    }
    catch (Exception e)
    {
      //  
    }
    finally
    {
        return null;
    }
}


@Override
protected void done() {
    try {
        //
    } catch (Exception e) {
        //e.printStackTrace();
    }
}

}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-10 20:52:46

永远,永远,永远不要在EDT上调用Thread.sleep(...),因为这会使整个图形用户界面进入睡眠状态。此外,如果你估计错误,后台过程比你的睡眠延迟时间更长怎么办?

一种可能的解决方案是将状态添加到SwingWorker中,并侦听“SwingWorker.StateValue”属性以将状态设置为SwingWorker.StateValue.DONE,然后进行绘制。

例如:

代码语言:javascript
复制
private void buttonFragmentActionPerformed(java.awt.event.ActionEvent evt) {
  try {
     ESIPlusFragmenterWorker epfw = new ESIPlusFragmenterWorker(10,
           sdfFile, cidSpectrum);
     epfw.addPropertyChangeListener(new PropertyChangeListener() {

        @Override
        public void propertyChange(PropertyChangeEvent pcEvt) {
           if ("state".equals(pcEvt.getPropertyName())) {
              if (pcEvt.getNewValue().equals(SwingWorker.StateValue.DONE)) {
                 holder.molTable1.drawMolViewPanel(currDir + sep
                       + "esiFragments" + sep + "esiFrag.sdf");
              }
           }
        }
     });
     epfw.execute();

因此,它所做的就是等待SwingWorker完成其业务,然后再调用侦听器内部的代码。

另一种选择是在SwingWorker的done()方法中调用holder.molTable1.drawMolViewPanel,这也是可行的,但通过使用上面提到的PropertyChangeListener,SwingWorker不必了解在侦听器中调用的代码(与使用SwingWorker的done()方法相反),这可以实现更松散的耦合。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10968846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档