您好,我想知道从swingworkerthread向jtextarea添加文本的最佳方法是什么,我创建了另一个类,Threadsclass()。execute()调用了jbutton。并且线程与此代码并行运行
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
看一下发布和处理
潜在的意图是,您仅需要从事件调度线程中更新UI,通过将要更新的数据通过方法传递到UI publish,SwingWorker将process在EDT上下文中要求您
publish
SwingWorker
process