2014-10-21 3 views
-1

Я пытаюсь использовать SwinWorker для обновления одного TextArea со статусом выполнения одного метода actionPerform.Обновление JTextArea с SwingWorker

Я получаю различные образцы из Интернета, и ничто не работает из меня. Кто-нибудь может мне помочь?

ниже мой метод кнопки:

private void buttonActionPerformed(java.awt.event.ActionEvent evt) {             
     atualizaTextArea("", true); 
     button.setEnabled(false); 

     SearchDataBase cd = new SearchDataBase(); 
     textAreaField.setForeground(Color.BLUE); 
     try { 
      refreshTextArea("......Process Started......\n\n", true); 
      cd.search(); 
      String textt = textAreaField.getText(); 
      refreshTextArea("Finish\n\n", false); 
     } catch (Exception e) { 
      button.setEnabled(true); 
      StringWriter errors = new StringWriter(); 
      e.printStackTrace(new PrintWriter(errors)); 

      textAreaField.setText("Error - Contact the developer"); 
      textAreaField.setForeground(Color.red); 
     } 

     if (comboBoxSearchType.getSelectedIndex() == 1) { 
      try { 
       refreshTextArea("......History search started (too slow!!)......\n\n", false); 
       cd.searchHistoryTable(dateChoserPesquisa.getDate().getTime()); 
       refreshTextArea("Finish\n\n", false); 
      } catch (Exception e) { 
       button.setEnabled(true); 
       StringWriter errors = new StringWriter(); 
       e.printStackTrace(new PrintWriter(errors)); 

       textAreaField.setText("Error - Contact the developer"); 
       textAreaField.setForeground(Color.red); 
      } 
     } 
     refreshTextArea("...............Finish..............", false); 
     button.setEnabled(true); 
    } 

TextAreaAviso является JTextArea, что я пытаюсь обновить.

refreshTextArea (String, Boolean) является метод, который я создал, чтобы обновить JTextArea

private void refreshTextArea(String text, boolean rep) { 
     this.texttt = text; 
     this.replace = rep; 


     // define a SwingWorker to run in background 
     SwingWorker<String, String> worker = new SwingWorker<String, String>() { 
      @Override 
      public String doInBackground() { 
       String t = textAreaField.getText(); 
       if (replace) { 
        publish(texttt); 
        t = texttt; 
       } else { 
        publish(t + texttt); 
        t+= texttt; 
       } 
       System.out.println(texttt); 

       return ""; 
      } 

      @Override 
      protected void process(final List<String> chunks) { 
       for (String text : chunks) { 
        TextAreaAviso.setText(texttt); 
        System.out.println("HERE!!!!"); 
       } 
      } 

     }; 
     worker.execute(); 

     // (new AtualizaTextArea(TextAreaAviso, texto, replace)).execute(); 
    } 

В этом случае я создал весь процесс в рамках метода, но я попытался с помощью отделенного класса, как показано ниже:

private void refreshTextArea(String text, boolean rep) { 
     (new RefreshTextArea(TextAreaAviso, texto, replace)).execute(); 
} 

class RefreshTextArea extends SwingWorker<Integer, String> { 

    private JTextArea textArea; 
    private String texto; 
    private boolean replace; 

    public RefreshTextArea(JTextArea textArea, String texto, boolean replace) { 
     this.textArea = textArea; 
     this.texttt = texto; 
     this.replace = replace; 
    } 

    @Override 
    protected Integer doInBackground() throws Exception { 

     int i = 0; 
     String t = ""; 
     if (!replace) { 
      t = texttt + textArea.getText(); 
     } else { 
      t = texttt; 
     } 

     System.out.println(t); 
     publish(t); 

     return i; 
    } 

    @Override 
    protected void process(final List<String> chunks) { 
     for (String text : chunks) { 
      textArea.setText(texttt); 
     } 
    } 
} 

в обоих реализациях я попытался использовать и без выполнения REVALIDATE метода текстового поля. В обеих реализациях я попытался обновить значение textarea в методе doBackground и/или методе процесса.

+1

Этот код слишком длинный и труднодоступный, особенно потому, что многие из ваших переменных не находятся на английском языке. Пожалуйста, проверьте справочный центр на [Как спросить] (http://stackoverflow.com/help/how-to-ask) – durron597

+1

Получите текст из поля ПЕРЕД тем, как вы запустите работу, вы можете в конечном итоге с условием гонки в противном случае – MadProgrammer

+0

Я улучшил читабельность кода – user1352652

ответ

3

Вашего SwingWorker РЕКОМЕНДУЕМОГО не доступа или обновить JTextArea в вашей реализации doInBackground(). Вместо publish() промежуточные результаты и обновление JTextAreaтолько в process(). Более того, setText() будет иметь эффект замены существующего текста; вам может понадобиться append(). Полный пример показан here. Обратите внимание, что BackgroundTask имеет доступ к JTextArea в охватывающей области, но вы также можете передать его как параметр в SwingWorker.

+0

Я улучшил читабельность кода. Вы увидите, что я делаю все, что вы говорите (кроме использования метода append). – user1352652

+1

В вашем первом 'SwingWorker',' worker', invocation 'textAreaField.getText()' неправильно обращается к компоненту GUI из фонового потока. Ваша вторая, 'RefreshTextArea', выглядит правильно; непонятно, что не работает. Для получения более конкретных указаний, пожалуйста, отредактируйте свой вопрос, включив в него [полный пример] (http://stackoverflow.com/help/mcve), который фокусируется на эффекте, который вы хотите достичь. – trashgod

Смежные вопросы