This Java swing application works, but there is a problem. The Jpcap Class JPcapCaptor loopPacket method and its PacketReceiver callback receivePacket method block the swing event dispatching thread. I need to move them to a separate thread, a worker thread (preferably a SwingWorker worker thread). Ok, I give up! After several hours of looking on the internet to see how to use SwingWorker to implement a worker thread, I cam away as confused as when I began. This is probably a "no brainer" for must java developers, but for a beginning developer it is extremely confusing. I will sure appreciate it if someone can show me how to do this.
class FileMenu extends Menu { public FileMenu(JpcapPacketCapture mw) { super("File");
jpcapPacketCapture = mw; MenuItem mi;
add(mi = new MenuItem("Start Capure")); mi.addActionListener ( new ActionListener() { public void actionPerformed(ActionEvent e) { StartCapture(); } } );
add(mi = new MenuItem("Stop Capure")); mi.addActionListener ( new ActionListener() { public void actionPerformed(ActionEvent e) { StopCapture(); } } );
add(mi = new MenuItem("Clear Window")); mi.addActionListener ( new ActionListener() { public void actionPerformed(ActionEvent e) { textArea.setText(""); } } );
add(mi = new MenuItem("Print Window")); mi.addActionListener ( new ActionListener() { public void actionPerformed(ActionEvent e) { PrintWindow(); } } );
add(mi = new MenuItem("Exit")); mi.addActionListener ( new ActionListener() { public void actionPerformed(ActionEvent e) { System.exit(0); } } ); } }
class HelpMenu extends Menu { public HelpMenu(JpcapPacketCapture mw) { super("Help"); jpcapPacketCapture = mw; MenuItem mi;
add(mi = new MenuItem("About...")); mi.addActionListener ( new ActionListener() { public void actionPerformed(ActionEvent evt) { JOptionPane.showMessageDialog(frame, "Jpcap Packet Capture Version 1.00 \n" + "Copyright (C) 2008 SHP Consulting & Systems \n\n" + "This progoram uses Jpcap to capture packets for one of this system's \n" + "network interfaces. The specific network interface to capture packets \n" + "for is provided by the user through a program selection dialog. \n\n", "About...", JOptionPane.INFORMATION_MESSAGE, new ImageIcon(logoLarge.getImage())); } } ); } }
public void addButtons(JToolBar toolBar) { JButton toolbarButtons = null;
toolbarButtons = new JButton(new ImageIcon(start.getImage())); toolbarButtons.setToolTipText("Start capture."); toolbarButtons.addActionListener ( new ActionListener() { public void actionPerformed(ActionEvent e) { StartCapture(); } } ); toolBar.add(toolbarButtons);
toolbarButtons = new JButton(new ImageIcon(stop.getImage())); toolbarButtons.setToolTipText("Stop capture."); toolbarButtons.addActionListener ( new ActionListener() { public void actionPerformed(ActionEvent e) { StopCapture(); } } ); toolBar.add(toolbarButtons);
toolbarButtons = new JButton(new ImageIcon(clear.getImage())); toolbarButtons.setToolTipText("Clear window."); toolbarButtons.addActionListener ( new ActionListener() { public void actionPerformed(ActionEvent e) { textArea.setText(""); } } ); toolBar.add(toolbarButtons);
toolbarButtons = new JButton(new ImageIcon(print.getImage())); toolbarButtons.setToolTipText("Print window."); toolbarButtons.addActionListener ( new ActionListener() { public void actionPerformed(ActionEvent e) { PrintWindow(); } } ); toolBar.add(toolbarButtons);
toolbarButtons = new JButton(new ImageIcon(exit.getImage())); toolbarButtons.setToolTipText("Exit program."); toolbarButtons.addActionListener ( new ActionListener() { public void actionPerformed(ActionEvent e) { System.exit(0); } } ); toolBar.add(toolbarButtons);
toolbarButtons = new JButton(new ImageIcon(about.getImage())); toolbarButtons.setToolTipText("About program."); toolbarButtons.addActionListener ( new ActionListener() { public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(frame, "Jpcap Packet Capture Version 1.00 \n" + "Copyright (C) 2008 SHP Consulting & Systems \n\n" + "This progoram uses Jpcap to capture packets for one of this system's \n" + "network interfaces. The specific network interface to capture packets \n" + "for is provided by the user through a program selection dialog. \n\n", "About...", JOptionPane.INFORMATION_MESSAGE, new ImageIcon(logoLarge.getImage())); } } ); toolBar.add(toolbarButtons); }
public void ShowSplashScreen(int d) { duration = d;
JPanel splashScreen = (JPanel)getContentPane(); int width = 470; int height =255; Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); int x = (screen.width-width) / 2; int y = (screen.height-height) / 2; setBounds(x, y, width, height); JLabel label = new JLabel(new ImageIcon(splashScrn.getImage())); splashScreen.add(label, BorderLayout.CENTER); setVisible(true);
public void receivePacket(Packet packet) { // // Show captured packets in the application's text area. // if (packet == null) { textArea.append("Null packet receievd or timeout"); return; }
public static void main(String[] args) { JpcapPacketCapture jpcapPacketCapture = new JpcapPacketCapture(); JFrame.setDefaultLookAndFeelDecorated(true); jpcapPacketCapture.setIconImage(logoSmall.getImage()); jpcapPacketCapture.setSize(600, 360); Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); int w = jpcapPacketCapture.getSize().width; int h = jpcapPacketCapture.getSize().height; int x = (dim.width - w) / 2; int y = (dim.height - h) / 2; jpcapPacketCapture.setLocation(x, y); jpcapPacketCapture.setVisible(true); } } </java>
I don'T know much about worker threads (allmost nothing tbh), but it would help people here if you used the java tags as shown on the right side of the texxt input field.