Java 中的实时绘图
我有一个应用程序,它每秒更新大约5到50次的变量,我正在寻找某种方法来实时绘制此变化的连续XY图。
虽然JFreeChart不建议用于如此高的更新率,但许多用户仍然说它适用于他们。我尝试使用此演示并将其修改为显示随机变量,但它似乎一直占用100%的CPU使用率。即使我忽略了这一点,我也不想被限制在JFreeChart的ui类来构造表单(尽管我不确定它的功能到底是什么)。是否有可能将其与Java的“表单”和下拉菜单集成?(在 VB 中可用)否则,我是否可以研究其他选择?
编辑:我是Swing的新手,所以我整理了一个代码,只是为了测试JFreeChart的功能(同时避免使用JFree的AppplicaticalFrame类,因为我不确定它将如何与Swing的组合框和按钮一起使用)。目前,图形正在立即更新,CPU使用率很高。是否可以用新的Millisecond()缓冲该值,并可能每秒更新两次?另外,我可以在不中断JFreeChart的情况下向JFrame的其余部分添加其他组件吗?我该怎么做?frame.getContentPane().add(new Button(“Click”)) 似乎覆盖了图表。
package graphtest;
import java.util.Random;
import javax.swing.JFrame;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.time.Millisecond;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
public class Main {
static TimeSeries ts = new TimeSeries("data", Millisecond.class);
public static void main(String[] args) throws InterruptedException {
gen myGen = new gen();
new Thread(myGen).start();
TimeSeriesCollection dataset = new TimeSeriesCollection(ts);
JFreeChart chart = ChartFactory.createTimeSeriesChart(
"GraphTest",
"Time",
"Value",
dataset,
true,
true,
false
);
final XYPlot plot = chart.getXYPlot();
ValueAxis axis = plot.getDomainAxis();
axis.setAutoRange(true);
axis.setFixedAutoRange(60000.0);
JFrame frame = new JFrame("GraphTest");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ChartPanel label = new ChartPanel(chart);
frame.getContentPane().add(label);
//Suppose I add combo boxes and buttons here later
frame.pack();
frame.setVisible(true);
}
static class gen implements Runnable {
private Random randGen = new Random();
public void run() {
while(true) {
int num = randGen.nextInt(1000);
System.out.println(num);
ts.addOrUpdate(new Millisecond(), num);
try {
Thread.sleep(20);
} catch (InterruptedException ex) {
System.out.println(ex);
}
}
}
}
}