У меня есть приложение, которое обновляет переменную примерно от 5 до 50 раз в секунду, и я ищу способ рисования непрерывного графика XY этого изменения в реальном времени.
Хотя JFreeChart не рекомендуется для такой высокой скорости обновления, многие пользователи все еще говорят, что он работает для них. Я попытался использовать эту демонстрацию и изменил ее, чтобы отобразить случайную переменную, но, похоже, все время использует 100% -ное использование ЦП. Даже если я игнорирую это, я не хочу ограничиваться классом JFreeChart ui для построения форм (хотя я не уверен, что его возможности в точности). Можно ли интегрировать его с "формами" Java и раскрывающимися меню? (как доступно в VB) В противном случае, есть ли альтернативы, которые я мог бы изучить?
EDIT: Я новичок в Swing, поэтому я собрал код, чтобы просто проверить функциональность JFreeChart (избегая при этом использования класса ApplicationFrame JFree с тех пор, m не уверен, как это будет работать с Swing combo box и кнопками). Прямо сейчас, график обновляется сразу, а загрузка процессора высока. Можно ли буферировать значение с помощью новой Millisecond() и обновить ее, возможно, два раза в секунду? Кроме того, могу ли я добавить другие компоненты в остальную часть JFrame, не нарушая JFreeChart? Как мне это сделать? frame.getContentPane(). add (новая кнопка ("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);
}
}
}
}
}