Mam aplikację, która aktualizuje zmienną od 5 do 50 razy na sekundę i szukam sposobu na ciągły wykres XY tej zmiany w czasie rzeczywistym.Grafiki w czasie rzeczywistym w Javie
Chociaż JFreeChart nie jest zalecany z tak wysoką częstotliwością aktualizacji, wielu użytkowników wciąż twierdzi, że działa na nich. Próbowałem używać wersji demonstracyjnej this i zmodyfikowałem ją, aby wyświetlała zmienną losową, ale wydaje się, że cały czas zużywa 100% użycia procesora. Nawet jeśli to zignoruję, nie chcę ograniczać się do klasy UF JFreeCharta do konstruowania formularzy (chociaż nie jestem pewien, jakie są jej możliwości). Czy możliwe byłoby zintegrowanie go z "formularzami" Java i rozwijanymi menu? (jak są dostępne w VB) W przeciwnym razie, czy są jakieś alternatywy, które mogłem zaglądać?
EDIT: Jestem nowy Swing, więc już ułożyła kod tylko do testowania funkcjonalności JFreeChart z nim (unikając użycia klasy ApplicationFrame z JFree ponieważ nie jestem pewien, w jaki sposób to będzie działać z polami kombi i przyciskami Swinga). Obecnie wykres jest natychmiast aktualizowany, a użycie procesora jest wysokie. Czy byłoby możliwe buforowanie wartości za pomocą nowej Millisecond() i aktualizowanie jej może dwa razy na sekundę? Czy mogę dodać inne komponenty do reszty JFrame bez zakłócania JFreeChart? Jak to zrobić? frame.getContentPane(). add (new Button ("Click")) wydaje się nadpisywać wykres.
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);
}
}
}
}
}
To wydaje się dobrym pomysłem, choć musiałbym bufor jakiś znacznik czasu, jak również. Jednak JFreeChart wydaje się zajmować 100% użycia procesora, czy mam 2 lub 50 aktualizacji co sekundę. – thodinc
Cóż, to całkiem sporo - regenerowanie wykresu od zera za każdym razem. Więc zalecam mniejszą częstotliwość aktualizacji (oczywiście zależy to od twojej maszyny i dodatkowego obciążenia ...). –