java - Swing Worker Delay -


i have button click event fire swing worker thread in return fire thread long calculation including writing file. file read draw graphics. drawing part never happens if don't add delay in between.. (it says file not found although file there..what better way fix without adding delay..

 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();     } } 

swing worker

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)     {       //       }         {         return null;     } }   @override protected void done() {     try {         //     } catch (exception e) {         //e.printstacktrace();     } } 

}

never, never, never call thread.sleep(...) on edt put entire gui sleep. , besides, if estimate wrong, , background process takes longer sleep delay time?

one possible solution add propertychangelistener swingworker , listen on "state" property swingworker.statevalue swingworker.statevalue.done, drawing.

e.g.

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(); 

so waits until swingworker has completed business before calling code inside of listener.

another option call holder.moltable1.drawmolviewpanel inside of swingworker's done() method, , work too, doing noted above propertychangelistener, swingworker doesn't have have knowledge code called in listener (as opposed using swingworker's done() method), , may allow looser coupling.


Comments

Popular posts from this blog

django - How can I change user group without delete record -

java - Need to add SOAP security token -

java - EclipseLink JPA Object is not a known entity type -