<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="https://wiki.twig.es/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://wiki.twig.es/index.php?action=history&amp;feed=atom&amp;title=Animated_Line_chart</id>
		<title>Animated Line chart - Revision history</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.twig.es/index.php?action=history&amp;feed=atom&amp;title=Animated_Line_chart"/>
		<link rel="alternate" type="text/html" href="https://wiki.twig.es/index.php?title=Animated_Line_chart&amp;action=history"/>
		<updated>2026-05-06T18:24:25Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.23.0</generator>

	<entry>
		<id>https://wiki.twig.es/index.php?title=Animated_Line_chart&amp;diff=2211&amp;oldid=prev</id>
		<title>George2: Created page with &quot;&lt;source lang=&quot;java&quot;&gt;  import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.c...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.twig.es/index.php?title=Animated_Line_chart&amp;diff=2211&amp;oldid=prev"/>
				<updated>2015-07-13T18:06:15Z</updated>
		
		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;  import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.c...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.ConcurrentLinkedQueue;&lt;br /&gt;
import java.util.concurrent.ExecutorService;&lt;br /&gt;
import java.util.concurrent.Executors;&lt;br /&gt;
import java.util.concurrent.ThreadFactory;&lt;br /&gt;
import java.util.logging.Level;&lt;br /&gt;
import java.util.logging.Logger;&lt;br /&gt;
&lt;br /&gt;
import javafx.animation.AnimationTimer;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.chart.AreaChart;&lt;br /&gt;
import javafx.scene.chart.LineChart;&lt;br /&gt;
import javafx.scene.chart.NumberAxis;&lt;br /&gt;
import javafx.scene.chart.XYChart;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public class AnimatedLineChart extends Application {&lt;br /&gt;
&lt;br /&gt;
    private static final int MAX_DATA_POINTS = 50;&lt;br /&gt;
    private int xSeriesData = 0;&lt;br /&gt;
    private XYChart.Series series1;&lt;br /&gt;
    private XYChart.Series series2;&lt;br /&gt;
    private XYChart.Series series3;&lt;br /&gt;
    private ExecutorService executor;&lt;br /&gt;
    private AddToQueue addToQueue;&lt;br /&gt;
    private ConcurrentLinkedQueue&amp;lt;Number&amp;gt; dataQ1 = new ConcurrentLinkedQueue&amp;lt;Number&amp;gt;();&lt;br /&gt;
    private ConcurrentLinkedQueue&amp;lt;Number&amp;gt; dataQ2 = new ConcurrentLinkedQueue&amp;lt;Number&amp;gt;();&lt;br /&gt;
    private ConcurrentLinkedQueue&amp;lt;Number&amp;gt; dataQ3 = new ConcurrentLinkedQueue&amp;lt;Number&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
    private NumberAxis xAxis;&lt;br /&gt;
&lt;br /&gt;
    private void init(Stage primaryStage) {&lt;br /&gt;
        xAxis = new NumberAxis(0,MAX_DATA_POINTS,MAX_DATA_POINTS/10);&lt;br /&gt;
        xAxis.setForceZeroInRange(false);&lt;br /&gt;
        xAxis.setAutoRanging(false);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        xAxis.setTickLabelsVisible(false);&lt;br /&gt;
        xAxis.setTickMarkVisible(false);&lt;br /&gt;
        xAxis.setMinorTickVisible(false);&lt;br /&gt;
&lt;br /&gt;
        NumberAxis yAxis = new NumberAxis();&lt;br /&gt;
        yAxis.setAutoRanging(true);&lt;br /&gt;
&lt;br /&gt;
        //-- Chart&lt;br /&gt;
        final LineChart&amp;lt;Number, Number&amp;gt; sc = new LineChart&amp;lt;Number, Number&amp;gt;(xAxis, yAxis) {&lt;br /&gt;
            // Override to remove symbols on each data point&lt;br /&gt;
            @Override protected void dataItemAdded(Series&amp;lt;Number, Number&amp;gt; series, int itemIndex, Data&amp;lt;Number, Number&amp;gt; item) {}&lt;br /&gt;
        };&lt;br /&gt;
        sc.setAnimated(false);&lt;br /&gt;
        sc.setId(&amp;quot;liveLineeChart&amp;quot;);&lt;br /&gt;
        sc.setTitle(&amp;quot;Animated Line Chart&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        //-- Chart Series&lt;br /&gt;
        series1 = new XYChart.Series&amp;lt;Number, Number&amp;gt;();&lt;br /&gt;
        series2 = new XYChart.Series&amp;lt;Number, Number&amp;gt;();&lt;br /&gt;
        series3 = new XYChart.Series&amp;lt;Number, Number&amp;gt;();&lt;br /&gt;
        sc.getData().addAll(series1, series2, series3);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setScene(new Scene(sc));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Override public void start(Stage stage) {&lt;br /&gt;
        stage.setTitle(&amp;quot;Animated Line Chart Sample&amp;quot;);&lt;br /&gt;
        init(stage);&lt;br /&gt;
        stage.show();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        executor = Executors.newCachedThreadPool(new ThreadFactory() {&lt;br /&gt;
            @Override public Thread newThread(Runnable r) {&lt;br /&gt;
                Thread thread = new Thread(r);&lt;br /&gt;
                thread.setDaemon(true);&lt;br /&gt;
                return thread;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        addToQueue = new AddToQueue();&lt;br /&gt;
        executor.execute(addToQueue);&lt;br /&gt;
        //-- Prepare Timeline&lt;br /&gt;
        prepareTimeline();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private class AddToQueue implements Runnable {&lt;br /&gt;
        public void run() {&lt;br /&gt;
            try {&lt;br /&gt;
                // add a item of random data to queue&lt;br /&gt;
                dataQ1.add(Math.random());&lt;br /&gt;
                dataQ2.add(Math.random());&lt;br /&gt;
                dataQ3.add(Math.random());&lt;br /&gt;
&lt;br /&gt;
                Thread.sleep(500);&lt;br /&gt;
                executor.execute(this);&lt;br /&gt;
            } catch (InterruptedException ex) {&lt;br /&gt;
                ex.printStackTrace();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  //-- Timeline gets called in the JavaFX Main thread&lt;br /&gt;
    private void prepareTimeline() {&lt;br /&gt;
        // Every frame to take any data from queue and add to chart&lt;br /&gt;
        new AnimationTimer() {&lt;br /&gt;
            @Override public void handle(long now) {&lt;br /&gt;
                addDataToSeries();&lt;br /&gt;
            }&lt;br /&gt;
        }.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void addDataToSeries() {&lt;br /&gt;
        for (int i = 0; i &amp;lt; 20; i++) { //-- add 20 numbers to the plot+&lt;br /&gt;
            if (dataQ1.isEmpty()) break;&lt;br /&gt;
            series1.getData().add(new AreaChart.Data(xSeriesData++, dataQ1.remove()));&lt;br /&gt;
            series2.getData().add(new AreaChart.Data(xSeriesData++, dataQ2.remove()));&lt;br /&gt;
            series3.getData().add(new AreaChart.Data(xSeriesData++, dataQ3.remove()));&lt;br /&gt;
        }&lt;br /&gt;
        // remove points to keep us at no more than MAX_DATA_POINTS&lt;br /&gt;
        if (series1.getData().size() &amp;gt; MAX_DATA_POINTS) {&lt;br /&gt;
            series1.getData().remove(0, series1.getData().size() - MAX_DATA_POINTS);&lt;br /&gt;
        }&lt;br /&gt;
        if (series2.getData().size() &amp;gt; MAX_DATA_POINTS) {&lt;br /&gt;
            series2.getData().remove(0, series2.getData().size() - MAX_DATA_POINTS);&lt;br /&gt;
        }&lt;br /&gt;
        if (series3.getData().size() &amp;gt; MAX_DATA_POINTS) {&lt;br /&gt;
            series3.getData().remove(0, series3.getData().size() - MAX_DATA_POINTS);&lt;br /&gt;
        }&lt;br /&gt;
        // update &lt;br /&gt;
        xAxis.setLowerBound(xSeriesData-MAX_DATA_POINTS);&lt;br /&gt;
        xAxis.setUpperBound(xSeriesData-1);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>George2</name></author>	</entry>

	</feed>