java swingworker线程来更新主要的Gui

嗨编号想知道什么是从swingworkerthread添加文本到jtextarea的最佳方式,我创build了一个jbutton通过Threadsclass()调用execute()调用的另一个类。 并且线程与此代码并行运行

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

现在什么id喜欢做的是将x的值添加到主gui的文本区域,任何想法非常赞赏。

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 

看看发布和过程

根本的意图是,你只需要在Event Dispatching Thread中更新UI,通过publish方法将想要更新的数据传递给UI, SwingWorker会在EDT的上下文process为你调用process

doInBackground() ,使用publish(V... chunks)发送数据来process(List<V> chunks)

  • 请参阅SwingWorker如何工作 。