私は1秒間に約5〜50回変数を更新するアプリケーションを持っており、この変化の連続XYプロットをリアルタイムで描画する方法を探しています。
JFreeChartはこのような高い更新率にはお勧めできませんが、多くのユーザーはそれでもうまくいくと言っています。このデモを使用してランダム変数を表示するように変更しましたが、常に100%のCPU使用率を消費しているようです。それを無視しても、フォームを作成するためにJFreeChartのuiクラスに制限されたくはありません(ただし、その機能が正確に何であるかはわかりません)。それをJavaの「フォーム」およびドロップダウンメニューと統合することは可能でしょうか?(VBで利用可能)それ以外の場合、私が調べることができる代替案はありますか?
編集:私はSwingを初めて使用するので、JFreeChartの機能をテストするためだけにコードをまとめました(Swingのコンボでどのように機能するかわからないため、JFreeのApplicationFrameクラスの使用は避けています)ボックスとボタン)。現在、グラフはすぐに更新されており、CPU使用率が高くなっています。new Millisecond()で値をバッファリングし、1秒に2回更新することは可能でしょうか?また、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);
}
}
}
}
}