您好,我想知道从 swingworkerthread 向 jtextarea 添加文本的最佳方法是什么,我创建了另一个类,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
潜在的意图是,您需要仅在事件调度线程中更新 UI,方法是通过 publish
方法将要更新的数据传递给 UI,SwingWorker
将在 EDT 的上下文中为您调用 process
关于java swingworker 线程更新主 Gui,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16937997/