我正在使用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();
}
答案 0 :(得分:1)
我的代码没有太多问题,但由于它没有完整,我无法准确定位问题。您是否通过致电execute()
确保实际启动了SwingWorker?您在日志中看到了什么?
在下面找到一个有效的例子。尝试发现与您的代码的差异。如果您无法找到错误,请尝试发布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();
}
});
}
}