Search code examples
javaswingswingworker

java swingworker thread to update main Gui


hi id like to know whats the best way to add text to a jtextarea from a swingworkerthread, ive created another class which a jbutton calls by Threadsclass().execute(); and the thread runs in parallel fine with this code

public class Threadsclass extends SwingWorker<Object, Object> {


@Override
protected Object doInBackground() throws Exception {
    for(int x = 0; x< 10;x++)
        try {
            System.out.println("sleep number :"+ x);



        Thread.sleep(1000);
    } catch (InterruptedException ex) {
        Logger.getLogger(eftcespbillpaymentsThreads.class.getName()).log(Level.SEVERE, null, ex);
    }
    throw new UnsupportedOperationException("Not supported yet.");
}

}

now what id like to do is add the value of x to the text area on the main gui, any ideas much appreciated.


Solution

  • There is an excellent example from the JavaDocs

    class PrimeNumbersTask extends
            SwingWorker<List<Integer>, Integer> {
    
        PrimeNumbersTask(JTextArea textArea, int numbersToFind) {
            //initialize
        }
    
        @Override
        public List<Integer> doInBackground() {
            List<Integer> numbers = new ArrayList<Integer>(25);
            while (!enough && !isCancelled()) {
                number = nextPrimeNumber();
                numbers.add(number);
                publish(number);
                setProgress(100 * numbers.size() / numbersToFind);
            }
    
            return numbers;
        }
    
        @Override
        protected void process(List<Integer> chunks) {
            for (int number : chunks) {
                textArea.append(number + "\n");
            }
        }
    }
    
    JTextArea textArea = new JTextArea();
    final JProgressBar progressBar = new JProgressBar(0, 100);
    PrimeNumbersTask task = new PrimeNumbersTask(textArea, N);
    task.addPropertyChangeListener(
     new PropertyChangeListener() {
         public  void propertyChange(PropertyChangeEvent evt) {
             if ("progress".equals(evt.getPropertyName())) {
                 progressBar.setValue((Integer)evt.getNewValue());
             }
         }
     });
    
    task.execute();
    System.out.println(task.get()); //prints all prime numbers we have got
    

    Take a look at publish and process

    The underlying intention is that you need to update the UI from only within the Event Dispatching Thread, by passing the data you want to updated to the UI via the publish method, SwingWorker will call process for you within the context of the EDT