/**
* @author dwg
*/
public class Ping extends JPanel implements ActionListener
{
private SwingWorker<Void, String> worker;
private JTextArea output;
private JTextField input;
private JButton start;
private JButton stop;
public Ping() {
super(new BorderLayout());
initComponents();
initGui();
}
private void initComponents() {
worker = null;
output = new JTextArea(15, 50);
output.setEditable(false);
input = new JTextField();
start = new JButton("Ping");
start.addActionListener(this);
stop = new JButton("Stop");
stop.setEnabled(false);
stop.addActionListener(this);
}
private void initGui() {
add(new JScrollPane(output), BorderLayout.CENTER);
JPanel inputPanel = new JPanel(new BorderLayout());
inputPanel.add(input, BorderLayout.CENTER);
JPanel buttonPanel = new JPanel();
buttonPanel.add(start);
buttonPanel.add(stop);
inputPanel.add(buttonPanel, BorderLayout.EAST);
add(inputPanel, BorderLayout.NORTH);
}
public void actionPerformed(ActionEvent e) {
if (start == e.getSource()) {
handleStart();
} else {
handleStop();
}
}
private SwingWorker<Void, String> createWorker(final String host) {
return new SwingWorker<Void, String>() {
@Override
protected Void doInBackground() throws Exception {
String[] cmd = {"ping", "-t", host};
Process p = Runtime.getRuntime().exec(cmd);
InputStream is = p.getInputStream();
StringBuilder sb = new StringBuilder();
int read = -1;
while ((read = is.read()) != -1) {
sb.append((char)read);
if (read == '\n') {
publish(sb.toString());
sb.setLength(0);
}
if (isCancelled()) {
break;
}
}
return null;
}
@Override
protected void process(List<String> chunks) {
for (String s : chunks) {
if (s.indexOf("Reply") != -1) {
Toolkit.getDefaultToolkit().beep();
}
output.append(s);
}
}
@Override
protected void done() {
start.setEnabled(true);
stop.setEnabled(false);
}
};
}
private void handleStart() {
if (worker != null && !worker.isDone()) {
worker.cancel(false);
}
output.setText("");
start.setEnabled(false);
stop.setEnabled(true);
worker = createWorker(input.getText());
worker.execute();
}
private void handleStop() {
worker.cancel(false);
start.setEnabled(true);
stop.setEnabled(false);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame("Ping");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(new Ping());
frame.pack();
frame.setVisible(true);
}
});
}
}