Update JLabel several times with the results of a long task

advertisements

I'm writing a program that constantly pings a server. I wrote the code to check it once and put the ping in a JLabel and put it in a method called setPing().

Here is my code

private void formWindowOpened(java.awt.event.WindowEvent evt) {
    setPing();
}

That worked but only did it once, so I did:

private void formWindowOpened(java.awt.event.WindowEvent evt) {
for(;;){
    setPing();
    }
}

But this doesn't even work for the first time.

I didnt put the setPing method because it was too long so here it is:

public String setPing(){
Runtime runtime = Runtime.getRuntime();
try{
    Process process = runtime.exec("ping lol.garena.com");
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) {
    int i = 0;
      i = line.indexOf("Average");
    if(i > 0){
    String finalPing = "";
    line.toCharArray();
    try
    {
        finalPing = "";
        for(int x = i; x < i + 17; x++)
        {
            finalPing = finalPing + (line.charAt(x));
        }
    }catch(IndexOutOfBoundsException e)
    {
        try
        {
            finalPing = "";
            for(int x = i; x < i + 16; x++)
            {
                finalPing = finalPing + (line.charAt(x));
            }
        }catch(IndexOutOfBoundsException f)
        {
            try
            {
                finalPing = "";
                for(int x = i; x < i + 15; x++)
                {
                    finalPing = finalPing + (line.charAt(x));
                }
            }catch(IndexOutOfBoundsException g){}
        }
    }
    String final1Ping = finalPing.replaceAll("[^0-9]", "");
    return final1Ping;
    }
}
}catch(IOException e){
}
return "";
}

UPDATE Just in case this is important, Im using netbeans. I created a form and put this code in the formWindowOpened evt instead of calling it in main:

private void formWindowOpened(java.awt.event.WindowEvent evt) {                                  

    ActionListener timerListener = new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            new PingWorker().execute();
        }
    };
    Timer timer = new Timer(1000, timerListener);

        timer.start();
        jLabel1.setText(label.getText());
        timer.stop();
 // TODO add your handling code here:
}                                 

class PingWorker extends SwingWorker {

    int time;

    @Override
    protected Object doInBackground() throws Exception {
        time = pingTime("lol.garena.com");
        return new Integer(time);
    }

    @Override
    protected void done() {
        label.setText("" + time);
    }
};

public JComponent getUI() {
    return label;
}

public static int pingTime(String hostnameOrIP) {
    Socket socket = null;
    long start = System.currentTimeMillis();
    try {
        socket = new Socket(hostnameOrIP, 80);
    } catch (IOException ex) {
        ex.printStackTrace();
    } finally {
        if (socket != null) {
            try {
                socket.close();
            } catch (IOException e) {
            }
        }
    }
    long end = System.currentTimeMillis();
    return (int) (end - start);
}


Use a Swing Timer for repeating tasks & a SwingWorker for long running tasks. E.G. of both below - it uses a Timer to repeatedly perform a 'long running' task (a ping) in a SwingWorker.

See Concurrency in Swing for more details on the Event Dispatch Thread and doing long running or repeating tasks in a GUI.

This code combines a long running task ('pinging' a server) using SwingWorker invoked from a repeating task (updating the JLabel repeatedly with the times) using a Swing based Timer.

import java.awt.event.*;
import javax.swing.*;
import java.net.Socket;

public class LabelUpdateUsingTimer {

    static String hostnameOrIP = "stackoverflow.com";
    int delay = 5000;
    JLabel label = new JLabel("0000");

    LabelUpdateUsingTimer() {
        label.setFont(label.getFont().deriveFont(120f));

        ActionListener timerListener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                new PingWorker().execute();
            }
        };
        Timer timer = new Timer(delay, timerListener);

        timer.start();
        JOptionPane.showMessageDialog(
                null, label, hostnameOrIP, JOptionPane.INFORMATION_MESSAGE);
        timer.stop();
    }

    class PingWorker extends SwingWorker {

        int time;

        @Override
        protected Object doInBackground() throws Exception {
            time = pingTime();
            return new Integer(time);
        }

        @Override
        protected void done() {
            label.setText("" + time);
        }
    };

    public static int pingTime() {
        Socket socket = null;
        long start = System.currentTimeMillis();
        try {
            socket = new Socket(hostnameOrIP, 80);
        } catch (Exception weTried) {
        } finally {
            if (socket != null) {
                try {
                    socket.close();
                } catch (Exception weTried) {}
            }
        }
        long end = System.currentTimeMillis();
        return (int) (end - start);
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                new LabelUpdateUsingTimer();
            }
        };
        SwingUtilities.invokeLater(r);
    }
}