Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java swingworker线程更新主Gui_Java_Swing_Swingworker - Fatal编程技术网

java swingworker线程更新主Gui

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

嗨,我想知道从SwingWorkerRead向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.");
}

}
公共类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