java - SwingWorker worker with SerialEvent( apped to JTextField ) -


i trying make serialmonitor in java , stuck. try apped text(serial input) jtextarea. tryed using swingworker , had succes not enoughf.

i have event(serialeventlistener) wich reads input data. in event trying append incoming data jtextarea wich declared in class , append method wont work. i've read should not work , need use swingworker , did. problem executing process of swingworker starts if give command execute in button event. in conclusion want execute swingworker rutine data serial port. example: serialevent(a data in arrived) -> appedrutine(swingworker) -> finish code:

the class holds graphic components: centerpanel

import java.awt.borderlayout; import java.awt.color; import java.awt.dimension; import java.awt.gridbagconstraints; import java.awt.gridbaglayout; import java.awt.insets; import java.awt.event.actionevent; import java.awt.event.actionlistener; import javax.swing.boxlayout; import javax.swing.jbutton; import javax.swing.jpanel; import javax.swing.jscrollpane; import javax.swing.jtabbedpane; import javax.swing.jtextarea; import javax.swing.border.titledborder;   public class centerpanel implements actionlistener{  private jtabbedpane tabbed_pane = new jtabbedpane(); public jpanel tab_source    = new jpanel(); public jpanel tab_graphical = new jpanel(); private updatedata updatetext_method; private jtextarea data_content = new jtextarea(); private jbutton freeze, clear, reload;  public centerpanel(){      tabbed_pane.setborder(new titledborder("data visualization"));      freeze = new jbutton("freeze");     freeze.addactionlistener(this);      clear  = new jbutton("clear");     clear.addactionlistener(this);      reload = new jbutton("reload");     reload.addactionlistener(this);      boxlayout box_layout = new boxlayout(tab_source,boxlayout.y_axis);     tab_source.setlayout(box_layout);      data_content.seteditable(false);     data_content.setforeground(color.white);     data_content.setbackground(color.dark_gray);      tab_source.add(new jscrollpane(data_content));      jpanel temp_panel = new jpanel(new gridbaglayout());     gridbagconstraints c = new gridbagconstraints();      temp_panel.setborder(new titledborder("data control"));     temp_panel.setpreferredsize(new dimension(mainframe.window_width,(int)(mainframe.window_height*0.07)));     temp_panel.setmaximumsize(new dimension(mainframe.window_width,  (int)(mainframe.window_height*0.12)));      c.gridx = 0;     c.insets = new insets(0,8,8,0);      temp_panel.add(freeze,c);     c.gridx = 1;     temp_panel.add(clear,c);     c.gridx = 2;     temp_panel.add(reload,c);      tab_source.add(temp_panel,borderlayout.line_end);      tabbed_pane.addtab("text mode",tab_source);     tabbed_pane.addtab("graphic mode",tab_graphical);  }  public jtabbedpane gettabs(){      return tabbed_pane;  }  public void updatedata(){       updatetext_method = new updatedata(data_content);      updatetext_method.execute();  }  @override public void actionperformed(actionevent event) {      if(event.getsource() == clear){          updatedata();      }  }  } 

here serialmonitor class(reads serial port)

import java.io.ioexception; import java.io.inputstream; import java.io.outputstream; import javax.comm.commportidentifier; import javax.comm.serialport; import javax.comm.serialportevent; import javax.comm.serialporteventlistener; import javax.swing.joptionpane;   public class serialmonitor implements serialporteventlistener {  private static commportidentifier pid; private static serialport port; private inputstream inputstream; private static outputstream outputstream; public static int data ;   public void openport(string portname, int baudrate){      system.out.println(new string(""+ baudrate + "xx" +portname));     try {           pid=commportidentifier.getportidentifier(portname);           port=(serialport)pid.open("owner",2000);          port.setserialportparams(baudrate, serialport.databits_8, serialport.stopbits_1, serialport.parity_none);          outputstream=port.getoutputstream();          inputstream=port.getinputstream();          port.addeventlistener(this);          port.notifyondataavailable(true);       } catch (exception e) {          e.printstacktrace();          joptionpane.showmessagedialog(new frame("info"), "connection problems!");}    }  public void closeport(string mesaj){      try{          port.close();        } catch (exception e) {joptionpane.showmessagedialog(new frame("info"), "connection problems!");}  }  @override public void serialevent(serialportevent se) {      try {          inputstream=port.getinputstream();      } catch (exception e) {          joptionpane.showmessagedialog(new frame("info"), "connection problem! cant read data quadcopter");     }      if (se.geteventtype()==serialportevent.data_available) {          try         {             while ( ( data = inputstream.read()) > -1 ){                system.out.println(data);                {                   //this want make update                  //something centerpanel_obj.updatadata()                  //               }               }          }         catch ( ioexception e )         {             e.printstacktrace();             system.exit(-1);         }      }    }      } 

here updatadata class(where swingworker is)

import java.util.list; import javax.swing.jtextarea; import javax.swing.swingworker;  public class updatedata extends swingworker<integer, string> {  private final jtextarea messagestextarea;  public updatedata(final jtextarea messagestextarea) { this.messagestextarea = messagestextarea; }   @override  protected integer doinbackground() throws exception {  int i;   ( = 0; i<50; i++)      publish(new string(""+i));   return 1;  }  @override protected void process(final list<string> chunks) {  (final string string : chunks) {   messagestextarea.append(string);   messagestextarea.append("\n");   } } 

}

note: accept every critic regarding code , description if have some...dont shy. thank you!

there's lot work on. i'll give basics.

everything end user in application runs on single thread - event dispatch thread (edt) - unless intentionally put on different thread. if user clicks button, , start doing takes while, ui freeze until you're done.

the simple way of getting around start new thread work.

but... have consider any ui updates have done on edt (oh, nos!). swingutilities.invokelater(runnable dorun) created can put process in queue run on edt.

swingworker's job make whole rigamarole easier. provides interface 1) executing code in thread off of edt , 2) executing code in thread in edt (after first thread finishes)


now, here few things unclear question:

  • serialmonitor isn't part of code - i'm not sure want it
  • it's unclear whether want user action trigger update of ui or if event (communication) on serial port should trigger update

if serialmonitor executing on own thread (not on edt), assume has be, whenever need update ui, wrap call this:

swingutilities.invokelater(new runnable(){      @override     public void run() {         //insert code update ui here     } }); 

granted need give serialmonitor access ui piece update.


Comments

Popular posts from this blog

php - Calling a template part from a post -

Firefox SVG shape not printing when it has stroke -

How to mention the localhost in android -