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());
}
}