JTextArea не отображает текст

В моей функции для отображения текста в textarea, я написал следующие строки кода, но он не отображает текст

        jTextArea1.setText( Packet +"\n" +jTextArea1.getText());

Я использую SwingWorker для выполнения фоновой задачи, вот мой код

public class SaveTraffic extends SwingWorker<Void, Void> {


public GUI f = new GUI();

@Override
public Void doInBackground() throws IOException {
              //some code
              sendPacket(captor.getPacket().toString()); 
              return null;
             }//end main function

@Override
public void done() {
    System.out.println("I am DONE");

}


public void sendPacket(String Packet) {

 f.showPackets(Packet);
}

}

и следующие строки кода, которые я написал в форме GUI

 public  void showPackets(String Packet) {

 jTextArea1.append( Packet);

}

Решение:          открытый класс SaveTraffic расширяет SwingWorker {

     public GUI f = new GUI();

     @Override
    public Void doInBackground() throws IOException {
    f.add(jTextPane1);
   // some code

   publish(captor.getPacket().toString());

   // the method below is calling sendPacket on the background thread
   // which then calls showPackets on the background thread
   // which then appends text into the JTextArea on the background thread
  //sendPacket(captor.getPacket().toString());

    return null;
   }

  @Override
   protected void process(List<String> chunks) {
   for (String text : chunks) {
     jTextPane1.setText(text);
     f.showPackets(text);
   }
  }

  @Override
  public void done() {
   System.out.println("I am DONE");

   }

}

 AlexR20 мая 2012 г., 17:51
Кажется, что более длинный фрагмент кода может быть полезным.
 Hovercraft Full Of Eels20 мая 2012 г., 17:55
Пожалуйста, дайте нам больше информации - достаточно, чтобы нам не приходилось догадываться.
 Hovercraft Full Of Eels20 мая 2012 г., 18:43
В вашем новом коде вашsendPacket(...) вызов метода должен бытьshowPackets(...)? Если нет, куда вы звонитеshowPackets(...)? Ты знаешь чтоsendPacket(...) вызывается из фонового потока, и если именно здесь вы пытаетесь записать в свою JTextArea, то да, у вас возникла проблема с параллелизмом.
 Hovercraft Full Of Eels20 мая 2012 г., 18:46
И еще 1+ для редактирования, мы почти получили достаточно информации ... но не совсем.
 Hovercraft Full Of Eels20 мая 2012 г., 18:47
ОК, я прав. Это означает, что вы выполняете вызовы Swing из фонового потока, и ваши проблемы с параллелизмом. Подождите, и я покажу вам возможное решение, используя публикацию и обработку.

Ответы на вопрос(2)

Решение Вопроса

у которого недостаточно информации, чтобы дать ответ, и который заставляет нас догадываться, но основанный на этой строке в вашем оригинальном посте:

The function is called continuously ...

Я догадываюсь, и я поставлю деньги на то, что у вас возникла проблема с многопоточностью Swing. Возможно, вы захотите прочитать и использовать SwingWorker.

Начните здесь, чтобы узнать об EDT и SwingWorkers:Параллелизм в Swing.

Да, у вас проблема с параллелизмом в Swing, вызванная тем, что вы выполняете вызовы Swing из фонового потока. Чтобы избежать этого, вам нужно экспортировать данные из doInBackground и вызвать их в потоке событий Swing. Один из способов сделать это - через пару методов публикации / процесса:

public class SaveTraffic extends SwingWorker<Void, String> {

  public GUI f = new GUI();

  @Override
  public Void doInBackground() throws IOException {

     // some code

     publish(captor.getPacket().toString());

     // the method below is calling sendPacket on the background thread
     // which then calls showPackets on the background thread
     // which then appends text into the JTextArea on the background thread
     //sendPacket(captor.getPacket().toString());

     return null;
  }

  @Override
  protected void process(List<String> packetTextList) {
     for (String packetText : packetTextList) {
        sendPacket(packetText); //edit, changed to match your code
     }
  }

  @Override
  public void done() {
     System.out.println("I am DONE");

  }

  public void sendPacket(String Packet) {

     f.showPackets(Packet);
  }
}

Обратитесь к учебнику, на который я ссылался выше, и к SwingWorker API, чтобы узнать больше об этом.

 20 мая 2012 г., 18:13
Очень действительная точка +1
 Xara20 мая 2012 г., 17:56
Я использую Swingworker для других задач в моем коде, но в моей функции this, где я хочу отображать текст в текстовой области, я только что написал эту одну строку кода
 20 мая 2012 г., 19:18
@Zara: вам, вероятно, нужно изменить общие параметры SwingWorker. Обратите внимание, что в моем примере вторым параметром является не Void, а String, потому что это то, что публикует и обрабатывает. Пожалуйста, прочитайте учебник по SwingWorker, так как он там все объяснен.
 Xara20 мая 2012 г., 17:59
Хорошо, я редактирую свой пост через минуту для дальнейшего уточнения
 20 мая 2012 г., 17:58
@ Зара: ты все еще не сказал нам достаточно, чтобы иметь возможность дать тебе больше, чем просто глупые догадки. Почему ты не говоришь нам больше?

чтобы дать правильный ответ, я могу подумать:

When you are inside the update of jTextArea, Packet is null? Can you check that.

While calling this method is jTextArea has any text on it ? If none and Packet is null you wont see any result.

Редактировать: согласно комментарию:

Для добавления текста используйтеприсоединятьТакже прочитайтеруководство

Хотя я бы ожидалsetText чтобы показать текст хотя бы в первый раз, см. ниже минимальный пример кода:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class TestJTextArea {
    static void init() {
        JFrame frame = new JFrame();
        frame.setLayout(new BorderLayout());
        final JTextArea textArea = new JTextArea();
        frame.add(textArea, BorderLayout.NORTH);
        final JTextField textField = new JTextField();
        frame.add(textField,BorderLayout.CENTER);
        JButton button = new JButton("Add");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                textArea.setText(textField.getText());
            }
        });
        frame.add(button,BorderLayout.SOUTH);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        init();
    }
}

И с этим я также согласен с @Hovercraft Full Of Eels, что у вас может быть проблема с многопоточностью Swing, или просто используйте append для добавления текста

 Xara20 мая 2012 г., 17:57
Когда я вынимаю распечатку из пакета, она непрерывно отображает полную строку ...

Ваш ответ на вопрос