Tengo una aplicación que actualiza una variable de entre 5 y 50 veces por segundo y estoy buscando una forma de dibujar un gráfico XY continuo de este cambio en tiempo real.Gráficos en tiempo real en Java
Aunque JFreeChart no se recomienda para una tasa de actualización tan alta, muchos usuarios todavía dicen que funciona para ellos. Intenté usar la demo this y la modifiqué para que mostrara una variable aleatoria, pero parece consumir el 100% del uso de la CPU todo el tiempo. Incluso si ignoro eso, no quiero estar restringido a la clase ui de JFreeChart para construir formularios (aunque no estoy seguro de cuáles son sus capacidades exactamente). ¿Sería posible integrarlo con los "formularios" y menús desplegables de Java? (como están disponibles en VB) De lo contrario, ¿hay alguna alternativa que pueda analizar?
EDIT: Soy nuevo en Swing, por lo que he juntado un código sólo para probar la funcionalidad de JFreeChart con ella (evitando el uso de la clase de ApplicationFrame jfree ya que no estoy seguro de cómo eso funcionará con los cuadros y botones combinados de Swing). En este momento, el gráfico se está actualizando de inmediato y el uso de la CPU es alto. ¿Sería posible almacenar el valor con un nuevo Milisegundo() y actualizarlo tal vez dos veces por segundo? Además, ¿puedo agregar otros componentes al resto de JFrame sin interrumpir JFreeChart? ¿Como podría hacerlo? frame.getContentPane(). add (nuevo Botón ("Hacer clic")) parece sobrescribir el gráfico.
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);
}
}
}
}
}
Eso parece una buena idea, aunque tendría que amortiguar algún tipo de marca de tiempo también. Sin embargo, JFreeChart parece ocupar el 100% del uso de la CPU si tengo 2 o 50 actualizaciones por segundo. – thodinc
Bueno, está haciendo bastante - regenerando el gráfico desde cero cada vez. Así que recomendaría una actualización un poco menos frecuente (por supuesto depende de su máquina y su carga adicional ...) –