JButton не работает [захватить сетевой трафик]

Мой код, который должен захватывать сетевой трафик и отображать его в текстовой области, но он этого не делает. Пожалуйста, посмотрите на код и проверьте, нужно ли вносить какие-либо исправления.

public class NewClass {

    public static JTextArea textarea = new JTextArea();

    NewClass() throws IOException{

        JButton capture = new JButton("Capture");
        JFrame frame = new JFrame();        
        JScrollPane scroll;
        NetworkInterface[] NI= JpcapCaptor.getDeviceList();
        int INDEX=0;
        JpcapCaptor JPCAP = JpcapCaptor.openDevice(NI[INDEX], 65536, false, 20);

        frame.setSize(700,500);
        frame.setLocation(200,200);
        frame.getContentPane().setLayout(null);
        frame.setBackground(Color.yellow);        

        textarea.setEditable(false);
        textarea.setFont(new Font("Tahoma",0,14));
        textarea.setForeground(Color.RED);
        textarea.setLineWrap(true);
        //textarea.setBackground(Color.WHITE);

        scroll = new JScrollPane();
        scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        scroll.setViewportView(textarea);

        frame.getContentPane().add(scroll);
        scroll.setBounds(10,16,740,290);

        capture.setBackground(Color.RED);
        capture.setForeground(Color.GREEN);
        frame.getContentPane().add(capture);

        handler ob = new handler();
        capture.addActionListener(ob);
        capture.setBounds(100, 400, 90, 25);

        frame.setVisible(true);
    }

    public class handler implements ActionListener{
        public void actionPerformed(ActionEvent Event){

            class Print implements PacketReceiver{
                public void receivePacket(Packet packet){
                    String info = packet.toString();
                    textarea.append(info);
                    //System.out.println(packet.toString());
                }                    
            }
    }
}

2 ответа

Мой код, который должен захватывать сетевой трафик и отображать его в текстовой области, но он этого не делает. Пожалуйста, посмотрите на код и проверьте, нужно ли вносить какие-либо исправления.

Ну, во-первых, метод actionPerformed вашего обработчика на самом деле ничего не делает. Он определяет внутренний класс, но не создает объектов этого класса и ничего с ним не делает:

public class handler implements ActionListener {
  public void actionPerformed(ActionEvent Event) {
     class Print implements PacketReceiver {
        public void receivePacket(Packet packet) {
           String info = packet.toString();
           textarea.append(info); // System.out.println(packet.toString());
        }
     }
  }
}

Подумайте о создании объекта вашего класса Print (ужасное имя для класса, поскольку уже существует класс Print, который является частью основных библиотек Java), и заставьте этот объект Print делать что-то полезное, возможно, получать пакеты (однако это должно быть сделано).). Будьте осторожны, чтобы не выполнять долго выполняющиеся процессы в основном потоке Swing, EDT, иначе вы заморозите свой Swing GUI.

редактировать
например,

// note that class names such as "Handler" should begin with a capital letter.
public class Handler implements ActionListener {
  public void actionPerformed(ActionEvent Event) {
     class Print implements PacketReceiver {
        public void receivePacket(Packet packet) {
           String info = packet.toString();
           textarea.append(info); // System.out.println(packet.toString());
        }
     }

     // create a Print instance so that it can do something:
     final Print myPrint = new Print();

     // do something with myPrint here so that it gets packets and displays them
     // I suspect that you'll likely want to do this in a background thread
     // using a SwingWorker
  }
}

Как сказал Ховеркрафт, вы ничего не делаете, кроме определения внутреннего класса. здесь вам не хватает вызова processPacket() или loopPacket() из вашего класса JPCAP. так что я предлагаю следующее:

public class handler implements ActionListener{
  public void actionPerformed(ActionEvent Event){

    class Print implements PacketReceiver{
        public void receivePacket(Packet packet){
            String info = packet.toString();
            textarea.append(info);                                            
        }

    }

    // this captures 10 packets .
    JPCAP.processPacket(10,new Print());
  }
}
Другие вопросы по тегам