2016-04-14 9 views
0

Jtableにデータを表示する方法。 jpcapパケットをキャプチャしたデータをJTableに表示するには、次のコードがあります。しかし、それは働かなかった。jpcapパケットキャプチャされたデータをJTableに表示するには?

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.sql.Connection; 
import java.sql.ResultSet; 
import java.sql.Statement; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.Vector; 

import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableModel; 

import net.sourceforge.jpcap.capture.PacketCapture; 
import net.sourceforge.jpcap.capture.PacketListener; 
import net.sourceforge.jpcap.net.ARPPacket; 
import net.sourceforge.jpcap.net.ICMPPacket; 
import net.sourceforge.jpcap.net.IPPacket; 
import net.sourceforge.jpcap.net.Packet; 
import net.sourceforge.jpcap.net.TCPPacket; 
import net.sourceforge.jpcap.net.UDPPacket; 

public class NetworkStatistics implements PacketListener{ 

public JFrame frmNmcidsNetworkStatistics; 
private Vector<String> row; 
    private Vector<Vector> rowData; 
    private Vector<String> columnNames; 
    private DefaultTableModel DFMO; 
    private JTable table; 
    private JScrollPane scrollPane; 
    private PacketCapture captureobj; 
private String filter = ""; 
private int totalpackets = -1; 

private static int counter = 0; 

/* 
* Create the application. 
*/ 
public NetworkStatistics() { 
    initialize(); 
} 

/* 
* Initialize the contents of the frame. 
*/ 
private void initialize() { 
    frmNmcidsNetworkStatistics = new JFrame(); 
    frmNmcidsNetworkStatistics.setTitle("NMCIDS: Network Statistics"); 
    frmNmcidsNetworkStatistics.setBounds(100, 100, 450, 300); 
    frmNmcidsNetworkStatistics.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    row = new Vector<String>(); 
     rowData = new Vector<Vector>(); 

     columnNames = new Vector<String>(); 
     columnNames.addElement("Sr. No"); 
     columnNames.addElement("Source IP"); 
     columnNames.addElement("Source MAC"); 
     columnNames.addElement("Destination IP"); 
     columnNames.addElement("Destination MAC"); 
     columnNames.addElement("Protocol"); 

     DFMO = new DefaultTableModel(rowData, columnNames); 
     table = new JTable(DFMO); 
     scrollPane = new JScrollPane(table); 
     frmNmcidsNetworkStatistics.getContentPane().add(scrollPane, BorderLayout.NORTH); 

} 

public void GetNetworkPackets(String capdev){ 
    try{ 
     captureobj = new PacketCapture(); 
     captureobj.open(capdev, true); 
     captureobj.setFilter(filter, true); 
     captureobj.addPacketListener(this); 
     captureobj.capture(totalpackets); 
    } 
    catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 

public void dispalyPacketsTable(int srno, String sip, String smac, String dip, String dmac, String proto){ 
    row.addElement(""+srno); 
     row.addElement(sip); 
     row.addElement(smac); 
     row.addElement(dip); 
     row.addElement(dmac); 
     row.addElement(proto); 
     rowData.addElement(row); 
     DFMO.fireTableDataChanged(); 
} 

@Override 
public void packetArrived(Packet pdata) { 
    counter++; 
    printdata(pdata); 
} 

public void printdata(Packet pdata){ 
    if(pdata instanceof TCPPacket){ 
      TCPPacket TCPO = (TCPPacket) pdata; 
      dispalyPacketsTable(counter, TCPO.getSourceAddress(), TCPO.getSourceHwAddress(), TCPO.getDestinationAddress(), TCPO.getDestinationHwAddress(), "TCP"); 
     } 
} 
} 

このコードを実行すると、プログラムがハングします。しかし、パケットキャプチャしたデータをプロンプトコマンドに表示したいときは、正しく表示されます。私を助けてください。前もって感謝します。

+0

変数名は大文字で始めるべきではありません。なぜ "DFMO"は違うのですか?一貫してください! – camickr

答えて

2

あなたのコードがイベントに応答からGUIを防ぐEvent Dispatch Thread(EDT)上で実行されているので、私はおそらく、このコード

を実行するとプログラムがハングアップします。

EDTをブロックしないように、パケットリスナーを別のスレッドで実行する必要があります。 Concurrency in SwingのSwingチュートリアルのセクションを読んでください。私はあなたがSwingWorkerを使用している必要があり、あなたはpublishの結果が得られるようになると思います。

+0

ありがとう@camickr –

関連する問題