即时为朋友做一个小桌面应用程序做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
答案 0 :(得分:1)
您希望将文本添加到事件队列上的JTextArea。我在后面的代码示例中提供了一个非常基本的示例。这会在JTextArea中为ping命令的响应添加一个新行。它不漂亮,但它可以满足您的需求。 此外,您希望将无限的ping操作放入单独的runnable中,以便稍后可以将其杀死,并在执行程序中运行它,这样您就可以更好地控制如何杀死它。
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);
}
答案 1 :(得分:0)
每次流中都有新行时调用adicionaResultado
。
while(S.hasNextLine()) {
adicionaResultado(S.nextLine()+"\n");
}
答案 2 :(得分:0)
一个方法只能返回一次,所以这个技巧会做
while(S.hasNextLine()) {
System.out.print(S.nextLine()+"\n");
}
答案 3 :(得分:0)
替换它:" ping -t" + ip; 对于 this:String comando =" ping -n 10" + ip;