0

我正在为朋友做一个小桌面应用程序来做 ping,它“有效”,我打算使用 ping -t(用于无限 ping),但是以我的方式,它永远不会显示结果,因为它只会返回完成后,我必须更改/添加以在“jtextField”中添加每个结果

看看我有什么:

方法来执行 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) public void 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 时返回并添加文本,所以我永远无法使用 ping -t

4

4 回答 4

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

}
于 2013-09-30T16:16:13.383 回答
0

adicionaResultado每次流中有新行时调用。

while(S.hasNextLine()) {    
    adicionaResultado(S.nextLine()+"\n");
}
于 2013-09-30T15:44:32.917 回答
0

一个方法只能返回一次,所以这个技巧就可以了

           while(S.hasNextLine()) {    
               System.out.print(S.nextLine()+"\n"); 
            }  
于 2013-09-30T15:45:24.887 回答
0

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

于 2014-06-10T17:40:48.380 回答