JTextArea不显示文本

时间:2012-05-20 15:49:59

标签: java swing jtextarea swingworker

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

   }

}

3 个答案:

答案 0 :(得分:6)

使用append()

而不是使用setText()

答案 1 :(得分:5)

你的问题是一个非常不完整的问题,一个没有足够的信息来提供答案,还有一个迫使我们猜测的问题,但基于原帖中的这一行:

  

连续调用该函数......

我猜,我会打赌,你有一个Swing线程问题。您可能希望阅读并使用SwingWorker。

从这里开始了解EDT和SwingWorkers:Concurrency in 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,了解更多详情。

答案 2 :(得分:2)

由于您的代码段太小而无法给出正确的答案,我可以想到:

  1. 当您进入jTextArea的更新时,Packet为空?你能检查一下。

  2. 调用此方法时jTextArea上有任何文字吗?如果没有,Packet为空,则不会看到任何结果。

  3. 编辑:根据评论:

    要使用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 Eels你可能有一个Swing线程问题,或者只是使用append来附加文本