<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Rachael E</title>
    <description>The latest articles on DEV Community by Rachael E (@rachaele).</description>
    <link>https://dev.to/rachaele</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F991512%2Fef887a96-5fc0-46b9-b75d-90d3574ea544.jpeg</url>
      <title>DEV Community: Rachael E</title>
      <link>https://dev.to/rachaele</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rachaele"/>
    <language>en</language>
    <item>
      <title>How to change the font size of Date Range text on Flutter's DateRangePicker</title>
      <dc:creator>Rachael E</dc:creator>
      <pubDate>Tue, 13 May 2025 14:43:38 +0000</pubDate>
      <link>https://dev.to/rachaele/how-to-change-the-font-size-of-date-range-text-on-flutters-daterangepicker-4d82</link>
      <guid>https://dev.to/rachaele/how-to-change-the-font-size-of-date-range-text-on-flutters-daterangepicker-4d82</guid>
      <description>&lt;p&gt;Whilst working on my latest Flutter project, it took me a long time to figure out how to change the annoyingly large text representing the date range display on Flutter's &lt;a href="https://api.flutter.dev/flutter/material/showDateRangePicker.html" rel="noopener noreferrer"&gt;DateRangePicker&lt;/a&gt; (input mode) from Flutter. In this mini blog I'll share how you can change the font size and style of the text elements within Flutter's &lt;a href="https://dev.tourl"&gt;DateRangePicker&lt;/a&gt; UI. &lt;/p&gt;

&lt;p&gt;As you can see below, for my date range field, the default DateRangePicker UI displays text with a font size that is far too large, and overruns into the adjacent Calendar icon.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmffc22ruyi9dn41e1xg9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmffc22ruyi9dn41e1xg9.png" alt="Black box displaying calendar entries as text" width="676" height="576"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To address this, you need to include a &lt;a href="https://api.flutter.dev/flutter/widgets/Builder-class.html" rel="noopener noreferrer"&gt;Builder&lt;/a&gt; in your showDateRangePicker function. This is also useful when you want to customise an app theme that differs from Flutter's own default style.  The &lt;code&gt;builder&lt;/code&gt; lets you override the default styling by supplying your own custom &lt;a href="https://api.flutter.dev/flutter/material/Theme-class.html" rel="noopener noreferrer"&gt;Theme&lt;/a&gt; to the widget. &lt;/p&gt;

&lt;p&gt;Here's my code for building the date range picker widget including the &lt;code&gt;builder&lt;/code&gt; to override the default styling (we haven't changed any font sizes yet). In the &lt;code&gt;builder&lt;/code&gt; I return a theme which contains my desired colour scheme.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;showDateRangePicker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nl"&gt;context:&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;initialEntryMode:&lt;/span&gt; &lt;span class="n"&gt;DatePickerEntryMode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;helpText:&lt;/span&gt; &lt;span class="s"&gt;'Select range within the past 14 months'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;firstDate:&lt;/span&gt; &lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;subtract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;days:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="nl"&gt;lastDate:&lt;/span&gt; &lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="nl"&gt;initialDateRange:&lt;/span&gt; &lt;span class="n"&gt;DateTimeRange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;start:&lt;/span&gt; &lt;span class="n"&gt;initialStart&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;end:&lt;/span&gt; &lt;span class="n"&gt;initialEnd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nl"&gt;builder:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;child&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Theme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;data:&lt;/span&gt; &lt;span class="n"&gt;ThemeData&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dark&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;copyWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="c1"&gt;// custom theme&lt;/span&gt;
            &lt;span class="nl"&gt;colorScheme:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;ColorScheme&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
              &lt;span class="nl"&gt;primary:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;amber&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="nl"&gt;onPrimary:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;black&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="nl"&gt;surface:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;black&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="nl"&gt;onSurface:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;white&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="nl"&gt;secondary:&lt;/span&gt; &lt;span class="n"&gt;Color&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromARGB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;98&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;85&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="p"&gt;),&lt;/span&gt;
           &lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;child&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that you have the &lt;code&gt;builder&lt;/code&gt;, you can use its &lt;a href="https://api.flutter.dev/flutter/material/TextTheme-class.html" rel="noopener noreferrer"&gt;textTheme&lt;/a&gt; property to access the &lt;a href="https://api.flutter.dev/flutter/painting/TextStyle-class.html" rel="noopener noreferrer"&gt;TextStyle&lt;/a&gt; of each UI element that controls font sizes and styles. In the code below, I've included the properties of &lt;code&gt;textTheme&lt;/code&gt; that are required to set the font size of text elements within the date range picker (input mode) specifically. These also work within the calendar mode option.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;            &lt;span class="nl"&gt;textTheme:&lt;/span&gt; &lt;span class="n"&gt;TextTheme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
              &lt;span class="nl"&gt;headlineLarge:&lt;/span&gt; &lt;span class="n"&gt;TextStyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                  &lt;span class="nl"&gt;fontSize:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                  &lt;span class="nl"&gt;fontWeight:&lt;/span&gt; &lt;span class="n"&gt;FontWeight&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
              &lt;span class="nl"&gt;bodyLarge:&lt;/span&gt; &lt;span class="n"&gt;TextStyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                  &lt;span class="nl"&gt;fontSize:&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="nl"&gt;fontWeight:&lt;/span&gt; &lt;span class="n"&gt;FontWeight&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
              &lt;span class="nl"&gt;bodySmall:&lt;/span&gt; &lt;span class="n"&gt;TextStyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;fontSize:&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
              &lt;span class="nl"&gt;labelLarge:&lt;/span&gt; &lt;span class="n"&gt;TextStyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                  &lt;span class="nl"&gt;fontSize:&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="nl"&gt;fontWeight:&lt;/span&gt; &lt;span class="n"&gt;FontWeight&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="p"&gt;)),&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So that's four properties within &lt;code&gt;textTheme&lt;/code&gt; that allow you to change the font size within the date range picker UI:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;headlineLarge&lt;/code&gt;: controls the "Date Range" text preview&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bodyLarge&lt;/code&gt;: controls the field start and field end label text boxes&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bodySmall&lt;/code&gt;: controls the error text&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;labelLarge&lt;/code&gt;: controls the help text and confirm/cancel text&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; since you have access to TextStyles, you can change not only font size but also properties such as font weight (bold, italic, etc), font family, spacing, shadows etc.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here's how this translates visually, using the dateRangePicker properties to illustrate which part of the UI they are found in. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; the text showing "Date Range" can't be set programmatically like the others as it can only take a DateTimeRange - its style is controlled using the "headlineLarge" text theme property.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyept8cwfvsws00uxnz5b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyept8cwfvsws00uxnz5b.png" alt="Black box displaying calendar entries with code labels" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's the full code, including the relevant properties within showDateRangePicker that we later control with the textTheme:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;showDateRangePicker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nl"&gt;context:&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;initialEntryMode:&lt;/span&gt; &lt;span class="n"&gt;DatePickerEntryMode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;helpText:&lt;/span&gt; &lt;span class="s"&gt;'helpText'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;confirmText:&lt;/span&gt; &lt;span class="s"&gt;'confirmText'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;cancelText:&lt;/span&gt; &lt;span class="s"&gt;'cancelText'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;fieldStartLabelText:&lt;/span&gt; &lt;span class="s"&gt;"fieldStartLabelText"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;fieldEndLabelText:&lt;/span&gt; &lt;span class="s"&gt;"fieldEndLabelText"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;errorInvalidText:&lt;/span&gt; &lt;span class="s"&gt;"errorInvalidText"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;errorInvalidRangeText:&lt;/span&gt; &lt;span class="s"&gt;"errorInvalidRangeText"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;errorFormatText:&lt;/span&gt; &lt;span class="s"&gt;"errorFormatText"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;firstDate:&lt;/span&gt; &lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;subtract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;days:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="nl"&gt;lastDate:&lt;/span&gt; &lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="nl"&gt;initialDateRange:&lt;/span&gt; &lt;span class="n"&gt;DateTimeRange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;start:&lt;/span&gt; &lt;span class="n"&gt;initialStart&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;end:&lt;/span&gt; &lt;span class="n"&gt;initialEnd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nl"&gt;builder:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;child&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Theme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;data:&lt;/span&gt; &lt;span class="n"&gt;ThemeData&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dark&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;copyWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nl"&gt;colorScheme:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;ColorScheme&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="nl"&gt;primary:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;amber&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="nl"&gt;onPrimary:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;black&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="nl"&gt;surface:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;black&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="nl"&gt;onSurface:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;white&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="nl"&gt;secondary:&lt;/span&gt; &lt;span class="n"&gt;Color&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromARGB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;98&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;85&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="nl"&gt;error:&lt;/span&gt; &lt;span class="n"&gt;Color&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromARGB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;233&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;111&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;102&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
            &lt;span class="nl"&gt;dialogTheme:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;DialogTheme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;backgroundColor:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;black&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="nl"&gt;textTheme:&lt;/span&gt; &lt;span class="n"&gt;TextTheme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
              &lt;span class="nl"&gt;headlineLarge:&lt;/span&gt; &lt;span class="n"&gt;TextStyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                  &lt;span class="nl"&gt;fontSize:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                  &lt;span class="nl"&gt;fontWeight:&lt;/span&gt; &lt;span class="n"&gt;FontWeight&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;// date range text&lt;/span&gt;
              &lt;span class="nl"&gt;bodyLarge:&lt;/span&gt; &lt;span class="n"&gt;TextStyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                  &lt;span class="nl"&gt;fontSize:&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="nl"&gt;fontWeight:&lt;/span&gt; &lt;span class="n"&gt;FontWeight&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;// field start &amp;amp; field end label text&lt;/span&gt;
              &lt;span class="nl"&gt;bodySmall:&lt;/span&gt; &lt;span class="n"&gt;TextStyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;fontSize:&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;// error text&lt;/span&gt;
              &lt;span class="nl"&gt;labelLarge:&lt;/span&gt; &lt;span class="n"&gt;TextStyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                  &lt;span class="nl"&gt;fontSize:&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="nl"&gt;fontWeight:&lt;/span&gt; &lt;span class="n"&gt;FontWeight&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;// help text and confirm/cancel text&lt;/span&gt;
            &lt;span class="p"&gt;)),&lt;/span&gt;
        &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;child&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;And there we have it! An easy way to find how to change the font size and style of text elements within the dateRangePicker widget from Flutter. Now that I've learned which textTheme properties are linked to which dateRangePicker text field properties, I can control the UI in a way that fits the means of my app design. &lt;/p&gt;

&lt;p&gt;The same concepts will apply to other widgets, but I've focussed on the date range picker in this blog. If there was another really obvious way of changing the font size that I've missed, please let me know in the comments! &lt;/p&gt;

&lt;p&gt;The final date range picker for my app with corrected font size!&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3a0xf9fpjqlwuj1vcnc2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3a0xf9fpjqlwuj1vcnc2.png" alt="Black box displaying calendar input options" width="750" height="710"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>beginners</category>
      <category>mobile</category>
      <category>ui</category>
    </item>
    <item>
      <title>How to be more productive when learning a new language</title>
      <dc:creator>Rachael E</dc:creator>
      <pubDate>Fri, 09 Aug 2024 15:22:09 +0000</pubDate>
      <link>https://dev.to/rachaele/how-to-be-more-productive-when-learning-a-new-language-20g5</link>
      <guid>https://dev.to/rachaele/how-to-be-more-productive-when-learning-a-new-language-20g5</guid>
      <description>&lt;p&gt;You know that way when you pick up a new programming language? You've coded before, picking a new one up should be a breeze...every one is talking about it after all and it's the next best thing since sliced bread. But - then you start and you realise there's actually a lot more to it than your previous coding experience and you basically have to start and learn everything again from scratch. It all starts to stack and feel a bit insurmountable and then finally oops! You're stuck in the brain bog being unproductive. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faj7ugelqr94o0v94spqa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faj7ugelqr94o0v94spqa.png" alt="Comic strip showing a path eventually ending up in a bog with a cartoon brain sitting unhappily in the middle" width="800" height="297"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Well this happened recently when I was learning how to use Flutter for the first time to build an app for work that &lt;a href="https://www.esri.com/arcgis-blog/products/developers/developers/mapping-coffee-flutter-maps-sdk/" rel="noopener noreferrer"&gt;maps the countries where coffee comes from&lt;/a&gt;. I was excited to learn a new language and quickly remembered/realised...learning new stuff is &lt;strong&gt;hard&lt;/strong&gt;. Maybe it's just my brain but there were so many new things to learn for this project. It all felt just a &lt;em&gt;tad&lt;/em&gt; overwhelming and like the end result was very far away.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm454qmgd7brfk5hn5nfy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm454qmgd7brfk5hn5nfy.png" alt="A cartoon brain standing confusedly at the base of a cliff wondering how to get to the top" width="448" height="412"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is of course the classic steep learning curve when it comes to learning anything new and is completely normal and natural, especially when there are multiple new elements to learn. In my case, that was learning Dart, Flutter, VSCode, mobile development, working with GeoJSON, UI, UX etc...&lt;/p&gt;

&lt;p&gt;To help combat brain boggage and those difficulties in knowing how to get to the end result, I found it helped my productivity to make the most of online tools and resources to help me along the way. Every brain is different, and we all learn in different ways, but finding the right tools can feel like a life line when you are feeling stuck. &lt;/p&gt;

&lt;p&gt;Here are some things that helped me up the steep learning curve and ultimately made me more productive than I would have been otherwise!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0rie5nttwl90autsa3qw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0rie5nttwl90autsa3qw.png" alt="A cartoon brain in a life buoy floating in a bog looking happy" width="293" height="343"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Get Started Guides&lt;/strong&gt;&lt;br&gt;
Rather than jumping in and madly splashing around hoping for the best, I started slow and worked through the &lt;a href="https://docs.flutter.dev/get-started/codelab" rel="noopener noreferrer"&gt;Write your first Flutter&lt;/a&gt; app guide. This has so far been one of my favourite coding get started resources - it's presented in a Codelab, and is really accessible, giving you the option of either reading through, or watching YouTube snippets of the steps as you go through the tutorial. I also enjoyed the little artworks keeping it all friendly and easy to understand. The more accessible a get started guide is, the better and I appreciated options for all kinds of learning from the folks at Flutter for that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Sample Code&lt;/strong&gt;&lt;br&gt;
These days there's just no need to have the expectation on you to write every piece of code completely from scratch from the depths of your brain. I mean you can, if that's your gig. But after getting the basics of Flutter down, I found it very helpful to look through sample code to help me get my eye in. This included Flutter example code (and videos) and also code from the &lt;a href="https://github.com/Esri/arcgis-maps-sdk-flutter-samples/tree/main/ios" rel="noopener noreferrer"&gt;ArcGIS Maps SDK for Flutter beta sample repo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Deserializing JSON into objects&lt;/strong&gt;&lt;br&gt;
I knew for this project I'd have to deserialize &lt;a href="https://geojson.org/" rel="noopener noreferrer"&gt;GeoJSON&lt;/a&gt; into objects to work with them effectively in the app. Building this beast of a class felt quite daunting for being brand new to Dart and also for what was quite a complex GeoJSON file. However, I found an open source library called &lt;a href="https://github.com/glideapps/quicktype" rel="noopener noreferrer"&gt;quicktype&lt;/a&gt; that generates strongly-typed models and serializers from JSON type scripts to a number of languages, including Dart. All you have to do is put in the JSON you want decoded, and it will return a prebuilt class that you can then use in your project. Quicktype have a handy website front end (&lt;a href="https://app.quicktype.io/" rel="noopener noreferrer"&gt;https://app.quicktype.io/&lt;/a&gt;) for this - it worked first time and I was so grateful not to have to build this myself!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. JSON Formatter&lt;/strong&gt;&lt;br&gt;
The GeoJSON file I used is super hefty, holding nested geographical information about country border locations as coordinate pairs, and information on country geometry, name etc. There are any number of ways you can show this file to get it to make sense, but I found another online tool that helped me break it down into readable chunks was &lt;a href="https://jsonformatter.org/" rel="noopener noreferrer"&gt;JSON Formatter&lt;/a&gt;. It also helps validate JSON, useful if you're editing and accidentally remove a bracket...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. API Key storage&lt;/strong&gt;&lt;br&gt;
This problem isn't unique to Dart or Flutter, but it did help to learn of the options available for it from this helpful blog post by &lt;a href="https://codewithandrea.com/articles/flutter-api-keys-dart-define-env-files/" rel="noopener noreferrer"&gt;Andrea Bizzotto&lt;/a&gt;. I ended up using the &lt;a href="https://pub.dev/packages/envied" rel="noopener noreferrer"&gt;envied&lt;/a&gt; package as it was straightforward and intuitive to implement!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. ChatGPT&lt;/strong&gt;&lt;br&gt;
I've learned that using ChatGPT as an assistant for "reviewing" code / making code "suggestions" allows me to not only get unblocked quickly, but also to learn why things didn't work the way I expected.  For example, it helped me get out of a confused rut when it came to implementing a grid view within a sliding up panel. I gave it the code I had along with a prompt to review it and make suggestions as to why it wasn't working in the way I intended. It then suggested compilable code and explained what I was missing, and broke it down into easy to read steps that I could understand.  I find trawling through StackOverflow etc pretty exhausting and overwhelming (and brain-boggling) so it was great to have ChatGPT available as a tool to help me get unstuck. &lt;/p&gt;

&lt;p&gt;A word of caution though, don't blindly follow it - it will make mistakes (e.g. incorrect method names, wrong imports, won't compile, doesn't know full app context, etc), and it won't always do what you want. You may also have a better way of structuring the code than what it suggests. So take it with a pinch of salt otherwise use it as a great learning tool in the absence of a team to bounce it off!&lt;/p&gt;

&lt;h2&gt;
  
  
  Happily ever after
&lt;/h2&gt;

&lt;p&gt;Eventually I got the app (sneak peek below) completed thanks to these productivity enhancers (check it out here on &lt;a href="https://github.com/Rachael-E/coffee_crib" rel="noopener noreferrer"&gt;Github&lt;/a&gt;)! If anyone has any other favourite online resources or open source tools they use for productivity and making learning new languages easier, I'd love to hear them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu4n7cjb23fkehteu4acf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu4n7cjb23fkehteu4acf.png" alt="Image description" width="800" height="574"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>learning</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Journey into Javascript: My First-time Speaking Experience at a Tech Meetup</title>
      <dc:creator>Rachael E</dc:creator>
      <pubDate>Mon, 15 Jan 2024 12:51:21 +0000</pubDate>
      <link>https://dev.to/rachaele/journey-into-javascript-my-first-time-speaking-experience-at-a-tech-meetup-4mhe</link>
      <guid>https://dev.to/rachaele/journey-into-javascript-my-first-time-speaking-experience-at-a-tech-meetup-4mhe</guid>
      <description>&lt;p&gt;Stepping into the &lt;a href="https://www.edinburghjs.org/" rel="noopener noreferrer"&gt;EdinburghJS Meetup&lt;/a&gt; as a speaker marked a unique experience for me. Whilst I have spoken at conferences before, public speaking is still very much something I'm gaining experience and confidence in, and I'm learning that speaking in different environments requires different approaches. This particular venture presented an extra layer of challenge — I had little prior experience in developing with JavaScript! Yet when invited to speak at a tech meetup for the first time, in a programming language I wasn't familiar with...I surprised myself by saying yes! &lt;/p&gt;

&lt;p&gt;In this blog post I'll share my reflections and tips from the journey, from the unexpected invitation to speak, to creating my first Javascript Maps SDK geospatial application and to my experience of attending and speaking at the meetup.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Introduction
&lt;/h2&gt;

&lt;p&gt;It's funny how apparently unrelated events can lead to opportunities. I don't use &lt;a href="https://twitter.com/Geolocoder" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; (well, X now I guess) very often, but when I do I'll occasionally post about some dev event or another, or look out for developer content to follow. In this case, I had started following the &lt;a href="https://twitter.com/scottechclub" rel="noopener noreferrer"&gt;Scottish Technology Club&lt;/a&gt;, when I received a message from the organiser, Jamie. He noticed from my previous posts/profile that I was involved with developer outreach and asked if I gave talks on my work. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhzm4qhm8i4aolujaj05z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhzm4qhm8i4aolujaj05z.png" alt="Twitter conversation" width="602" height="202"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We then had a phone call, and despite my admissions that I wasn't in fact a Javascript developer, was invited to give a talk at the EdinburghJS Meetup to introduce Esri's &lt;a href="https://developers.arcgis.com/javascript/latest/" rel="noopener noreferrer"&gt;ArcGIS Maps SDK for Javascript&lt;/a&gt; (aka Javascript Maps SDK). As I'd always been curious about the EdinburghJS Meetup, and had been looking for more opportunities to get involved in the local developer scene, it was a really timely exchange and a great opportunity to accept. &lt;/p&gt;

&lt;p&gt;What really helped me accept the invitation was how friendly the chat was, knowing that my experience would be accepted despite my fears, having an idea for the format ahead of time, and that we had talked through good options of what to speak at an introductory level.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tip
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;You never know where sharing the things you are doing for your work may end up. Remain open and curious to opportunities, and have conversations if you're not sure something is for you - you might surprise yourself and find ways to help you continue growing and learning in areas you are interested in! And meet some lovely people whilst doing so!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Preparation
&lt;/h2&gt;

&lt;p&gt;Truth be told, I didn't initially know how to start this talk. I'm a developer, not a sales person, so found myself worrying my talk might come across too pitchy. Plus the fact my Javascript was extremely rusty and I hadn't worked with the Javascript Maps SDK before. I thought it would therefore be fun to roll with a pet project to combat that.&lt;/p&gt;

&lt;p&gt;I had an idea in mind - when I'm working from the office, I want to understand where is most efficient to meet a friend coming from the other side of the city within a lunch break. I therefore wanted to build a simple geospatial application (find the code for this on &lt;a href="https://github.com/Rachael-E/edinburghjs-meetup-walktimedemo" rel="noopener noreferrer"&gt;my GitHub&lt;/a&gt;) that could calculate walk times from each of our locations, and show the area of overlap that we could both reach within that walk time. &lt;/p&gt;

&lt;p&gt;Additionally, I also wanted to count how many points of interest we'd be able to see within that area - for this example, I used a &lt;a href="https://services.arcgis.com/V6ZHFr6zdgNZuVG0/arcgis/rest/services/All_Edinburgh_Trees/FeatureServer/0" rel="noopener noreferrer"&gt;dataset of tree locations&lt;/a&gt; from City of Edinburgh Council.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgbngssyd36mg9qraoomg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgbngssyd36mg9qraoomg.png" alt="Map showing a polygon and tree locations" width="800" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I spent a lot of time reading through the &lt;a href="https://developers.arcgis.com/javascript/latest/get-started/" rel="noopener noreferrer"&gt;ArcGIS Maps SDK for Javascript doc&lt;/a&gt; to learn how to get started, and soon had a map displaying locally on my browser. What I really liked about the Javascript Maps SDK was how many widgets were available to display common map elements - for example, a &lt;a href="https://developers.arcgis.com/javascript/latest/sample-code/widgets-basemapgallery/" rel="noopener noreferrer"&gt;basemap gallery widget&lt;/a&gt; (allowing the user to switch between basemaps) was super simple to add in to my app. I had been anticipating having to build one myself, which had been a worrying thought as time was ticking by rapidly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzmgywe5eob6q5nmk2lmd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzmgywe5eob6q5nmk2lmd.png" alt="Code snippet and image of basemap gallery" width="800" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I also really enjoyed designing the look of the app using the ArcGIS Developer's &lt;a href="https://developers.arcgis.com/calcite-design-system/" rel="noopener noreferrer"&gt;Calcite Design System&lt;/a&gt;, a library full of beautifully designed icons, web components and UI elements.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe3zb0wl8qr6sropkyzsb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe3zb0wl8qr6sropkyzsb.png" alt="Code snippets and screenshot image of UI element" width="800" height="251"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As well as the official doc, I also looked up &lt;a href="https://codepen.io/search/pens?q=js.arcgis.com" rel="noopener noreferrer"&gt;code samples on Codepen.io&lt;/a&gt;, as the samples provided by the doc didn't always show me the workflows that I was looking for.&lt;/p&gt;

&lt;p&gt;Presenting at the meetup gave me a great excuse to really get to grips with an unfamiliar language and library. It was a great way to push me outside my comfort zone, and as a result grow my skills and increase in my confidence in picking up unfamiliar tech. And I really enjoyed building it (check out the gif below to see the final thing)!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F88lxprv5puww0mtaj6ku.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F88lxprv5puww0mtaj6ku.gif" alt="Gif of a geospatial mapping application in action" width="600" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Tip
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;So my tips for presenting in a language you aren't familiar with are - just get started! Find something you are interested in building (that'll make everything so much more enjoyable), and work through some get started guides in whatever medium works best for you. Hunt around for other code examples - it's likely the thing you want to do has already been done before, so save yourself some time by looking round and then use examples as your launch pad!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Talk
&lt;/h2&gt;

&lt;p&gt;I was nervous to turn up to the &lt;a href="https://www.edinburghjs.org/" rel="noopener noreferrer"&gt;EdinburghJS Meetup&lt;/a&gt; itself with me having little JS experience and not knowing the community well. However it definitely helped chatting with the organiser before hand, and I also invited along a friend and a colleague for moral support. As an introvert social support is so reassuring, and it was nice to also see some friendly faces in the crowd from some other speaking events I'd done! &lt;/p&gt;

&lt;p&gt;I was welcomed immediately walking in however, and all my fears were proven wrong. The organisers walked through all the set up with me which really helped put my mind at ease. I was still nervous when 90 or so developers started filling the room, and who knows how many more watching on livestream! &lt;/p&gt;

&lt;p&gt;It helped that I had practiced the talk before hand, both alone and with colleagues before hand, so when it came time to speak I was prepared and knew it would be ok! If you'd like to check out the talk you can find it &lt;a href="https://www.youtube.com/watch?v=bwpkFsfIOQg" rel="noopener noreferrer"&gt;on YouTube here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5irhlfjxso1br1je4sfb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5irhlfjxso1br1je4sfb.png" alt="Author speaking in front of an audience" width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After the talk I had lots of lovely chats with other folks there, so it was a really great way to get to know more local developers. &lt;/p&gt;

&lt;h3&gt;
  
  
  Tip
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Practice your talk before hand, either alone or with others. This will give you more confidence and allow you to enjoy public speaking more! Also invite friends or colleagues along - it's a real morale boost knowing you have friendly faces in the audience. Stick around after your talk, as you never know what conversations might arise and what opportunities may come from them - new meetup friends hopefully! &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;I feel very lucky that my first time talking at a tech meetup was a really great experience. This was in large part thanks to the friendly and approachable nature of the organiser (shout out to Jamie!) but also a good opportunity for me to pick up more skills in Javascript and the Javascript Maps SDK that I wouldn't have otherwise had a good excuse for. &lt;/p&gt;

&lt;p&gt;Presenting at a tech meetup has increased my public speaking skills and allowed me networking opportunities with local developers. It also gave me the unexpected benefit of enabling me to expand my web app building skills and therefore my confidence in coding and coming up with creative projects. &lt;/p&gt;

&lt;p&gt;Overall it was a really great experience and I wouldn't hesitate to recommend any aspiring speakers to consider speaking at a tech meetup in future! &lt;/p&gt;

&lt;p&gt;P.S. If you're based in Scotland, you can check out the &lt;a href="https://www.scottishtechnology.club/" rel="noopener noreferrer"&gt;Scottish Technology Club&lt;/a&gt; to find a curated and up to date list of active, local tech meetups.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdgbmnuteut2is2bsowpg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdgbmnuteut2is2bsowpg.png" alt="Author presenting tech demo" width="800" height="229"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Credit: Blog header image from &lt;a href="https://www.jamiemchale.com/journal/2023-11-22-edinburgh-js-maps-and-testing" rel="noopener noreferrer"&gt;https://www.jamiemchale.com/journal/2023-11-22-edinburgh-js-maps-and-testing&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>speaking</category>
      <category>techtalks</category>
      <category>javascript</category>
      <category>community</category>
    </item>
    <item>
      <title>How to use the JavaFX library Medusa to display weather data</title>
      <dc:creator>Rachael E</dc:creator>
      <pubDate>Fri, 25 Aug 2023 10:04:09 +0000</pubDate>
      <link>https://dev.to/rachaele/how-to-use-the-javafx-library-medusa-to-display-weather-data-10a9</link>
      <guid>https://dev.to/rachaele/how-to-use-the-javafx-library-medusa-to-display-weather-data-10a9</guid>
      <description>&lt;p&gt;In this post, I’ll share how I used the Medusa JavaFX library in a Java Raspberry Pi based app to display weather data! &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7vvobaz2qmyd9ch2hnyw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7vvobaz2qmyd9ch2hnyw.png" alt="Three gauges showing weather information" width="780" height="780"&gt;&lt;/a&gt;&lt;/p&gt;
Weather station app built with Java displaying live weather data feed data information, using the Medusa JavaFX Library.



&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;My colleague recently asked me “can you make my Java application look more exciting?”. Music to my ears – a creative project is always a joy to work on! &lt;/p&gt;

&lt;p&gt;The project in question was a weather station style &lt;a href="https://github.com/mbcoder/weather-station" rel="noopener noreferrer"&gt;app that runs on a Raspberry Pi&lt;/a&gt;, built with the Pi4J Java library to read sensors that measure humidity, temperature, and air pressure, and then integrated with the ArcGIS Maps SDK for Java to host the location and data online. &lt;/p&gt;

&lt;p&gt;The idea was that the live weather data should be displayed on a screen also plugged into the Raspberry Pi, to give up to date data readings.&lt;/p&gt;

&lt;p&gt;When I picked up the project, the app used a basic JavaFX UI display consisting of button and label components and looked like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7qqs2phtyhy570zuuk9n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7qqs2phtyhy570zuuk9n.png" alt="Basic user interface with text labels" width="484" height="172"&gt;&lt;/a&gt;&lt;/p&gt;
How the app looked before – JavaFX buttons and labels



&lt;p&gt;We both agreed this could look a lot more engaging, and so developed the following criteria to upgrade the UI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;The app should display a temperature reading (from the sensors connected to the  Raspberry Pi sensors). The display should be able to show the reading, the unit, and show negative values.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;The app should also display a relative humidity percentage reading&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;It should also show atmospheric pressure, in the style of a barometer where the pressure reading reflects the weather conditions (like the image below).&lt;/em&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgzo5j7ybsuy2qgn7tch2.png" alt="Image of antique style barometer" width="800" height="625"&gt;Antique style barometer that depending on air pressure will point toward what weather condition can be expected. Image from: &lt;a href="https://scottishmerchants.com/" rel="noopener noreferrer"&gt;https://scottishmerchants.com/&lt;/a&gt;

&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Building with JavaFX
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://openjfx.io/" rel="noopener noreferrer"&gt;JavaFX&lt;/a&gt; (an open source, next generation client application platform for desktop, mobile and embedded systems) has many useful out the box UI controls to build modern interactive desktop apps. These include buttons, checkboxes, list views, labels etc, that can be configured and styled in countless ways. I’ve using them for many years at work &lt;a href="https://github.com/Esri/arcgis-maps-sdk-java-samples" rel="noopener noreferrer"&gt;building mapping apps&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;JavaFX is of course fully extendable beyond these core basic controls – however, there is no out the box offering for displaying gauge or dial like controls to show data, which is what was required for this app. This project was therefore a fun opportunity to build a visually engaging app, and so I looked around for open source JavaFX libraries that could deliver a gauge like interface easily. &lt;/p&gt;

&lt;p&gt;That's when I came across &lt;a href="https://github.com/HanSolo/medusa/tree/master" rel="noopener noreferrer"&gt;Medusa&lt;/a&gt;, a JavaFX library for Gauges.&lt;/p&gt;

&lt;h2&gt;
  
  
  Medusa JavaFX library
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://github.com/HanSolo/medusa" rel="noopener noreferrer"&gt;GitHub repo for Medusa&lt;/a&gt; is a great resource for numerous modern looking UI gauge controls, maintained by its creator &lt;a href="https://harmoniccode.blogspot.com/" rel="noopener noreferrer"&gt;Gerrit Grunwald&lt;/a&gt;. Gerrit also maintains the &lt;a href="https://github.com/HanSolo/charts" rel="noopener noreferrer"&gt;Charts&lt;/a&gt; JavaFX library that I have been enjoying experimenting with for other Java projects.&lt;/p&gt;

&lt;p&gt;Finding the Medusa repo was a joy, as it saved me a lot of time and effort trying to design such a beautiful UI myself. It was also so good to see capabilities of JavaFX shine through in this repo - JavaFX doesn’t seem to get talked about all that often (maybe I'm just looking in the wrong places!) so much respect and thanks to the creator of this library for championing and showcasing what JavaFX is really capable of!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2zy43gyd1gyu7q4spxn5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2zy43gyd1gyu7q4spxn5.png" alt="Multiple gauge styles" width="800" height="465"&gt;&lt;/a&gt;&lt;/p&gt;
Gauge controls available within the Medusa Library, `Demo.java`



&lt;h3&gt;
  
  
  Trouble shooting Medusa
&lt;/h3&gt;

&lt;p&gt;I initially had some difficulty figuring out how to build the controls in Medusa. Here are some resources that I wish I’d known about when getting started:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can find really helpful background and documentation on Medusa in its original &lt;a href="https://forums.oracle.com/ords/apexds/post/medusa-gauges-for-javafx-0125" rel="noopener noreferrer"&gt;release blog post&lt;/a&gt;.
&lt;/li&gt;
&lt;li&gt;There is a demo you can run to see all the gauges running interactively (see above image). Clone the Medusa GitHub &lt;a href="https://github.com/HanSolo/medusa" rel="noopener noreferrer"&gt;repo&lt;/a&gt;, and run the &lt;code&gt;DemoLauncher&lt;/code&gt; class. There are also other demos you can run in the &lt;a href="https://github.com/HanSolo/medusademo/tree/master" rel="noopener noreferrer"&gt;medusademo GitHub repo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;You can define your UI layout with Medusa gauges in FXML, allowing you to write a modern MVC style application. You just have to ensure your &lt;code&gt;Controller&lt;/code&gt; class implements the &lt;code&gt;Initializable&lt;/code&gt; class, and override the &lt;code&gt;initialize&lt;/code&gt; method. There is also an &lt;a href="https://github.com/HanSolo/medusademo/blob/master/src/main/java/eu/hansolo/FXMLDemoController.java" rel="noopener noreferrer"&gt;example demo&lt;/a&gt; for this in the medusademo repo.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Controller&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Initializable&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

   &lt;span class="nd"&gt;@Override&lt;/span&gt;
   &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;URL&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;ResourceBundle&lt;/span&gt; &lt;span class="n"&gt;rB&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
   &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;If you’re configuring a gauge and a value isn’t displaying, it’s probably because you’ll have to set the value visibility to &lt;code&gt;true&lt;/code&gt;. The Medusa library controls a lot of the initial control behaviour under the hood, so be prepared to undo some of that when building your controls. &lt;/li&gt;
&lt;li&gt;You can use the &lt;code&gt;FGauge&lt;/code&gt; class to makes your gauges look very pretty – basically give them a surround and some additional styling (see below).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fah2tbaryiilzm3tptaff.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fah2tbaryiilzm3tptaff.png" alt="Two images side by side displaying circular gauges with different styles" width="800" height="335"&gt;&lt;/a&gt;&lt;/p&gt;
Left: With no `FGauge` styling. Right: With `FGauge` styling



&lt;h2&gt;
  
  
  Using Medusa
&lt;/h2&gt;

&lt;p&gt;I imported the Medusa JavaFX library into the app’s existing build.gradle script via a Gradle implementation:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;implementation 'eu.hansolo:medusa:17.1.7'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;I then ensured to add it to the list of modules required in the app’s module-info.java:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;requires eu.hansolo.medusa;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(you'll probably also have to add the following implementations and modules: &lt;code&gt;javafx.swing&lt;/code&gt;, &lt;code&gt;eu.hansolo.toolboxfx&lt;/code&gt;, &lt;code&gt;eu.hansolo.toolbox&lt;/code&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;With hindsight, I would have set up the &lt;code&gt;main.fxml&lt;/code&gt; in the resources directory straight away had I realized I could initialize the controls in FXML. What happened instead was I added all of the control UI configuration to the &lt;code&gt;Controller&lt;/code&gt; class, and then retrospectively went back and refactored it all. So if you are reading this and finding yourself at the beginning of the project...&lt;strong&gt;save yourself some time and get that &lt;code&gt;main.fxml&lt;/code&gt; set up now&lt;/strong&gt;. It’ll save you refactoring later. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: I couldn’t find a way to initialize the gauges which use &lt;code&gt;SectionBuilder&lt;/code&gt; in FXML, so it seems this one does have to remain in the &lt;code&gt;Controller&lt;/code&gt; class. Let me know if you have found another way!&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Customising Medusa
&lt;/h2&gt;

&lt;p&gt;I set up the digital style controls (&lt;code&gt;LCD&lt;/code&gt; skin type) for displaying temperature and humidity readings in my &lt;code&gt;main.fxml&lt;/code&gt; file. I chose a JavaFX &lt;code&gt;[Gridpane](https://openjfx.io/javadoc/20/javafx.graphics/javafx/scene/layout/GridPane.html)&lt;/code&gt; to display them in, so that I could extend the app easily in future if there was more data sensors added to the app.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;GridPane&lt;/span&gt; &lt;span class="na"&gt;maxWidth=&lt;/span&gt;&lt;span class="s"&gt;"Infinity"&lt;/span&gt; &lt;span class="na"&gt;StackPane.alignment=&lt;/span&gt;&lt;span class="s"&gt;"CENTER"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;padding&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Insets&lt;/span&gt; &lt;span class="na"&gt;topRightBottomLeft=&lt;/span&gt;&lt;span class="s"&gt;"25"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/padding&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Gauge&lt;/span&gt; &lt;span class="na"&gt;fx:id=&lt;/span&gt;&lt;span class="s"&gt;"humidityGauge"&lt;/span&gt; &lt;span class="na"&gt;GridPane.rowIndex=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;GridPane.columnIndex=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt;
           &lt;span class="na"&gt;skinType=&lt;/span&gt;&lt;span class="s"&gt;"LCD"&lt;/span&gt;
           &lt;span class="na"&gt;maxWidth=&lt;/span&gt;&lt;span class="s"&gt;"Infinity"&lt;/span&gt;
           &lt;span class="na"&gt;maxHeight=&lt;/span&gt;&lt;span class="s"&gt;"75"&lt;/span&gt;
           &lt;span class="na"&gt;prefWidth=&lt;/span&gt;&lt;span class="s"&gt;"250"&lt;/span&gt;
           &lt;span class="na"&gt;prefHeight=&lt;/span&gt;&lt;span class="s"&gt;"100"&lt;/span&gt;
           &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"Humidity"&lt;/span&gt;
           &lt;span class="na"&gt;lcdDesign=&lt;/span&gt;&lt;span class="s"&gt;"GRAY_PURPLE"&lt;/span&gt;
           &lt;span class="na"&gt;oldValueVisible=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt;
           &lt;span class="na"&gt;maxMeasuredValueVisible=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt;
           &lt;span class="na"&gt;minMeasuredValueVisible=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt;
           &lt;span class="na"&gt;unit=&lt;/span&gt;&lt;span class="s"&gt;"\%"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Gauge&lt;/span&gt; &lt;span class="na"&gt;fx:id=&lt;/span&gt;&lt;span class="s"&gt;"digitalTempGauge"&lt;/span&gt; &lt;span class="na"&gt;GridPane.rowIndex=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;GridPane.columnIndex=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt;
           &lt;span class="na"&gt;skinType=&lt;/span&gt;&lt;span class="s"&gt;"LCD"&lt;/span&gt;
           &lt;span class="na"&gt;maxWidth=&lt;/span&gt;&lt;span class="s"&gt;"Infinity"&lt;/span&gt;
           &lt;span class="na"&gt;maxHeight=&lt;/span&gt;&lt;span class="s"&gt;"75"&lt;/span&gt;
           &lt;span class="na"&gt;prefWidth=&lt;/span&gt;&lt;span class="s"&gt;"250"&lt;/span&gt;
           &lt;span class="na"&gt;prefHeight=&lt;/span&gt;&lt;span class="s"&gt;"100"&lt;/span&gt;
           &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"Temperature"&lt;/span&gt;
           &lt;span class="na"&gt;lcdDesign=&lt;/span&gt;&lt;span class="s"&gt;"GRAY_PURPLE"&lt;/span&gt;
           &lt;span class="na"&gt;oldValueVisible=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt;
           &lt;span class="na"&gt;maxMeasuredValueVisible=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt;
           &lt;span class="na"&gt;minMeasuredValueVisible=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt;
           &lt;span class="na"&gt;unit=&lt;/span&gt;&lt;span class="s"&gt;"ºC"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/GridPane&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For the atmospheric pressure gauge, since I wanted to mimic an old style barometer, I wanted to use the &lt;code&gt;FGauge&lt;/code&gt; class to give it nicer styling as if there was a glass encasing around the front of the dial. The gauge also had to be composed of a number of sections, and so I chose the &lt;code&gt;SkinType.SECTION&lt;/code&gt;. This gauge configuration requires the use of a &lt;code&gt;SectionBuilder&lt;/code&gt;, though it looks like you can’t use &lt;code&gt;SectionBuilder&lt;/code&gt; in FXML (again, let me know if you’ve found a way). So I built the pressure gauge in the controller class with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;barometerGauge&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;GaugeBuilder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
  &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;skinType&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Gauge&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SkinType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SECTION&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;needleColor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lcdFontColor&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Atmospheric Pressure"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;unit&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;" mbar"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;unitColor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;WHITE&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;titleColor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;WHITE&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;valueVisible&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;valueColor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;WHITE&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;markersVisible&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;decimals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;minValue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;940&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;maxValue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1060&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;animated&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;knobColor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;FLORALWHITE&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;highlightSections&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sections&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
    &lt;span class="nc"&gt;SectionBuilder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1040&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stop&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1060&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"VERY DRY"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lcdBackgroundColor&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;highlightColor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;FLORALWHITE&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;textColor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Gauge&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;DARK_COLOR&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt;
    &lt;span class="nc"&gt;SectionBuilder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1020&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stop&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1040&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"FAIR"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lcdBackgroundColor&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;highlightColor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;FLORALWHITE&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;textColor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Gauge&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;DARK_COLOR&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt;
    &lt;span class="nc"&gt;SectionBuilder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stop&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1020&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"CHANGE"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lcdBackgroundColor&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;highlightColor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;FLORALWHITE&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;textColor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Gauge&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;DARK_COLOR&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt;
    &lt;span class="nc"&gt;SectionBuilder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;970&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stop&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"RAIN"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lcdBackgroundColor&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;highlightColor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;FLORALWHITE&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;textColor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Gauge&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;DARK_COLOR&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt;
    &lt;span class="nc"&gt;SectionBuilder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;940&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stop&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;970&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"STORMY"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lcdBackgroundColor&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;highlightColor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;FLORALWHITE&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;textColor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Gauge&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;DARK_COLOR&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;
  &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;span class="nc"&gt;FGauge&lt;/span&gt; &lt;span class="n"&gt;barometerFGauge&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FGauge&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;barometerGauge&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;GaugeDesign&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;TILTED_BLACK&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;GaugeDesign&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;GaugeBackground&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;WHITE&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;vBox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getChildren&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;addAll&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;barometerFGauge&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I enjoyed how configurable the gauge designs are – for example, in the barometer gauge, I was able to customize the needle and section background colour to match that of the LCD style temperature and humidity gauges to link colour schemes across the dials. I was also able to customize the highlight colour for when the needle swung to different sections, reflecting what the current weather condition is.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmbnn673ehpg69dp6nftl.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmbnn673ehpg69dp6nftl.gif" alt="Three gauges showing weather information" width="760" height="727"&gt;&lt;/a&gt;The final working app! Running on mocked data, the LCD gauges update the temperature and humidity data, and the Section style gauge updates the weather condition based on air pressure reading. &lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;After the initial stumbling block of not being sure how to set up the gauges, once it was all pulled together I really enjoyed using the Medusa JavaFX library. The gauges are easily configurable, look really smooth and modern, and were easy enough to integrate into the existing app logic. &lt;/p&gt;

&lt;p&gt;Additional bonus is that my colleague loved it and is happy with the makeover from the basic JavaFX UI to this more modern UI!&lt;/p&gt;

&lt;p&gt;If you’d like to see the full JavaFX code used for this project, check out the &lt;a href="https://github.com/mbcoder/weather-station/blob/mark/IoT-proving/src/main/java/com/mbcoder/iot/weatherstation/Controller.java" rel="noopener noreferrer"&gt;Controller class here&lt;/a&gt;, and the &lt;a href="https://github.com/mbcoder/weather-station/blob/main/src/main/resources/main.fxml" rel="noopener noreferrer"&gt;main.fxml here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And if you’d like to learn how to hook up a Raspberry Pi to a Java app, do check out my colleague’s blog on how to build a weather station on the &lt;a href="https://www.esri.com/arcgis-blog/products/sdk-java/developers/java-maps-sdk-raspberry-pi-weather-station/" rel="noopener noreferrer"&gt;ArcGIS Developers blog&lt;/a&gt;! &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftmci0w9a2jav154mab40.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftmci0w9a2jav154mab40.png" alt="Raspberry Pi attached to screen displaying gauges" width="800" height="1066"&gt;&lt;/a&gt;&lt;/p&gt;
The modernised UI display on a screen attached to the Raspberry Pi!



</description>
      <category>java</category>
      <category>javafx</category>
      <category>beginners</category>
      <category>programmers</category>
    </item>
    <item>
      <title>The trouble of googling for maps in Java</title>
      <dc:creator>Rachael E</dc:creator>
      <pubDate>Thu, 23 Feb 2023 15:52:47 +0000</pubDate>
      <link>https://dev.to/rachaele/the-trouble-of-googling-for-maps-in-java-4po9</link>
      <guid>https://dev.to/rachaele/the-trouble-of-googling-for-maps-in-java-4po9</guid>
      <description>&lt;p&gt;&lt;strong&gt;What is a map, and why as a Java developer would you have trouble googling for it? Well it depends ... on who you are and what you want it for.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're a Java developer, a &lt;code&gt;Map&lt;/code&gt; is an object that maps keys to values and stores them in memory. Once stored, a value can be looked up using the key, such as finding the population count (value) for a country (the key).&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Map&amp;lt;String, Integer&amp;gt; populations; &lt;br&gt;
&lt;/code&gt;&lt;br&gt;
If on the other hand you're a geospatial professional, or somebody who wants to work with geographical data, a map is a visual means to display a scaled down geographical representation of a region, such as this map of Edinburgh, Scotland.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3z56hplnmhb7qk65sjwl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3z56hplnmhb7qk65sjwl.png" alt="Java application displaying ArcGIS Colored Pencil basemap" width="800" height="581"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But what if you're both? A developer who wants to build Java applications that displays a map - how do you google for putting a map in a Java application?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Google&lt;/strong&gt;: "java map"&lt;/em&gt;&lt;br&gt;
&lt;em&gt;&lt;strong&gt;Top 3 results&lt;/strong&gt;:&lt;/em&gt; &lt;br&gt;
&lt;em&gt;1. &lt;a href="https://www.javatpoint.com/java-map" rel="noopener noreferrer"&gt;Javatpoint - java-map&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;2. &lt;a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html" rel="noopener noreferrer"&gt;Oracle - java/util/map&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;3. &lt;a href="https://www.w3schools.com/java/java_hashmap" rel="noopener noreferrer"&gt;w3schools - java hashmap&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The top 3 results of this simple search all return Java &lt;code&gt;Map&lt;/code&gt; related info. And it's the same for googling "java map library". Things get worse when you google precisely my question above:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Google&lt;/strong&gt;: "putting a map in a Java application"&lt;br&gt;
&lt;strong&gt;Top 3 results&lt;/strong&gt;:&lt;/em&gt;&lt;br&gt;
&lt;em&gt;1. &lt;a href="https://www.geeksforgeeks.org/hashmap-put-method-..." rel="noopener noreferrer"&gt;Geeksforgeeks - hashmap-put method&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;2. &lt;a href="https://www.softwaretestinghelp.com/java-map-interface/" rel="noopener noreferrer"&gt;Software testing help - java-map interface&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;3. &lt;a href="https://www.javatpoint.com/java-map" rel="noopener noreferrer"&gt;Javatpoint - java-map&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Things get a little more interesting when adding "SDK" into the search however.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Google&lt;/strong&gt;: "java map sdk"&lt;br&gt;
&lt;strong&gt;Top 3 results&lt;/strong&gt;:&lt;/em&gt;&lt;br&gt;
&lt;em&gt;1. &lt;a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html" rel="noopener noreferrer"&gt;Oracle - java/util/map&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;2. &lt;a href="https://developers.arcgis.com/java/" rel="noopener noreferrer"&gt;Esri Developers - ArcGIS Maps SDK for Java&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;3. &lt;a href="https://developers.google.com/maps/documentation/android-sdk/start" rel="noopener noreferrer"&gt;Google Maps Platform - Maps SDK for Android&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The top result is a Java &lt;code&gt;Map&lt;/code&gt;, but the 2nd and 3rd hits are geographical map developer tools, the first from &lt;a href="https://developers.arcgis.com/" rel="noopener noreferrer"&gt;Esri&lt;/a&gt; and the second from &lt;a href="https://developers.google.com/maps" rel="noopener noreferrer"&gt;Google&lt;/a&gt; itself. Result! Mapping SDKs for Java developers do exist after all 🎉. &lt;/p&gt;




&lt;p&gt;Those in the know &lt;em&gt;know&lt;/em&gt; these SDKs exist, but if you're new to programming, it can be really hard finding the right tools amongst the technical jargon. Especially in the case of looking for a map, with &lt;code&gt;Map&lt;/code&gt; being such a fundamental object type in Java.&lt;/p&gt;

&lt;p&gt;Let's try one last &lt;em&gt;slightly&lt;/em&gt; more detailed search in our quest to find more elusive geographical maps SDKs for Java out there:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Google&lt;/strong&gt;: "java geographical maps sdk"&lt;br&gt;
&lt;strong&gt;Top 3 results&lt;/strong&gt;:&lt;/em&gt;&lt;br&gt;
&lt;em&gt;1. &lt;a href="https://developers.arcgis.com/java/maps-2d/" rel="noopener noreferrer"&gt;Esri Developers - Java Maps SDK for maps in 2D&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;2. &lt;a href="https://github.com/googlemaps/google-maps-services-java" rel="noopener noreferrer"&gt;Google Maps Platform - Java client for google Maps Services&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;3. &lt;a href="https://developers.google.com/maps/documentation/geocoding/client-library" rel="noopener noreferrer"&gt;Google Maps Platform - Client Libraries&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Even better results this time! A whole PAGE and more of map-related SDK goodness: no mention of a Java &lt;code&gt;Map&lt;/code&gt; anywhere. &lt;/p&gt;




&lt;p&gt;Now you know where to find them, there's really no excuse not to use maps, that aren't &lt;code&gt;Map&lt;/code&gt;s, in your Java apps (&lt;em&gt;yes, that made my brain hurt too&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So a couple of no-brainer takeaways:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the more precise you can be whilst googling for niche tools, the better the results will be, remember e.g. java map vs java geographical maps sdk.&lt;/li&gt;
&lt;li&gt;if you want developers to find your awesome maps SDK whilst googling, invest in good SEO and documentation and narrow down on those specific keywords to help your product rank higher in search engines.&lt;/li&gt;
&lt;li&gt;be even more precise: dig deeper and be more specific with what framework you want to use, e.g. searching for "javafx geographic map sdk".&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And let's not even get started on how as a developer of mapping software you name your &lt;a href="https://developers.arcgis.com/java/api-reference/reference/com.esri.arcgisruntime/com/esri/arcgisruntime/mapping/ArcGISMap.html" rel="noopener noreferrer"&gt;non Java-map map class&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;I'll leave you with that mappy thought! 🗺&lt;/p&gt;

</description>
      <category>java</category>
      <category>maps</category>
      <category>beginners</category>
      <category>sdk</category>
    </item>
    <item>
      <title>Personal reflections: how release planning can bring remote teams together</title>
      <dc:creator>Rachael E</dc:creator>
      <pubDate>Thu, 23 Feb 2023 13:05:48 +0000</pubDate>
      <link>https://dev.to/rachaele/personal-reflections-how-release-planning-can-bring-remote-teams-together-24i5</link>
      <guid>https://dev.to/rachaele/personal-reflections-how-release-planning-can-bring-remote-teams-together-24i5</guid>
      <description>&lt;p&gt;When the pandemic hit in 2020, our office closed and we began developing from home. Nearly 3 years on, we're starting to get back to the office! But, as creatures of habit, it can be hard to leave our now routine structure of working from home for a long commute, different desk, etc etc. I've found that any small reason for going into the office will usually lose against all the reasons to stay at home - unless there is a shiny carrot of a reason to get into the office beyond those reasons I set myself! &lt;/p&gt;

&lt;p&gt;To help us get a reason that might battle those stay at home anchors, we, the &lt;a href="https://developers.arcgis.com/java/" rel="noopener noreferrer"&gt;ArcGIS Maps SDK for Java&lt;/a&gt; team, decided to make a standard Agile meeting an opportunity and motivation reason to get colleagues together in the one space. So we hosted an in person release planning session as a reason to get folks back in the office: and it was lovely.&lt;/p&gt;

&lt;p&gt;In my dev journal style story map blog below, I share my personal reflections on shifting to working from home during the pandemic. I also share how finding any opportunity (release planning!) to get the team together in person can be a real boost for individuals and the team as a whole. &lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://storymaps.arcgis.com/stories/634b661f3c2f476387825887284bb814" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.arcgis.com%2Fsharing%2Frest%2Fcontent%2Fitems%2F634b661f3c2f476387825887284bb814%2Fresources%2FlB-3y_QsYUvp_44OF2qul.jpeg%3Fw%3D400" height="300" class="m-0" width="400"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://storymaps.arcgis.com/stories/634b661f3c2f476387825887284bb814" rel="noopener noreferrer" class="c-link"&gt;
          How release planning can bring remote teams together  
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Reflections on how in-person release planning can be a great opportunity to bring colleagues together and boost team morale. 
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstorymaps.arcgis.com%2Fstatic%2Fimages%2Ffavicon-32x32.png" width="32" height="32"&gt;
        storymaps.arcgis.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>java</category>
      <category>devjournal</category>
      <category>agile</category>
      <category>motivation</category>
    </item>
  </channel>
</rss>
