2013-09-30 102 views
0

即时通讯做一个小桌面应用程序的朋友做ping,它“工作”,即时计划使用ping -t(用于无限ping),但在这样,我做到了,它永远不会显示结果,因为它只返回时结束,我有什么改变/新增加的“JTextField中” everyping结果每ping一次返回ping结果,而不仅仅是最后

看看我有什么:

方法做ping并返回结果(resposta)。

public String pingar(String ip){ 
     String resposta=""; 
     String comando="ping -t "+ip; 
     try { 
      Scanner S = new Scanner(Runtime.getRuntime().exec(comando).getInputStream());  
      while(S.hasNextLine()) {  
       resposta+=S.nextLine()+"\n"; 
      } 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
     return resposta; 
    } 

方法来启动上述方法和使用该方法adicionaresultado追加的结果(resposta) 公共无效ativaoping(){ adicionaresultado((pingar(tfIp.getText()))); }

改变/添加文本和设置滚动的位置到结束

public void adicionaresultado(String resposta) { 
     taResultados.append(resposta); 
taResultados.setCaretPosition(taResultados.getDocument().getLength()); 
     //tfResultado.setText(tfResultado.getText() + "\n" + resposta); 
    } 
} 

的方法,但我的问题是,它只能返回,并添加文本时,完成平,所以我永远不会有能力使用ping -t

回答

1

希望将文本添加到JTextArea中的事件队列。我在后面的代码示例中提供了一个非常简单的示例。这会为JTextArea附加一个新的行,以用于来自ping命令的响应。这不是很漂亮,但它能满足你的需要。另外,你想把无休止的ping作为一个单独的可运行的,所以你可以在稍后杀死它,然后在执行程序中运行它,这样你可以更好地控制你如何杀死它。

package test; 

import java.awt.EventQueue; 
import java.io.IOException; 
import java.util.Scanner; 
import java.util.concurrent.Executor; 
import java.util.concurrent.Executors; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextArea; 

public class Pinger { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       Pinger pinger = new Pinger(); 
       JFrame frame = new JFrame(); 
       JPanel panel = new JPanel(); 
       frame.setSize(300, 400); 
       frame.add(panel); 
       JTextArea textArea = new JTextArea(); 
       panel.add(textArea); 
       frame.setVisible(true); 
       pinger.executor.execute(pinger.createRunnable("google.com", 
         textArea)); 
      } 
     }); 

    } 

    private Runnable createRunnable(final String ip, final JTextArea area) { 
     return new Runnable() { 
      public void run() { 
       String resposta = ""; 
       String comando = "ping -t " + ip; 

       try { 
        Scanner S = new Scanner(Runtime.getRuntime().exec(comando) 
          .getInputStream()); 
        while (S.hasNextLine()) { 
         final String newText = S.nextLine(); 
         EventQueue.invokeLater(new Runnable() { 
          public void run() { 
           area.setText(area.getText() 
             + System.getProperty("line.separator") 
             + newText); 
          } 
         }); 

        } 
       } catch (IOException ex) { 
        ex.printStackTrace(); 
       } 

      } 
     }; 
    } 

    Executor executor = Executors.newFixedThreadPool(1); 

} 
+0

不错,但我会如何杀死它?我解决了与另一件事jtextarea的问题,但我会尝试你的,但如果我想停止使用你的代码ping /关闭窗口,将有什么命令 – user2582318

+0

而不是声明pinger.executor作为执行者,declare它作为一个ExecutorService,然后你可以访问#shutdown()和#awaitTermination方法。这些允许您杀死执行程序及其所有管理的可运行程序。 – codethulhu

+0

huum,@codethulhu我明白,即时通讯使用: pinger.executor.shutdown();和 \t \t \t pinger.executor.awaitTermination(60,TimeUnit.MILLISECONDS); \t \t \t \t \t System.out.println(pinger.executor.isShutdown()); \t \t ....但它仍然在TextArea中显示ping和PING的结果,conhost.exe仍在进程列表中;(我必须手动杀死它? – user2582318

0

每次在流中出现新行时都会调用adicionaResultado

while(S.hasNextLine()) {  
    adicionaResultado(S.nextLine()+"\n"); 
} 
+0

不工作,仍然只是在ping的结尾添加到jtextArea ...如果我使用system.out,它的工作原理,但附加不.. – user2582318

0

的方法只能返回一次,所以这一招会做

  while(S.hasNextLine()) {  
       System.out.print(S.nextLine()+"\n"); 
      } 
+0

不工作,仍然只添加到jtextArea在年底平...如果我使用system.out,它的工作原理,但附加不.. – user2582318

0

替换为:“ping -t”+ ip; for this:String comando =“ping -n 10”+ ip;

相关问题