2013-04-25 1 views
0

그래서 IP 목록에서 선택된 IP를 명령 줄에서 ping하는 보조 GUI 작업을하고 있습니다. 이 작업을하고 getInputStream을 통해 출력으로 리턴합니다. 여기 Java에서 InputStreamReader의 특정 부분 캡처하기

은 핑 실행 내가 가지고있는 코드입니다 : 내가 지금해야 할 일은

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

을 (A DefaultModel 이름 기계로하는 JList의 내부에 저장되어있는) IP 목록에서, 나는 계속해서 목록의 IP를 핑 (ping)하고 목록을 업데이트 할 수 있어야합니다 (업데이트하는 방법에 대한 아이디어가 있습니다).

위의 코드 중 일부를 사용하여이 루프를 시작하고 계속 실행하는 방법을 알지 못합니다. 또한 실행되는 동안 GUI에서 목록에서 IP를 제거하고 목록에 IP를 추가하고 개별 IP를 핑하는 등의 다른 작업을 수행 할 수 있는지 확인해야합니다.

감사합니다. 도움.

답변

0

당신은 백그라운드 스레드 내에서 핑 킥오프해야합니다. SwingWorker을 사용하면이를 구현하는 가장 쉬운 방법 일 수 있습니다. 상당히 쉽게 IP 주소 목록을 전달할 수 있으며 각각의 IP 주소를 백그라운드로 실행 한 다음 중간 결과를 다시 GUI로 전달합니다. SwingWorker 클래스에 대한 좋은 점 중 하나는 스윙의 메인 이벤트 발송 스레드 내에서 결과 처리가 이루어 지므로이를 처리하기 위해 별도의 조치를 취할 필요가 없다는 점입니다.

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

독립적으로 실행되도록 다른 스레드에서 try 루프의 모든 것을 시작할 수 있습니다. 그러면 계속 실행되는 동안 원하는대로 (IP 추가/제거) 할 수 있습니다.

이 튜토리얼을 따라, 당신은 당신이 필요의 대부분을 찾을 수 있습니다 : Java Tutorials: Concurrency