2012-04-03 11 views
2

Ich arbeite mit diesem exemple, die rondom dynamische Daten in ein TimeSeriesCollection-Diagramm setzen.Speichern/Laden jFreeChart TimeSeriesCollection-Diagramm von XML

the data when first running the application

after a while i can not have the old data like those of the first picture

Mein Problem ist, dass ich nicht finden können, wie:

1- eine Spur der alten Daten Stellen (der letzten Stunde), wenn sie passieren die linke Begrenzung (weil sich die Datenpunkte von rechts nach links bewegen) des Ansichtsbereichs, indem Sie eine horizontale Bildlaufleiste implementieren.

2- Ist XML eine gute Wahl, um meine Daten zu speichern, wenn ich alle die Geschichte der Daten haben möchte?

public class DynamicDataDemo extends ApplicationFrame { 
    /** The time series data. */ 
    private TimeSeries series; 

    /** The most recent value added. */ 
    private double lastValue = 100.0; 


public DynamicDataDemo(final String title) { 

    super(title); 
    this.series = new TimeSeries("Random Data", Millisecond.class); 
    final TimeSeriesCollection dataset = new TimeSeriesCollection(this.series); 
    final JFreeChart chart = createChart(dataset); 

    final ChartPanel chartPanel = new ChartPanel(chart); 

    final JPanel content = new JPanel(new BorderLayout()); 
    content.add(chartPanel); 
    chartPanel.setPreferredSize(new java.awt.Dimension(500, 270)); 
    setContentPane(content); 

} 


private JFreeChart createChart(final XYDataset dataset) { 
    final JFreeChart result = ChartFactory.createTimeSeriesChart(
     "Dynamic Data Demo", 
     "Time", 
     "Value", 
     dataset, 
     true, 
     true, 
     false 
    ); 
    final XYPlot plot = result.getXYPlot(); 
    ValueAxis axis = plot.getDomainAxis(); 
    axis.setAutoRange(true); 
    axis.setFixedAutoRange(60000.0); // 60 seconds 
    axis = plot.getRangeAxis(); 
    axis.setRange(0.0, 200.0); 
    return result; 
} 


public void go() { 

     final double factor = 0.90 + 0.2 * Math.random(); 
     this.lastValue = this.lastValue * factor; 
     final Millisecond now = new Millisecond(); 
     System.out.println("Now = " + now.toString()); 
     this.series.add(new Millisecond(), this.lastValue); 

} 


public static void main(final String[] args) throws InterruptedException { 

    final DynamicDataDemo demo = new DynamicDataDemo("Dynamic Data Demo"); 
    demo.pack(); 
    RefineryUtilities.centerFrameOnScreen(demo); 
    demo.setVisible(true); 

    while(true){ 

     demo.go(); 
     Thread.currentThread().sleep(1000); 
    } 

} 



} 

Antwort

2
  1. Die example verwendet die default values für die maximale Punkt Alter in TimeSeries angegeben und zählen. Sie sollten sie nach Ihren Anforderungen ändern.

  2. XML ist in Ordnung, aber es ist voluminös für hohe Raten; planen Sie entsprechend.

Siehe auch diese example, die das Event Dispatch Thread blockiert javax.swing.Timer zu vermeiden, verwendet.

+0

Vielen Dank, aber für den ersten Teil hemm das ist nicht genau das, was ich haben möchte, indem ich die TimeSeries.setMaximumItemAge (long) überprüft habe, dass es das Diagramm komprimiert, um die alten Daten im Ansichtsbereich zu behalten, anstatt hinzuzufügen eine horizontale Bildlaufleiste. weil ich den Graphen behalten möchte wie er war und die alten Daten in der gleichen Zeit verfolgen muss. –

+0

Sie möchten das Modell und die Ansicht weiter trennen. Es wird ein Paging-Ansatz [hier] vorgeschlagen (http://stackoverflow.com/a/6849654/230513). – trashgod