Multithreading 使用实时捕获的数据包信息(使用jNetPcap)更新JList会导致列表空白

Multithreading 使用实时捕获的数据包信息(使用jNetPcap)更新JList会导致列表空白,multithreading,jlist,jnetpcap,Multithreading,Jlist,Jnetpcap,我编码的应用程序,这是捕获数据包从2个NI卡在同一时间在特定的线程为他们 我正在使用jnetPcap,并在jpackethanler的方法nextPacket中获取捕获的数据包。我需要在JList中显示当前数据包的信息,但当我仅使用defaultListModel并编写model1.addElement(packetinfo)时,JList会随机变为空白 我的代码: new Thread(){ @Override public void run(){ StringBu

我编码的应用程序,这是捕获数据包从2个NI卡在同一时间在特定的线程为他们

我正在使用jnetPcap,并在jpackethanler的方法nextPacket中获取捕获的数据包。我需要在JList中显示当前数据包的信息,但当我仅使用defaultListModel并编写model1.addElement(packetinfo)时,JList会随机变为空白

我的代码:

new Thread(){

    @Override
    public void run(){

    StringBuilder errbuf = new StringBuilder(); // For any error msgs

    int snaplen = 64 * 1024;           // Capture all packets, no trucation  
    int flags = Pcap.MODE_PROMISCUOUS; // capture all packets  
    int timeout = 10 * 1000;           // 10 seconds in millis

    Pcap pcap1 =  
        Pcap.openLive(Variables.getDevice1().getName(), snaplen, flags, timeout, errbuf);  

    if (pcap1 == null) {  
        System.err.printf("Error while opening device for capture: "  
            + errbuf.toString());  
        return;  
    }

    PcapPacketHandler<String> jpacketHandler1 = new PcapPacketHandler<String>() {  

        int count = 1;

        @Override
        public void nextPacket(PcapPacket packet, String user) {  

            // ALL PACKETS FROM DEVICE 1 HERE
            int packetSize = packet.size();
            int packetCount = count++;

            String desc = String.format("No.: %15d | HDRSize : %-4d", packetCount,packetSize);

            device1Model.addElement(desc); // this adds desc to JLIST

        }
    };  

    pcap1.loop(Pcap.LOOP_INFINITE, jpacketHandler1, "");
    pcap1.close();

    }
}.start();
新线程(){
@凌驾
公开募捐{
StringBuilder errbuf=new StringBuilder();//对于任何错误msgs
int snaplen=64*1024;//捕获所有数据包,无指令
int flags=Pcap.MODE\u PROMISCUOUS;//捕获所有数据包
int timeout=10*1000;//以毫秒为单位的10秒
Pcap pcap1=
openLive(Variables.getDevice1().getName()、snaplen、标志、超时、errbuf);
如果(pcap1==null){
System.err.printf(“打开设备进行捕获时出错:”
+errbuf.toString());
回来
}
PcapPacketHandler jpacketHandler1=新的PcapPacketHandler(){
整数计数=1;
@凌驾
public void nextPacket(PcapPacket数据包,字符串用户){
//这里有来自设备1的所有数据包
int packetSize=packet.size();
int packetCount=count++;
String desc=String.format(“编号:%15d | HDRSize:%-4d”,packetCount,packetSize);
device1Model.addElement(desc);//这会将desc添加到JLIST中
}
};  
pcap1.loop(Pcap.loop_INFINITE,jpacketHandler1,“”);
pcap1.close();
}
}.start();
您所做的更改将更加平滑,同时不会出现数据包松动。因为我需要捕捉应用程序正确功能的每个数据包

多谢各位