<?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=Sample_dynamic_line_chart</id>
		<title>Sample dynamic 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=Sample_dynamic_line_chart"/>
		<link rel="alternate" type="text/html" href="https://wiki.twig.es/index.php?title=Sample_dynamic_line_chart&amp;action=history"/>
		<updated>2026-05-06T17:35:59Z</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=Sample_dynamic_line_chart&amp;diff=2214&amp;oldid=prev</id>
		<title>George2 at 11:15, 14 July 2015</title>
		<link rel="alternate" type="text/html" href="https://wiki.twig.es/index.php?title=Sample_dynamic_line_chart&amp;diff=2214&amp;oldid=prev"/>
				<updated>2015-07-14T11:15:01Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;tr style='vertical-align: top;'&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 11:15, 14 July 2015&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&amp;quot;java&amp;quot;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;)&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&amp;quot;java&amp;quot;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;import javafx.application.Application;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;import javafx.application.Application;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>George2</name></author>	</entry>

	<entry>
		<id>https://wiki.twig.es/index.php?title=Sample_dynamic_line_chart&amp;diff=2213&amp;oldid=prev</id>
		<title>George2: Created page with &quot;&lt;source lang=&quot;java&quot;)  import javafx.application.Application; import javafx.collections.*; import javafx.geometry.Pos; import javafx.scene.*; import javafx.scene.chart.*; impor...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.twig.es/index.php?title=Sample_dynamic_line_chart&amp;diff=2213&amp;oldid=prev"/>
				<updated>2015-07-14T11:14:42Z</updated>
		
		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;lt;source lang=&amp;quot;java&amp;quot;)  import javafx.application.Application; import javafx.collections.*; import javafx.geometry.Pos; import javafx.scene.*; import javafx.scene.chart.*; impor...&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;)&lt;br /&gt;
&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.collections.*;&lt;br /&gt;
import javafx.geometry.Pos;&lt;br /&gt;
import javafx.scene.*;&lt;br /&gt;
import javafx.scene.chart.*;&lt;br /&gt;
import javafx.scene.chart.XYChart;&lt;br /&gt;
import javafx.scene.control.*;&lt;br /&gt;
import javafx.scene.layout.*;&lt;br /&gt;
import javafx.scene.shape.Line;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
 &lt;br /&gt;
import java.util.*;&lt;br /&gt;
 &lt;br /&gt;
// Demonstrates dynamically changing the data series assigned to a chart and applying css styles to the &lt;br /&gt;
// chart based on user selection and data series attributes.&lt;br /&gt;
public class DynamicLineChart extends Application {&lt;br /&gt;
  private LineChart&amp;lt;Number, Number&amp;gt; lineChart;&lt;br /&gt;
  private ObservableList&amp;lt;Event&amp;gt; events;&lt;br /&gt;
  private Pane layout = new HBox();&lt;br /&gt;
 &lt;br /&gt;
  @Override public void init() throws Exception {&lt;br /&gt;
    //defining the axes&lt;br /&gt;
    final NumberAxis xAxis = new NumberAxis();&lt;br /&gt;
    final NumberAxis yAxis = new NumberAxis();&lt;br /&gt;
    xAxis.setLabel(&amp;quot;Attempt&amp;quot;);&lt;br /&gt;
    yAxis.setLabel(&amp;quot;Distance (meters)&amp;quot;);&lt;br /&gt;
    xAxis.setMinorTickVisible(false);&lt;br /&gt;
    xAxis.setAutoRanging(false);&lt;br /&gt;
    xAxis.setLowerBound(1);&lt;br /&gt;
    xAxis.setUpperBound(3);&lt;br /&gt;
    xAxis.setTickUnit(1);&lt;br /&gt;
 &lt;br /&gt;
    //creating the chart&lt;br /&gt;
    lineChart = new LineChart&amp;lt;&amp;gt;(xAxis, yAxis);&lt;br /&gt;
    lineChart.setAnimated(false);&lt;br /&gt;
    lineChart.setTitle(&amp;quot;Event Performance&amp;quot;);&lt;br /&gt;
    events = FXCollections.observableArrayList(&lt;br /&gt;
       new Event(&amp;quot;Javelin&amp;quot;, &amp;quot;6 6&amp;quot;, FXCollections.observableArrayList(&lt;br /&gt;
          createSeries(&amp;quot;Javelin - Tokyo&amp;quot;, FXCollections.observableArrayList(18, 20, 22)),&lt;br /&gt;
          createSeries(&amp;quot;Javelin - Kyoto&amp;quot;, FXCollections.observableArrayList(23, 14, 15))&lt;br /&gt;
       )),&lt;br /&gt;
       new Event(&amp;quot;Hammer&amp;quot;, &amp;quot;12 2 2 12&amp;quot;, FXCollections.observableArrayList(&lt;br /&gt;
          createSeries(&amp;quot;Hammer - Tokyo&amp;quot;,  FXCollections.observableArrayList(12, 11, 5)),&lt;br /&gt;
          createSeries(&amp;quot;Hammer - Kyoto&amp;quot;,  FXCollections.observableArrayList(9, 8, 13))&lt;br /&gt;
       )),&lt;br /&gt;
       new Event(&amp;quot;Shotput&amp;quot;, &amp;quot;&amp;quot;, FXCollections.observableArrayList(&lt;br /&gt;
          createSeries(&amp;quot;Shotput - Tokyo&amp;quot;, FXCollections.observableArrayList(3, 2, 4)),&lt;br /&gt;
          createSeries(&amp;quot;Shotput - Kyoto&amp;quot;, FXCollections.observableArrayList(4, 6, 5))&lt;br /&gt;
       ))&lt;br /&gt;
    );        &lt;br /&gt;
    populateData(events, lineChart);&lt;br /&gt;
    &lt;br /&gt;
    // create some controls which can toggle series display on and off.&lt;br /&gt;
    final VBox eventChecks = new VBox(20);&lt;br /&gt;
    eventChecks.setStyle(&amp;quot;-fx-padding: 10;&amp;quot;);&lt;br /&gt;
    final TitledPane controlPane = new TitledPane(&amp;quot;Event Selection&amp;quot;, eventChecks);&lt;br /&gt;
    controlPane.setCollapsible(false);&lt;br /&gt;
    for (final Event event: events) {&lt;br /&gt;
      final CheckBox box = new CheckBox(event.getName());&lt;br /&gt;
      box.setSelected(true);&lt;br /&gt;
      Line line = new Line(0, 10, 50, 10);&lt;br /&gt;
      StringBuilder styleString = new StringBuilder(&amp;quot;-fx-stroke-width: 3; -fx-stroke: gray;&amp;quot;);&lt;br /&gt;
      if (event.getStrokeDashArray() != null &amp;amp;&amp;amp; !event.getStrokeDashArray().isEmpty()) {&lt;br /&gt;
        styleString.append(&amp;quot;-fx-stroke-dash-array: &amp;quot;).append(event.getStrokeDashArray()).append(&amp;quot;;&amp;quot;);&lt;br /&gt;
      }&lt;br /&gt;
      line.setStyle(styleString.toString());&lt;br /&gt;
      &lt;br /&gt;
      box.setGraphic(line);&lt;br /&gt;
      eventChecks.getChildren().add(box);&lt;br /&gt;
      box.setOnAction(action -&amp;gt; {&lt;br /&gt;
          event.setActive(box.isSelected());&lt;br /&gt;
          populateData(events, lineChart);&lt;br /&gt;
          styleSeries(events, lineChart);&lt;br /&gt;
        }&lt;br /&gt;
      );&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    Label caption = new Label(&lt;br /&gt;
        &amp;quot;The chart displays performance an athelete in selected events at various sporting meets.  &amp;quot;&lt;br /&gt;
      + &amp;quot;Events in which the athelete performed above average at a given meet are shown blue and &amp;quot;&lt;br /&gt;
      + &amp;quot;events at which the athelete performed below average are shown red.  For a given meet, &amp;quot;&lt;br /&gt;
      + &amp;quot;the athelete may make three attempts per event.  The red and blue highlighting is calculated &amp;quot;&lt;br /&gt;
      + &amp;quot;based on the average distance achieved for an event at a meet, not the longest distance achieved for the event at the meet.  Select events to display from the controls on the left.&amp;quot;&lt;br /&gt;
    );&lt;br /&gt;
    caption.setWrapText(true);&lt;br /&gt;
    &lt;br /&gt;
    // layout the scene&lt;br /&gt;
    HBox controlledChart =  new HBox(10,&lt;br /&gt;
          controlPane, lineChart&lt;br /&gt;
    );&lt;br /&gt;
    controlledChart.setAlignment(Pos.CENTER);&lt;br /&gt;
    VBox captionedChart = new VBox(10,&lt;br /&gt;
          controlledChart,&lt;br /&gt;
          caption&lt;br /&gt;
    );&lt;br /&gt;
    captionedChart.setAlignment(Pos.CENTER);&lt;br /&gt;
    HBox.setHgrow(lineChart, Priority.ALWAYS);&lt;br /&gt;
    VBox.setVgrow(captionedChart.getChildren().get(0), Priority.ALWAYS);&lt;br /&gt;
    layout.setStyle(&amp;quot;-fx-background-color: cornsilk; -fx-padding: 10;&amp;quot;);&lt;br /&gt;
    layout.getChildren().addAll(captionedChart);&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  @Override public void start(Stage stage) {&lt;br /&gt;
    stage.setTitle(&amp;quot;Sports Day Results&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    Scene scene = new Scene(layout, 800, 600);&lt;br /&gt;
    stage.setScene(scene);&lt;br /&gt;
    stage.show();&lt;br /&gt;
 &lt;br /&gt;
    styleSeries(events, lineChart);&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  private void populateData(final ObservableList&amp;lt;Event&amp;gt; events, final LineChart&amp;lt;Number, Number&amp;gt; lineChart) {&lt;br /&gt;
    lineChart.getData().clear();&lt;br /&gt;
    for (Event event: events) {&lt;br /&gt;
      if (event.isActive()) {&lt;br /&gt;
        lineChart.getData().addAll(event.getSeries());&lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  private void styleSeries(ObservableList&amp;lt;Event&amp;gt; events, final LineChart&amp;lt;Number, Number&amp;gt; lineChart) {&lt;br /&gt;
    // force a css layout pass to ensure that subsequent lookup calls work.&lt;br /&gt;
    lineChart.applyCss();&lt;br /&gt;
 &lt;br /&gt;
    // mark different series with different depending on whether they are above or below average.&lt;br /&gt;
    int nSeries = 0;&lt;br /&gt;
      for (Event event : events) {&lt;br /&gt;
          if (!event.isActive()) continue;&lt;br /&gt;
          for (int j = 0; j &amp;lt; event.getSeries().size(); j++) {&lt;br /&gt;
              XYChart.Series&amp;lt;Number, Number&amp;gt; series = event.getSeries().get(j);&lt;br /&gt;
              Set&amp;lt;Node&amp;gt; nodes = lineChart.lookupAll(&amp;quot;.series&amp;quot; + nSeries);&lt;br /&gt;
              for (Node n : nodes) {&lt;br /&gt;
                  StringBuilder style = new StringBuilder();&lt;br /&gt;
                  if (event.isBelowAverage(series)) {&lt;br /&gt;
                      style.append(&amp;quot;-fx-stroke: red; -fx-background-color: red, white; &amp;quot;);&lt;br /&gt;
                  } else {&lt;br /&gt;
                      style.append(&amp;quot;-fx-stroke: blue; -fx-background-color: blue, white; &amp;quot;);&lt;br /&gt;
                  }&lt;br /&gt;
                  if (event.getStrokeDashArray() != null &amp;amp;&amp;amp; !event.getStrokeDashArray().isEmpty()) {&lt;br /&gt;
                      style.append(&amp;quot;-fx-stroke-dash-array: &amp;quot;).append(event.getStrokeDashArray()).append(&amp;quot;;&amp;quot;);&lt;br /&gt;
                  }&lt;br /&gt;
 &lt;br /&gt;
                  n.setStyle(style.toString());&lt;br /&gt;
              }&lt;br /&gt;
              nSeries++;&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  private XYChart.Series&amp;lt;Number, Number&amp;gt; createSeries(String name, List&amp;lt;Number&amp;gt; data) {&lt;br /&gt;
    XYChart.Series&amp;lt;Number, Number&amp;gt; series = new XYChart.Series&amp;lt;&amp;gt;();&lt;br /&gt;
    series.setName(name);&lt;br /&gt;
    ObservableList&amp;lt;XYChart.Data&amp;lt;Number, Number&amp;gt;&amp;gt; seriesData = FXCollections.observableArrayList();&lt;br /&gt;
    for (int i = 0; i &amp;lt; data.size(); i++) {&lt;br /&gt;
      seriesData.add(new XYChart.Data&amp;lt;&amp;gt;(i+1, data.get(i)));&lt;br /&gt;
    }&lt;br /&gt;
    series.setData(seriesData);&lt;br /&gt;
    &lt;br /&gt;
    return series;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  private class Event {&lt;br /&gt;
    private String name;&lt;br /&gt;
    private ObservableList&amp;lt;XYChart.Series&amp;lt;Number, Number&amp;gt;&amp;gt; series;&lt;br /&gt;
    private String strokeDashArray;&lt;br /&gt;
    private boolean isActive = true;&lt;br /&gt;
 &lt;br /&gt;
    public String getName() { return name; }&lt;br /&gt;
    public String getStrokeDashArray() { return strokeDashArray; }&lt;br /&gt;
    &lt;br /&gt;
    public Event(String name, String strokeDashArray, ObservableList&amp;lt;XYChart.Series&amp;lt;Number, Number&amp;gt;&amp;gt; series) {&lt;br /&gt;
      this.name = name; this.strokeDashArray = strokeDashArray; this.series = series;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public boolean isBelowAverage(XYChart.Series&amp;lt;Number, Number&amp;gt; checkedSeries) {&lt;br /&gt;
      double checkedSeriesAvg = calcSeriesAverage(checkedSeries);&lt;br /&gt;
      double allSeriesAvgTot = 0;&lt;br /&gt;
      double seriesCount = series.size();&lt;br /&gt;
      for (XYChart.Series&amp;lt;Number, Number&amp;gt; curSeries: series) {&lt;br /&gt;
        allSeriesAvgTot += calcSeriesAverage(curSeries);&lt;br /&gt;
      } &lt;br /&gt;
      double allSeriesAvg = seriesCount != 0 ? allSeriesAvgTot / seriesCount: 0; &lt;br /&gt;
      &lt;br /&gt;
      return checkedSeriesAvg &amp;lt; allSeriesAvg;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public ObservableList&amp;lt;XYChart.Series&amp;lt;Number, Number&amp;gt;&amp;gt; getSeries() {&lt;br /&gt;
      return series;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private double calcSeriesAverage(XYChart.Series&amp;lt;Number, Number&amp;gt; series) {&lt;br /&gt;
      double sum = 0;&lt;br /&gt;
      int count = series.getData().size();&lt;br /&gt;
      for (XYChart.Data&amp;lt;Number, Number&amp;gt; data: series.getData()) {&lt;br /&gt;
        sum += data.YValueProperty().get().doubleValue();&lt;br /&gt;
      }&lt;br /&gt;
      return count != 0 ? sum / count : 0; &lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    private boolean isActive() {&lt;br /&gt;
      return isActive;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private void setActive(boolean isActive) {&lt;br /&gt;
      this.isActive = isActive;&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;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>George2</name></author>	</entry>

	</feed>