2012-05-20 2 views
4

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

 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"); 

    } 

}

+0

Похоже, что более длинный фрагмент кода может оказаться полезным. – AlexR

+0

Пожалуйста, дайте нам дополнительную информацию - достаточно, чтобы нам не приходилось все догадываться. –

+0

В вашем новом коде ваш метод 'sendPacket (...)' должен быть 'showPackets (...)'? Если нет, то где вы называете 'showPackets (...)'? Вы знаете, что 'sendPacket (...)' вызывается из вашего фонового потока, и если вы пытаетесь записать его в JTextArea, то да, у вас проблема параллелизма. –

ответ

5

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

Функция называется непрерывно ...

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

Начать здесь, чтобы узнать об EDT и SwingWorkers: Concurrency in 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 для получения более подробной информации по этому вопросу.

+0

Я использую swingworker для других задач в моем коде, но в моей этой функции, где я хочу отображать текст в текстовой области, я только что написал эту одну строку кода – Xara

+0

@ Zara: t сказать нам достаточно, чтобы иметь возможность дать вам больше, чем глупые [email protected] ssed догадки. Почему ты не говоришь нам больше? –

+1

Хорошо, я редактирую свой пост через минуту для уточнения – Xara

6

Вместо использования SetText() использовать Append()

+0

Что произойдет, если он добавит, вместо того, чтобы вставлять текст PLUS в предыдущий текст. Это то, что делает append. Он изобретает колесо здесь с этим методом. – OmniOwl

+1

А, да, вы правы. Спасибо за разъяснения. Я удалю свой комментарий и проголосую за вас. –

+0

good catch :) +1 – mprabhat

2

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

  1. Когда вы в обновлении jTextArea, Packet равно нулю? Вы можете это проверить.

  2. При вызове этого метода jTextArea есть текст на нем? Если ни один и Packet не имеют значения, вы не увидите никакого результата.

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

добавить текст использования append, также прочитать tutorial

Хотя я ожидал бы 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 Угри, что вы можете иметь качели продевал I ssue или просто использовать append для добавления текста

+0

Когда я беру распечатку из Пакета, он непрерывно отображает полную строку ... – Xara

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