view src/example/AdvancedStockLineChartSample.java @ 25:0a99effcfd3b

add example for Scheduler
author sugi
date Thu, 31 Oct 2013 01:17:10 +0900
parents
children
line wrap: on
line source

package example;

/**
 * Copyright (c) 2008, 2012 Oracle and/or its affiliates.
 * All rights reserved. Use is subject to license terms.
 */
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.util.Duration;

/**
 * A simulated stock line chart.
 *
 * @see javafx.scene.chart.Chart
 * @see javafx.scene.chart.LineChart
 * @see javafx.scene.chart.NumberAxis
 * @see javafx.scene.chart.XYChart
 */
public class AdvancedStockLineChartSample extends Application {

	private XYChart.Series<Number,Number> hourDataSeries;
	private XYChart.Series<Number,Number> minuteDataSeries;
	private NumberAxis xAxis;
	private Timeline animation;

	private double hours = 0;
	private double minutes = 0;
	private double timeInHours = 0;
	private double prevY = 10;
	private double y = 10;

	private void init(Stage primaryStage) {
		Group root = new Group();
		primaryStage.setScene(new Scene(root));
		root.getChildren().add(createChart());
		// create timeline to add new data every 60th of second
		animation = new Timeline();
		animation.getKeyFrames().add(new KeyFrame(Duration.millis(1000/60), new EventHandler<ActionEvent>() {
			@Override public void handle(ActionEvent actionEvent) {
				// 6 minutes data per frame
				for(int count=0; count < 6; count++) {
					nextTime();
					plotTime();
				}
			}
		}));
		animation.setCycleCount(Animation.INDEFINITE);
	}

	protected LineChart<Number, Number> createChart() {
		xAxis = new NumberAxis(0,25,5);
		final NumberAxis yAxis = new NumberAxis(0,100,10);
		final LineChart<Number,Number> lc = new LineChart<Number,Number>(xAxis,yAxis);
		// setup chart
		lc.setId("lineStockDemo");
		lc.setCreateSymbols(false);
		lc.setAnimated(false);
		lc.setLegendVisible(false);
		lc.setTitle("Task Viewer");
		xAxis.setLabel("Time");
		xAxis.setForceZeroInRange(false);
		yAxis.setLabel("Task Name");
		yAxis.setTickLabelFormatter(new NumberAxis.DefaultFormatter(yAxis,"$",null));
		// add starting data
		hourDataSeries = new XYChart.Series<Number,Number>();
		minuteDataSeries = new XYChart.Series<Number,Number>();
		// create some starting data

		minuteDataSeries.getData().add(new XYChart.Data<Number,Number>(timeInHours,prevY));
		for (double m=0; m<(60); m++) {
			nextTime();
			plotTime();
		}
		lc.getData().add(minuteDataSeries);
		lc.getData().add(hourDataSeries);
		return lc;
	}

	private void nextTime() {
		if (minutes == 59) {
			hours ++;
			minutes = 0;
		} else {
			minutes ++;
		}
		timeInHours = hours + ((1d/60d)*minutes);
	}

	private void plotTime() {
		if ((timeInHours % 1) == 0) {
			// change of hour
			double oldY = y;
			y = prevY - 10 + (Math.random()*20);
			prevY = oldY;
			while (y < 10 || y > 90) y = y - 10 + (Math.random()*20);
			if (timeInHours % 30 > 15){
				hourDataSeries.getData().add(new XYChart.Data<Number, Number>(timeInHours, 10));
			}else {
				hourDataSeries.getData().add(new XYChart.Data<Number, Number>(timeInHours, 20));
			}
			// after 25hours delete old data
			if (timeInHours > 25) hourDataSeries.getData().remove(0);
			// every hour after 24 move range 1 hour
			if (timeInHours > 24) {
				xAxis.setLowerBound(xAxis.getLowerBound()+1);
				xAxis.setUpperBound(xAxis.getUpperBound()+1);
			}
		}
		//double min = (timeInHours % 1);
		//double randomPickVariance = Math.random();

		//if (timeInHours > 25) minuteDataSeries.getData().remove(0);
	}

	public void play() {
		animation.play();
	}

	@Override public void stop() {
		animation.pause();
	}    

	@Override public void start(Stage primaryStage) throws Exception {
		init(primaryStage);
		primaryStage.show();
		play();
	}
	public static void main(String[] args) { launch(args); }
}