2013-04-25 3 views
0

Итак, я работаю над небольшим графическим интерфейсом, который выводит из командной строки IP-адрес, выбранный из списка IP-адресов. Я работаю и возвращаюсь к выводу через getInputStream.Захват определенных частей InputStreamReader в Java

Вот код, у меня есть для запуска пинг:

String pingResult = ""; 
    try { 
     Runtime r = Runtime.getRuntime(); 
     Process p = r.exec("ping " + IPAddressList.getSelectedValue()); 
     try (BufferedReader in = new BufferedReader(new InputStreamReader 
       (p.getInputStream()))) { 
      String inputLine; 
      while ((inputLine = in.readLine()) != null) { 
       System.out.println(inputLine); 
       pingResult += inputLine; 
      } 
     } 

    }//try 
    catch (IOException e) { 
     System.out.println(e); 
    } 

Что мне нужно сделать сейчас, из списка IP-адресов (который хранится внутри JList с именами DefaultModel машин), я необходимо постоянно разрешать проверку IP-адресов в списке и обновлять список (у меня есть идея о том, как сделать обновление).

Я понятия не имею, как запустить этот цикл, используя некоторый код выше и держать его в рабочем состоянии. Кроме того, хотя он работает, мне нужно убедиться, что графический интерфейс может выполнять другие функции, такие как: удалить IP из списка, добавить IP-адрес в список, выполнить IP-адрес и т. Д.

Спасибо за помощь.

ответ

0

Вам нужно пнуть Pinging в фоновом потоке. Использование SwingWorker может быть самым простым способом реализации этого. Вы можете довольно легко передать ему список IP-адресов, и он будет запускаться в фоновом режиме, пинговая каждый, а затем передавать промежуточные результаты обратно в ваш графический интерфейс. Одна из приятных вещей в классе SwingWorker заключается в том, что он гарантирует, что обработка результатов происходит в потоке отправки основного события для Swing, так что вам не нужно ничего делать, чтобы справиться с этим.

Javadoc обеспечивает хороший обзор использования для этого:

http://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html

Ниже грубой отправной точкой. Затем вы создадите экземпляр и вызовите его метод execute(), чтобы запустить фоновый процесс.

class PingWorker extends SwingWorker<Void, PingResult> { 
    private List<IpAddress> addresses; 

    public PingWorker(List<IpAddress> addresses) { 
     this.addresses = addresses; 
    } 

    @Override 
    protected Void doInBackground() throws Exception { 
     for (IpAddress address : addresses) { 
      // run ping code and build result 
      publish(new PingResult(address /* other result params here */)); 
     } 

     // no need to return anything as we are processing the intermediate results 
     return null; 
    } 

    @Override 
    protected void done() { 
     // pings are complete, update GUI to reflect this 
    } 

    @Override 
    protected void process(List<PingResult> results) { 
     for (PingResult result : results) { 
      // update GUI with the result of the ping such as your table model 
     } 
    } 
} 
+0

Это выглядит потрясающе Эд, я постараюсь сделать кодировку завтра. Благодаря тонну! – Dan

0

Вы можете запустить все в своем тестовом цикле в другом потоке, чтобы он работал независимо, тогда вы можете делать все, что захотите (добавлять/удалять IP-адреса), пока он продолжает работать.

Следовать эту обучающую программу, и вы найдете все, что вам нужно: Java Tutorials: Concurrency

Смежные вопросы