java swingworker线程更新主Gui
嗨,我想知道从SwingWorkerRead向jtextarea添加文本的最佳方式是什么。我创建了另一个类,jbutton通过Threadsclass()调用它。execute(); 线程与此代码并行运行java swingworker线程更新主Gui,java,swing,swingworker,Java,Swing,Swingworker,嗨,我想知道从SwingWorkerRead向jtextarea添加文本的最佳方式是什么。我创建了另一个类,jbutton通过Threadsclass()调用它。execute(); 线程与此代码并行运行 public class Threadsclass extends SwingWorker<Object, Object> { @Override protected Object doInBackground() throws Exception { for(int
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.");
}
}
公共类Threadsclass扩展SwingWorker{
@凌驾
受保护对象doInBackground()引发异常{
对于(int x=0;x<10;x++)
试一试{
System.out.println(“睡眠号码:+x”);
睡眠(1000);
}捕获(中断异常例外){
getLogger.getLogger(eftcespbillpaymentsThreads.class.getName()).log(Level.SEVERE,null,ex);
}
抛出新的UnsupportedOperationException(“尚未支持”);
}
}
现在,我想做的是将x的值添加到主gui上的文本区域,任何想法都值得赞赏。在其中,使用将数据发送到
- 看
- 有一个来自
类PrimeNumbersTask扩展
摇摆工人{
PrimeNumbersTask(JTextArea textArea,int numbersToFind){
//初始化
}
@凌驾
公共列表doInBackground(){
列表编号=新阵列列表(25);
而(!ough&&!isCancelled()){
number=nextPrimeNumber();
数字。添加(数字);
出版(编号);
setProgress(100*numbers.size()/numbersToFind);
}
返回号码;
}
@凌驾
受保护的无效进程(列表块){
for(整数:块){
textArea.append(数字+“\n”);
}
}
}
JTextArea textArea=新的JTextArea();
最终JProgressBar progressBar=新的JProgressBar(0,100);
PrimeNumberTask任务=新PrimeNumberTask(文本区域,N);
task.addPropertyChangeListener(
新属性ChangeListener(){
公共作废属性更改(属性更改事件evt){
if(“progress”.equals(evt.getPropertyName())){
progressBar.setValue((整数)evt.getNewValue());
}
}
});
task.execute();
System.out.println(task.get())//打印出我们所有的素数
看一看
基本意图是,您只需要在事件调度线程内更新UI,通过
publish
方法将要更新的数据传递给UI,SwingWorker
将在EDT的上下文中为您调用过程
,其中有一个例子就是这样做的:PrimeNumbersTask。关于如何设置SwingWorker的解释可能是最好的答案,不知道您为什么拒绝我的编辑。。现在返回数字
在doInBackground
之外,而受保护的无效进程(..){..}
在PrimeNumbersTask
之外,我在中读到get()
将冻结GUI/EDT
。这会是个问题吗?我还读到,人们通常会更改done()
,并在其中使用get()
,以避免冻结。JavaDoc页面中的示例没有直接解决冻结问题,因此当有人复制示例时,这可能会被忽略。@hamena314一般来说,是的,这是个坏主意。上面的示例实际上使用process方法来更新ui,该ui在EDT中调用
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