Поскольку у меня не было ответа, я тем временем решил свою проблему следующим образом.Тем не менее, я думаю, что есть, и должен быть, более простой способ сделать это. Так как я был ограничен во времени, я нашел это решение.Если у вас есть что-то лучше или что-то, что вы считаете нужным улучшить, пожалуйста, поделитесь этим.
Я добавляю к своему 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();
}
}