0 java swing linechart dynamic jfreechart
当我在JFrame应用程序中单击"开始"时,我创建了一个应用程序,可以显示Max,Minimum和Average ping.我做了一个白色的盒子,所以我可以适应一个动态变化的线图,它将与我的统计数据在同一个窗口中,并将以与我的统计数据相同的速率更新(1秒).
无论我谷歌多少,每个人似乎都了解JFreeChart示例代码.我根本不明白如何实现这一点.其他教程仅在其自己的窗口中显示该图形.
我希望有人可以帮助我.这是我现在的JFrame代码:
 private void startButtonMouseClicked(java.awt.event.MouseEvent evt) {                                         
   String host = hostName.getText();
    ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
    exec.scheduleAtFixedRate(new Runnable(){
        @Override
        public void run(){
            try { 
                NetworkAnalyzer.pingCheck(host);
            } catch (IOException ex) {
                Logger.getLogger(NetworkAnalyzerwindow.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }, 0, 1, TimeUnit.SECONDS);
这是我的pingCheck:
public class NetworkAnalyzer {
static int count=0;
static long max_time = 0;
static long min_time = 0;
static long avg_time = 0;
public static void pingCheck(String host) throws IOException{
String time = "";
//command to execute
 String pingCmd = "ping " + host + " -t " + "-n 1"; 
 //gets runtime to execute command
 Runtime runtime = Runtime.getRuntime(); 
 try {
     Process process = runtime.exec(pingCmd);
     //gets inputstream to read the output of the cocmmand
     BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
     //read outputs
     String inputLine = in.readLine();
     while((inputLine != null)) {
         if (inputLine.length() > 0 && inputLine.contains("time")){
             time = inputLine.substring(inputLine.indexOf("time"));
             break;
         }
         inputLine = in.readLine();
     } 
    /* if(inputLine.contains("timed")){
         System.out.print("Request timed out. Try another domain:");
         pingCheck(time);
     }*/ 
         time = time.replaceAll("[^0-9]+", " ");
         time = time.substring(0, Math.min(time.length(), 3));
         time = time.replaceAll(" ", "");
         System.out.println("ping:" + time);
         //ping calcs
         count++;
         Long ping;
         ping = Long.parseLong(time);
         //for avg                  
         //max ping
         if( count == 1 || ping >= max_time)
             max_time = ping;
         //min ping
         if(count == 1 || ping <= min_time)
             min_time = ping;
         //avg ping
         if (count > 0)
             avg_time = (avg_time*(count-1)+ping)/count;
         NetworkAnalyzerwindow.maxPing.setText("Max: " + max_time + "ms");
         NetworkAnalyzerwindow.minPing.setText("Min: " + min_time + "ms");
         NetworkAnalyzerwindow.avgPing.setText("Avg: " + avg_time + "ms"); 
 } catch(IOException | NumberFormatException ex){
     JOptionPane.showMessageDialog(null, ex);
 }
}
我只想添加一个动态变化的图形,它将获取ping值并绘制图形.有人可以帮助我,而不是将我链接到仅显示如何自己制作图表的教程之一.
这是应用程序在运行时的样子(我希望白色框中的图形.我可以使框更大):
使用ProcessBuilder,在此处显示,ping在doInBackground()执行a时执行命令SwingWorker.解析输出和publish()结果.更新process()实施中的数据集,图表将自行更新以作为响应.这里JFreeChart显示了一个使用示例.
你能解释一下吗?
从第一个示例开始,替换
ProcessBuilder pb = new ProcessBuilder("ls", "-lR", "/");
同
ProcessBuilder pb = new ProcessBuilder("ping", "-c", "3", "example.com");
方便地显示标准输出ping.概括地说,您process()在第二个示例中可能如下所示:
@Override
protected void process(java.util.List<String> messages) {
    for (String message : messages) {
        textArea.append(message + "\n");
        // parse x, y from message 
        series.add(x, y);
    }
}