Ho un'applicazione che aggiorna una variabile tra 5 e 50 volte al secondo e sto cercando un modo per disegnare un grafico XY continuo di questo cambiamento in tempo reale.Grafico in tempo reale in Java
Sebbene JFreeChart non sia consigliato per una frequenza di aggiornamento così elevata, molti utenti continuano a dire che funziona per loro. Ho provato a usare la demo this e l'ho modificata per visualizzare una variabile casuale, ma sembra utilizzare sempre il 100% di utilizzo della CPU. Anche se lo ignoro, non voglio essere limitato alla classe ui di JFreeChart per la costruzione di moduli (anche se non sono sicuro di quali siano esattamente le sue capacità). Sarebbe possibile integrarlo con i "moduli" e i menu a discesa di Java? (come sono disponibili in VB) Altrimenti, ci sono delle alternative che potrei esaminare?
EDIT: Sono nuovo di swing, così ho messo insieme un codice solo per testare la funzionalità di JFreeChart con esso (evitando l'utilizzo della classe ApplicationFrame di JFree dal momento che non sono sicuro di come che funzionerà con le caselle e i pulsanti combinati di Swing). In questo momento, il grafico viene aggiornato immediatamente e l'utilizzo della CPU è elevato. Sarebbe possibile bufferizzare il valore con il nuovo Millisecond() e aggiornarlo forse due volte al secondo? Inoltre, posso aggiungere altri componenti al resto di JFrame senza interrompere JFreeChart? Come potrei farlo? frame.getContentPane(). add (new Button ("Click")) sembra sovrascrivere il grafico.
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);
}
}
}
}
}
che sembra una buona idea, anche se avrei dovuto tamponare qualche tipo di data e ora pure. Tuttavia, JFreeChart sembra utilizzare il 100% della CPU se ho 2 o 50 aggiornamenti al secondo. – thodinc
Beh, sta facendo parecchio, rigenerando il grafico da zero ogni volta. Quindi ti consiglio un aggiornamento meno frequente (ovviamente dipende dalla tua macchina e dal tuo carico aggiuntivo ...) –