X轴上具有固定的第二时间间隔的图表

时间:2018-09-24 12:43:37

标签: java jfreechart

我正在尝试创建一个图表,该图表的x图表的区间值为0到120。数据将每秒更新一次。 图表的类型与Windows任务管理器中的CPU图表完全相同:this


我已经检查了以下主题:

  1. Random errors when changing series using JFreeChart
  2. JFreechart series movement with fixed x-axis
  3. JFreeChart - How to show real-time on the X-Axis of a TimeSeries chart

尽管这些主题的答案对我来说确实很有帮助,但我仍然无法理解自己想做什么。

谢谢。

1 个答案:

答案 0 :(得分:0)

由于我没有答案,因此我同时解决了如下问题。但是,我认为应该有一种更简单的方法来执行此操作。由于时间有限,因此我想出了此解决方案。如果您有什么更好的东西,或者您认为需要改进的地方,请分享。

我将LinkedList添加到我想要的大小为止(在这种情况下为120)。之后,它将删除最后一个条目,并添加到开头。另一个线程每秒调用一次此方法。

   private final LinkedList<XYDataItem> countHistory = new LinkedList<>();
   private static final int MAX_RANGE_IN_X_AXIS_FOR_XY_CHART = 121;
enter code here
   public void getDataAndRefresh( final DefaultTableXYDataset xySeriesCollection)
   {
      synchronized ( this.adsbItemMap )
      {
         int count = 0;

     if ( xySeriesCollection.getSeries( 0 ) != null )
     {
        final XYSeries xySeries = xySeriesCollection.getSeries( 0 );
        try
        {

           if ( this.counter == MAX_RANGE_IN_X_AXIS_FOR_XY_CHART )
           {
              xySeries.getItems().forEach( item -> {
                 final XYDataItem xyItem = ( XYDataItem ) item;
                 this.countHistory.addLast(
                       new XYDataItem( xyItem.getXValue()+1,xyItem.getYValue()));
              } );
              //xySeries.clear();
              this.countHistory.pollLast();
              this.countHistory.addFirst( new XYDataItem( 0, count ) );
              this.countHistory.forEach( xySeries::addOrUpdate );
              this.countHistory.clear();
           }
           else
           {
              xySeries.getItems().forEach( item -> {
                 final XYDataItem xyItem = ( XYDataItem ) item;
                 this.countHistory.addLast(
                       new XYDataItem( xyItem.getXValue() + 1, xyItem.getYValue() ) );
              } );
              final XYDataItem countItem = new XYDataItem( 0, count );
              this.countHistory.addFirst( countItem );
              this.countHistory.forEach( xySeries::addOrUpdate );
              this.countHistory.clear();
              this.counter++;
           }
        }
        catch ( final Exception e )
        {
           LOG.warn( "Something went wrong.", e );
        }
     }
     //clear
     total.setValue( count );
     this.adsbItemMap.clear();
  }
}