使用JFreeChart <java>将动态折线图添加到现有JFrame中的JPanel

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);
Run Code Online (Sandbox Code Playgroud)

这是我的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);
 }


}
Run Code Online (Sandbox Code Playgroud)

我只想添加一个动态变化的图形,它将获取ping值并绘制图形.有人可以帮助我,而不是将我链接到仅显示如何自己制作图表的教程之一.

这是应用程序在运行时的样子(我希望白色框中的图形.我可以使框更大):

http://imgur.com/kgYCoW2

在此输入图像描述

tra*_*god 5

使用ProcessBuilder,在此处显示,pingdoInBackground()执行a时执行命令SwingWorker.解析输出和publish()结果.更新process()实施中的数据集,图表将自行更新以作为响应.这里JFreeChart显示一个使用示例.

你能解释一下吗?

从第一个示例开始,替换

ProcessBuilder pb = new ProcessBuilder("ls", "-lR", "/");
Run Code Online (Sandbox Code Playgroud)

ProcessBuilder pb = new ProcessBuilder("ping", "-c", "3", "example.com");
Run Code Online (Sandbox Code Playgroud)

方便地显示标准输出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);
    }
}
Run Code Online (Sandbox Code Playgroud)