2013-06-05 3 views
4

hi id хотел бы знать, как лучше всего добавить текст в jtextarea из swingworkerthread, и создал другой класс, который jbutton вызывает Threadsclass(). Execute(); и нить проходит параллельно штрафа с этим кодомjava swingworker thread to update main Gui

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."); 
} 

} 

что теперь ид нравится сделать, это добавить значение х в текстовой области на главном графическом интерфейсе, любые идеи оценены.

+2

[javadoc] (http://docs.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html) имеет пример, выполняющий именно это: PrimeNumbersTask. –

ответ

7

Существует отличный пример из 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 

Посмотрите на publish и process

Основополагающий намерения является то, что вам нужно обновить пользовательский интерфейс с только в Event Диспетчерская тему , передав данные, которые вы хотите обновить до пользовательского интерфейса, с помощью метода publish, SwingWorker вызовет process для вас в контексте EDT

+0

В приведенном выше коде, где определены «числа»? – dgorissen

+0

В любом месте, которое вы хотите;) – MadProgrammer

+0

Не знаете, почему вы отклонили мое редактирование .. прямо сейчас 'return numbers;' находится за пределами 'doInBackground', а' protected void process (..) {..} 'находится вне класс «PrimeNumbersTask» – Marc