gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:56:26 26 4
gpt4 key购买 nike

我制作了一个应用程序,当我在 JFrame 应用程序中单击“开始”时,它会显示最大、最小和平均 ping。我制作了一个白框,这样我就可以适应动态变化的线图,该线图将与我的统计数据位于同一窗口中,并且将以与我的统计数据相同的速率(1 秒)更新。

无论我用 google 搜索多少次,似乎每个人都理解 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 值并绘制它们的图表。有人能真正帮助我,而不是把我链接到一个只展示如何单独制作图表的教程吗?

这是应用程序运行时的样子(我想要白色框中的图形。我可以使框更大):

/image/1VlzR.jpg

enter image description here

最佳答案

使用ProcessBuilder,如图here ,在 SwingWorkerdoInBackground() 实现中执行 ping 命令。解析输出,并 publish() 结果。更新 process() 实现中的数据集,图表将自行更新作为响应。显示了使用 JFreeChart 的示例 here .

Can you explain a bit more?

从第一个example开始,替换

ProcessBuilder pb = new ProcessBuilder("ls", "-lR", "/");

ProcessBuilder pb = new ProcessBuilder("ping", "-c", "3", "example.com");

方便地显示ping的标准输出。概括地说,第二个 example 中的 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);
}
}

关于java - 使用 JFreeChart <java> 将动态折线图添加到现有 JFrame 中的 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32239281/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com