4

テキストエリアにテキストを表示する関数で、次のコード行を書きましたが、テキストが表示されません

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

}

解決策: public class SaveTraffic extends 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");

   }

}

4

3 に答える 3

6

setText() を使用する代わりに、append() を使用します

于 2012-05-20T15:51:16.950 に答える
5

あなたの質問は非常に不完全で、回答を可能にするのに十分な情報がなく、推測せざるを得ない質問ですが、元の投稿の次の行に基づいています。

関数は連続して呼び出されます...

あなたが Swing スレッドの問題を抱えていることは間違いありません。おそらく、SwingWorker を読んで使用することをお勧めします。

ここから始めて、EDT と SwingWorkers: Concurrency in Swingについて学びます。

はい、あなたの問題は、バックグラウンド スレッド内から Swing 呼び出しを行うことによって引き起こされる Swing 同時実行の問題です。これを回避するには、doInBackground からデータをエクスポートし、Swing イベント スレッドで呼び出す必要があります。これを行う 1 つの方法は、publish/process メソッドのペアを使用することです。

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 を確認してください。

于 2012-05-20T15:52:39.793 に答える
2

あなたのコード スニペットは小さすぎて正しい答えを出すことができないので、次のように考えることができます。

  1. の更新内にいる場合jTextAreaPacketnull ですか? それを確認できますか。

  2. このメソッドを呼び出している間jTextArea、何かテキストがありますか? none でPacketnull の場合、結果は表示されません。

編集:コメントによると:

テキストを追加するにはappendを使用し、チュートリアルも読んでください

少なくとも最初はテキストを表示することを期待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 を使用してテキストを追加する可能性があります。

于 2012-05-20T15:55:21.370 に答える