0

我正在使用 swingworker 执行长时间运行的任务。在该任务之间,我想在 TextArea 中显示文本。问题是我想在我使用 netbeans GUI 构建器创建的 textarea 中显示文本,但它不显示任何内容。这是我的主要代码

     public class SaveTraffic extends SwingWorker<Void, String> {



    @Override
    public Void doInBackground() throws IOException {


        while (f.num() !=2) {

            {

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

            }
        }

        return null;
      }//end main function


      @Override
      public void process(List<String> chunks) {
      for (String text : chunks) {

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

   }

这是我在 GUI 中的代码,尽管它在 showPacket 函数中连续打印数据包,但它在 textarea 中什么也不显示

     public void showPackets(String Packet)
     {

       jTextArea1.append(Packet);
     }


      private void jButton3MouseClicked(java.awt.event.MouseEvent evt) { 
      SaveTraffic p = new SaveTraffic();

      p.execute();

      }
4

1 回答 1

1

我对您的代码没有太多问题,但由于它不完整,我无法准确找到问题所在。你确定你的 SwingWorker 实际上是通过调用启动的execute()吗?你在日志中看到了什么?

在下面找到一个工作示例。尝试发现与您的代码的差异。如果您无法找到错误,请尝试发布SSCCE,以便我们为您提供帮助。

import java.util.List;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;

public class Test {

    private JFrame frame;
    private JTextArea textArea;

    protected void initUI() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        textArea = new JTextArea();
        frame.add(new JScrollPane(textArea));
        frame.setSize(400, 200);
        frame.setVisible(true);
        new SaveTraffic().execute();
    }

    protected void showPackets(String text) {
        textArea.append(text);
        textArea.append("\n");
    }

    class SaveTraffic extends SwingWorker<Void, String> {

        @Override
        public Void doInBackground() {
            for (int i = 0; i < 100; i++) {
                publish("Packet-" + i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

            return null;
        }

        @Override
        public void process(List<String> chunks) {
            for (String text : chunks) {
                showPackets(text);
            }
        }

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

        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Test().initUI();
            }
        });
    }

}
于 2012-05-21T06:30:13.267 回答