在我在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");
}
}
答案 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)
由于您的代码段太小而无法给出正确的答案,我可以想到:
当您进入jTextArea
的更新时,Packet
为空?你能检查一下。
调用此方法时jTextArea
上有任何文字吗?如果没有,Packet
为空,则不会看到任何结果。
编辑:根据评论:
虽然我希望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来附加文本