{"id":169,"date":"2009-04-05T10:05:18","date_gmt":"2009-04-05T19:05:18","guid":{"rendered":"https:\/\/www.kellyrob99.com\/blog\/?p=169"},"modified":"2010-02-28T20:42:10","modified_gmt":"2010-03-01T05:42:10","slug":"swingx-busy-label-demo-in-griffon","status":"publish","type":"post","link":"https:\/\/www.kellyrob99.com\/blog\/2009\/04\/05\/swingx-busy-label-demo-in-griffon\/","title":{"rendered":"SwingX busy label demo in Griffon and Groovy"},"content":{"rendered":"<p>The first demonstration panel in the  <a class=\"zem_slink\" title=\"SwingLabs\" rel=\"homepage\" href=\"https:\/\/swinglabs.dev.java.net\/\">SwingLabs<\/a> demo is for the JXBusyLabel, a simple component that does exactly what it says &#8211; inform Users of the application that progress is occurring.  The setup is highly configurable, allowing changes to the color, shape and size of the rendered label.<\/p>\n<p>The SwingX demonstration makes use of an inner &#8216;DetailsPane&#8217; class that nicely handles a lot of the gridbag layout details, but I didn&#8217;t really want to spend the extra time Groovifying a perfectly good and already implemented helper class, so I just threw the java code in the <a class=\"zem_slink\" title=\"Griffon (framework)\" rel=\"homepage\" href=\"http:\/\/groovy.codehaus.org\/Griffon\">Griffon<\/a> src directory and that was that. Being able to seamlessly mix <a class=\"zem_slink\" title=\"Java (software platform)\" rel=\"homepage\" href=\"http:\/\/java.sun.com\">Java<\/a> and Groovy is a definite plus, let me tell you. Below is an example of adding a new DetailsPane using the builder DSL, utilizing a GridBagConstants variable named &#8216;gbc&#8217; and assigning the foreground color based on a model property.<\/p>\n<pre class=\"brush: groovy; smart-tabs: true; title: ; notranslate\" title=\"\">\r\ngenPane = jxpanel(constraints: gbc,\r\n                              new DetailsPane(&quot;General settings:&quot;, model.FOREGROUND))\r\n<\/pre>\n<p>Here is a side-by-side comparison of Java and then the equivalent Groovy code for creating and initializing a new JXBusyLabel. At first they don&#8217;t look a whole lot different, but if you notice, the Groovy version is actually a one-liner, and uses the bind() syntax to set colors based on a model backed property.<\/p>\n<pre class=\"brush: java; smart-tabs: true; title: ; notranslate\" title=\"\">\r\n label = new JXBusyLabel(new Dimension((int) (W \/ 2), (int) (H \/ 2)));\r\n label.getBusyPainter().setHighlightColor( new Color(44, 61, 146).darker());\r\n label.getBusyPainter() .setBaseColor(new Color(168, 204, 241).brighter());\r\n label.setOpaque(false);\r\n label.setHorizontalAlignment(JLabel.CENTER);\r\n<\/pre>\n<pre class=\"brush: groovy; smart-tabs: true; title: ; notranslate\" title=\"\">\r\nlabel = jxbusyLabel(\r\n       preferredSize: new Dimension(model.W \/ 2 as int,model.H \/ 2 as int),\r\n       busyPainter: busyPainter(highlightColor: bind{ model.busyColor },\r\n       baseColor: bind{model.baseColor}), opaque: false, horizontalAlignment: JLabel.CENTER)\r\n<\/pre>\n<p>SwingX contains a specialized button that wraps a color chooser component, and here we can look at the differences between the Java and Groovy syntax for instantiating one.  The JXColorSelectionButton class isn&#8217;t actually a node made available by the SwingXBuilder, but adding to the builder syntax dynamically is simple to say the least using a call to &#8216;registerBeanFactory&#8217;. Also in the Groovy version, here we&#8217;re not directly updating the color on the label, we&#8217;re updating the model. While the background color change seems to be correctly updated through the bound &#8216;baseColor&#8217; model property, it does not repaint automagically. I&#8217;m sure there&#8217;s a way to do this, it just hasn&#8217;t popped up yet.<\/p>\n<pre class=\"brush: java; smart-tabs: true; title: ; notranslate\" title=\"\">\r\nJXColorSelectionButton baseColBtn = new JXColorSelectionButton();\r\nbaseColBtn.setBackground(label.getBusyPainter().getBaseColor());\r\nbaseColBtn.addPropertyChangeListener(&quot;background&quot;, new PropertyChangeListener() {\r\n      public void propertyChange(PropertyChangeEvent evt) {\r\n           label.getBusyPainter().setBaseColor((Color) evt.getNewValue());\r\n           label.repaint();\r\n      }});\r\n<\/pre>\n<pre class=\"brush: groovy; smart-tabs: true; title: ; notranslate\" title=\"\">\r\nregisterBeanFactory('colorButton', JXColorSelectionButton.class)\r\nbaseColBtn = colorButton(background: model.baseColor)\r\nbaseColBtn.addPropertyChangeListener(&quot;background&quot;,\r\n      {PropertyChangeEvent evt -&gt;\r\n           model.baseColor = (Color) evt.getNewValue()\r\n           label.repaint()     \/\/need to figure out how to remove this call!!!\r\n      } as PropertyChangeListener)\r\n<\/pre>\n<p>The Java code uses an anonymous inner class to kick off the process.<\/p>\n<pre class=\"brush: java; smart-tabs: true; title: ; notranslate\" title=\"\">\r\nnew JButton(new AbstractAction(&quot;Start&quot;) {\r\n      public void actionPerformed(ActionEvent e) {\r\n           label.setBusy(!label.isBusy());\r\n           putValue(Action.NAME, label.isBusy() ? &quot;Stop&quot; : &quot;Start&quot;);\r\n      }\r\n })\r\n<\/pre>\n<p>No anonymous inner classes in Groovy, and with the Griffon framework we can separate the concerns a bit better anyhow. This code is split up between the view and the controller classes. Note that the controller can reference(and update) the action by acting through its injected view component.<\/p>\n<pre class=\"brush: groovy; smart-tabs: true; title: ; notranslate\" title=\"\">\r\n\/* action and button defined in the view *\/\r\nactions {\r\n      action(id: &quot;startAction&quot;,\r\n      name: model.START_NAME,\r\n      mnemonic: &quot;S&quot;,\r\n      accelerator: shortcut(&quot;S&quot;),\r\n      closure: controller.start)\r\n }\r\nbutton(startAction)\r\n...\r\n\/* controller action *\/\r\ndef start =  { ActionEvent evt -&gt;\r\n      view.label.setBusy(!view.label.isBusy())\r\n      view.startAction.putValue(Action.NAME, view.label.isBusy() ? &quot;Stop&quot; : &quot;Start&quot;)\r\n }\r\n<\/pre>\n<p>Finally, here&#8217;s a code sample of how to add a listener to an existing component and bind the action to a method on the controller:<\/p>\n<pre class=\"brush: groovy; smart-tabs: true; title: ; notranslate\" title=\"\">\r\n     xSlider.addChangeListener(controller.&amp;fcl as ChangeListener)\r\n<\/pre>\n<p>In most cases, the sample code here is not trying very hard to shorten the syntax; there&#8217;s a lot of room for improvement and further Groovification. I&#8217;m sure there&#8217;s a better way to add listeners, for instance. Anyhow, aside from a few details, the application is up and running and doing the same thing as the original. Total effort expended: probably about 10 hours, a good portion of it spend  Googling and reading. Next step is to write some tests to get better at that side of the equation.  I&#8217;d be including more links about the excellent SwingX components in this post, but the SwingLabs website has been reporting <a href=\"http:\/\/www.google.ca\/search?q=%22Maximum+Connections+Reached%3A+4096+--+Retry+later%22&amp;ie=utf-8&amp;oe=utf-8&amp;aq=t&amp;rls=org.mozilla:en-US:official&amp;client=firefox-a\">&#8220;Maximum Connections Reached: 4096 &#8212; Retry later&#8221;<\/a> all day.  Hope everything gets fixed soon guys!<\/p>\n<p>If you&#8217;re interested in seeing this demo live and  in action, there&#8217;s a link to a short <a class=\"zem_slink\" title=\"Jing\" rel=\"homepage\" href=\"http:\/\/jingproject.com\">Jing<\/a> video below.<\/p>\n<p><a href=\"https:\/\/www.kellyrob99.com\/blog\/wp-content\/uploads\/2009\/04\/griffonswingset3_jxbusylabel.swf\">Click here for video of the JXBusyLabel demo running on Griffon.<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>The first demonstration panel in the SwingLabs demo is for the JXBusyLabel, a simple component that does exactly what it says &#8211; inform Users of the application that progress is occurring. The setup is highly configurable, allowing changes to the color, shape and size of the rendered label. The SwingX demonstration makes use of an [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[6],"tags":[20,257,258,45,46],"class_list":["post-169","post","type-post","status-publish","format-standard","hentry","category-dev","tag-griffon","tag-groovy","tag-java","tag-swinglabs","tag-swingx"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.0.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"A demonstration of the JXBusyLabel capabilities using Griffon, SwingXBuilder and Groovy.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"TheKaptain\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/www.kellyrob99.com\/blog\/2009\/04\/05\/swingx-busy-label-demo-in-griffon\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"The Kaptain on ... stuff | Tales of development, life and the folly that goes along with both\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Griffon JXBusyLabel demo | The Kaptain on ... stuff\" \/>\n\t\t<meta property=\"og:description\" content=\"A demonstration of the JXBusyLabel capabilities using Griffon, SwingXBuilder and Groovy.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/www.kellyrob99.com\/blog\/2009\/04\/05\/swingx-busy-label-demo-in-griffon\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2009-04-05T19:05:18+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2010-03-01T05:42:10+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Griffon JXBusyLabel demo | The Kaptain on ... stuff\" \/>\n\t\t<meta name=\"twitter:description\" content=\"A demonstration of the JXBusyLabel capabilities using Griffon, SwingXBuilder and Groovy.\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/2009\\\/04\\\/05\\\/swingx-busy-label-demo-in-griffon\\\/#article\",\"name\":\"Griffon JXBusyLabel demo | The Kaptain on ... stuff\",\"headline\":\"SwingX busy label demo in Griffon and Groovy\",\"author\":{\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/author\\\/admin\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/#organization\"},\"datePublished\":\"2009-04-05T10:05:18-09:00\",\"dateModified\":\"2010-02-28T20:42:10-09:00\",\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/2009\\\/04\\\/05\\\/swingx-busy-label-demo-in-griffon\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/2009\\\/04\\\/05\\\/swingx-busy-label-demo-in-griffon\\\/#webpage\"},\"articleSection\":\"Development, Griffon, Groovy, Java, SwingLabs, SwingX\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/2009\\\/04\\\/05\\\/swingx-busy-label-demo-in-griffon\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/category\\\/dev\\\/#listItem\",\"name\":\"Development\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/category\\\/dev\\\/#listItem\",\"position\":2,\"name\":\"Development\",\"item\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/category\\\/dev\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/2009\\\/04\\\/05\\\/swingx-busy-label-demo-in-griffon\\\/#listItem\",\"name\":\"SwingX busy label demo in Griffon and Groovy\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/2009\\\/04\\\/05\\\/swingx-busy-label-demo-in-griffon\\\/#listItem\",\"position\":3,\"name\":\"SwingX busy label demo in Griffon and Groovy\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/category\\\/dev\\\/#listItem\",\"name\":\"Development\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/#organization\",\"name\":\"The Kaptain on ... stuff\",\"description\":\"Tales of development, life and the folly that goes along with both\",\"url\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/author\\\/admin\\\/#author\",\"url\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/author\\\/admin\\\/\",\"name\":\"TheKaptain\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/2009\\\/04\\\/05\\\/swingx-busy-label-demo-in-griffon\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e41f09f3548f065fe6967ac904d3ea2a638614c16d879cac47cfad64e5b1426a?s=96&d=monsterid&r=g\",\"width\":96,\"height\":96,\"caption\":\"TheKaptain\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/2009\\\/04\\\/05\\\/swingx-busy-label-demo-in-griffon\\\/#webpage\",\"url\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/2009\\\/04\\\/05\\\/swingx-busy-label-demo-in-griffon\\\/\",\"name\":\"Griffon JXBusyLabel demo | The Kaptain on ... stuff\",\"description\":\"A demonstration of the JXBusyLabel capabilities using Griffon, SwingXBuilder and Groovy.\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/2009\\\/04\\\/05\\\/swingx-busy-label-demo-in-griffon\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/author\\\/admin\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/author\\\/admin\\\/#author\"},\"datePublished\":\"2009-04-05T10:05:18-09:00\",\"dateModified\":\"2010-02-28T20:42:10-09:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/\",\"name\":\"The Kaptain on ... stuff\",\"description\":\"Tales of development, life and the folly that goes along with both\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Griffon JXBusyLabel demo | The Kaptain on ... stuff","description":"A demonstration of the JXBusyLabel capabilities using Griffon, SwingXBuilder and Groovy.","canonical_url":"https:\/\/www.kellyrob99.com\/blog\/2009\/04\/05\/swingx-busy-label-demo-in-griffon\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.kellyrob99.com\/blog\/2009\/04\/05\/swingx-busy-label-demo-in-griffon\/#article","name":"Griffon JXBusyLabel demo | The Kaptain on ... stuff","headline":"SwingX busy label demo in Griffon and Groovy","author":{"@id":"https:\/\/www.kellyrob99.com\/blog\/author\/admin\/#author"},"publisher":{"@id":"https:\/\/www.kellyrob99.com\/blog\/#organization"},"datePublished":"2009-04-05T10:05:18-09:00","dateModified":"2010-02-28T20:42:10-09:00","inLanguage":"en-US","mainEntityOfPage":{"@id":"https:\/\/www.kellyrob99.com\/blog\/2009\/04\/05\/swingx-busy-label-demo-in-griffon\/#webpage"},"isPartOf":{"@id":"https:\/\/www.kellyrob99.com\/blog\/2009\/04\/05\/swingx-busy-label-demo-in-griffon\/#webpage"},"articleSection":"Development, Griffon, Groovy, Java, SwingLabs, SwingX"},{"@type":"BreadcrumbList","@id":"https:\/\/www.kellyrob99.com\/blog\/2009\/04\/05\/swingx-busy-label-demo-in-griffon\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/www.kellyrob99.com\/blog#listItem","position":1,"name":"Home","item":"https:\/\/www.kellyrob99.com\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/www.kellyrob99.com\/blog\/category\/dev\/#listItem","name":"Development"}},{"@type":"ListItem","@id":"https:\/\/www.kellyrob99.com\/blog\/category\/dev\/#listItem","position":2,"name":"Development","item":"https:\/\/www.kellyrob99.com\/blog\/category\/dev\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.kellyrob99.com\/blog\/2009\/04\/05\/swingx-busy-label-demo-in-griffon\/#listItem","name":"SwingX busy label demo in Griffon and Groovy"},"previousItem":{"@type":"ListItem","@id":"https:\/\/www.kellyrob99.com\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/www.kellyrob99.com\/blog\/2009\/04\/05\/swingx-busy-label-demo-in-griffon\/#listItem","position":3,"name":"SwingX busy label demo in Griffon and Groovy","previousItem":{"@type":"ListItem","@id":"https:\/\/www.kellyrob99.com\/blog\/category\/dev\/#listItem","name":"Development"}}]},{"@type":"Organization","@id":"https:\/\/www.kellyrob99.com\/blog\/#organization","name":"The Kaptain on ... stuff","description":"Tales of development, life and the folly that goes along with both","url":"https:\/\/www.kellyrob99.com\/blog\/"},{"@type":"Person","@id":"https:\/\/www.kellyrob99.com\/blog\/author\/admin\/#author","url":"https:\/\/www.kellyrob99.com\/blog\/author\/admin\/","name":"TheKaptain","image":{"@type":"ImageObject","@id":"https:\/\/www.kellyrob99.com\/blog\/2009\/04\/05\/swingx-busy-label-demo-in-griffon\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/e41f09f3548f065fe6967ac904d3ea2a638614c16d879cac47cfad64e5b1426a?s=96&d=monsterid&r=g","width":96,"height":96,"caption":"TheKaptain"}},{"@type":"WebPage","@id":"https:\/\/www.kellyrob99.com\/blog\/2009\/04\/05\/swingx-busy-label-demo-in-griffon\/#webpage","url":"https:\/\/www.kellyrob99.com\/blog\/2009\/04\/05\/swingx-busy-label-demo-in-griffon\/","name":"Griffon JXBusyLabel demo | The Kaptain on ... stuff","description":"A demonstration of the JXBusyLabel capabilities using Griffon, SwingXBuilder and Groovy.","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/www.kellyrob99.com\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/www.kellyrob99.com\/blog\/2009\/04\/05\/swingx-busy-label-demo-in-griffon\/#breadcrumblist"},"author":{"@id":"https:\/\/www.kellyrob99.com\/blog\/author\/admin\/#author"},"creator":{"@id":"https:\/\/www.kellyrob99.com\/blog\/author\/admin\/#author"},"datePublished":"2009-04-05T10:05:18-09:00","dateModified":"2010-02-28T20:42:10-09:00"},{"@type":"WebSite","@id":"https:\/\/www.kellyrob99.com\/blog\/#website","url":"https:\/\/www.kellyrob99.com\/blog\/","name":"The Kaptain on ... stuff","description":"Tales of development, life and the folly that goes along with both","inLanguage":"en-US","publisher":{"@id":"https:\/\/www.kellyrob99.com\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"The Kaptain on ... stuff | Tales of development, life and the folly that goes along with both","og:type":"article","og:title":"Griffon JXBusyLabel demo | The Kaptain on ... stuff","og:description":"A demonstration of the JXBusyLabel capabilities using Griffon, SwingXBuilder and Groovy.","og:url":"https:\/\/www.kellyrob99.com\/blog\/2009\/04\/05\/swingx-busy-label-demo-in-griffon\/","article:published_time":"2009-04-05T19:05:18+00:00","article:modified_time":"2010-03-01T05:42:10+00:00","twitter:card":"summary","twitter:title":"Griffon JXBusyLabel demo | The Kaptain on ... stuff","twitter:description":"A demonstration of the JXBusyLabel capabilities using Griffon, SwingXBuilder and Groovy."},"aioseo_meta_data":{"post_id":"169","title":"Griffon JXBusyLabel demo | #site_title","description":"A demonstration of the JXBusyLabel capabilities using Griffon, SwingXBuilder and Groovy.","keywords":[{"label":"Griffon","value":"Griffon"},{"label":"Groovy","value":"Groovy"},{"label":"SwingX","value":"SwingX"},{"label":"JXBusyLabel","value":"JXBusyLabel"},{"label":"SwingBuilder","value":"SwingBuilder"},{"label":"SwingXBuilder","value":"SwingXBuilder"}],"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"location":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2021-02-09 05:16:03","updated":"2025-11-29 20:22:42","seo_analyzer_scan_date":null,"focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.kellyrob99.com\/blog\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.kellyrob99.com\/blog\/category\/dev\/\" title=\"Development\">Development<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tSwingX busy label demo in Griffon and Groovy\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/www.kellyrob99.com\/blog"},{"label":"Development","link":"https:\/\/www.kellyrob99.com\/blog\/category\/dev\/"},{"label":"SwingX busy label demo in Griffon and Groovy","link":"https:\/\/www.kellyrob99.com\/blog\/2009\/04\/05\/swingx-busy-label-demo-in-griffon\/"}],"jetpack_publicize_connections":[],"jetpack_shortlink":"https:\/\/wp.me\/prjtg-2J","jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/www.kellyrob99.com\/blog\/wp-json\/wp\/v2\/posts\/169","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kellyrob99.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kellyrob99.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kellyrob99.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kellyrob99.com\/blog\/wp-json\/wp\/v2\/comments?post=169"}],"version-history":[{"count":68,"href":"https:\/\/www.kellyrob99.com\/blog\/wp-json\/wp\/v2\/posts\/169\/revisions"}],"predecessor-version":[{"id":1155,"href":"https:\/\/www.kellyrob99.com\/blog\/wp-json\/wp\/v2\/posts\/169\/revisions\/1155"}],"wp:attachment":[{"href":"https:\/\/www.kellyrob99.com\/blog\/wp-json\/wp\/v2\/media?parent=169"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kellyrob99.com\/blog\/wp-json\/wp\/v2\/categories?post=169"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kellyrob99.com\/blog\/wp-json\/wp\/v2\/tags?post=169"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}