<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-2082784691741723706</id><updated>2009-12-02T20:32:13.765-08:00</updated><title type='text'>Java Builders</title><subtitle type='html'>Home of the Java Builders</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jacekfurmankiewicz.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default'/><link rel='alternate' type='text/html' href='http://jacekfurmankiewicz.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default?start-index=26&amp;max-results=25'/><author><name>Jacek Furmankiewicz</name><uri>http://www.blogger.com/profile/05579810225263887512</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>43</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2082784691741723706.post-1044266266232534454</id><published>2009-01-10T04:57:00.000-08:00</published><updated>2009-01-10T08:52:48.857-08:00</updated><title type='text'>The Swing JavaBuilder Book - Achieving maximum productivity with  minimum code via declarative UI</title><content type='html'>I've just release 0.3 ALPHA of the Swing JavaBuilder, whose aim is to dramatically improve the productivity of Swing development via declarative UIs in YAML (and thus give us a better option than that infernal JavaFX thingy).&lt;br /&gt;&lt;br /&gt;One of the biggest deliverables of this new release is the first build of the Swing JavaBuilder PDF book that aims to provide a more thorough documentation of the project's goals and features.&lt;br /&gt;&lt;br /&gt;Hope you will all find it useful:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://javabuilders.googlecode.com/files/swing.javabuilder.0.3.ALPHA.zip"&gt;http://javabuilders.googlecode.com/files/swing.javabuilder.0.3.ALPHA.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(the PDF book is in the root of the ZIP)&lt;br /&gt;&lt;br /&gt;It is still missing the section on layout management using MigLayout&lt;br /&gt;&lt;a href="http://code.google.com/p/javabuilders/wiki/LayoutDSL"&gt;http://code.google.com/p/javabuilders/wiki/LayoutDSL&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;but that will be merged into the PDF soon.&lt;br /&gt;&lt;br /&gt;More info at the JavaBuilders site:&lt;br /&gt;&lt;a href="http://code.google.com/p/javabuilders/"&gt;http://code.google.com/p/javabuilders/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2082784691741723706-1044266266232534454?l=jacekfurmankiewicz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekfurmankiewicz.blogspot.com/feeds/1044266266232534454/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=2082784691741723706&amp;postID=1044266266232534454' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/1044266266232534454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/1044266266232534454'/><link rel='alternate' type='text/html' href='http://jacekfurmankiewicz.blogspot.com/2009/01/swing-javabuilder-book-achieving.html' title='The Swing JavaBuilder Book - Achieving maximum productivity with  minimum code via declarative UI'/><author><name>Jacek Furmankiewicz</name><uri>http://www.blogger.com/profile/05579810225263887512</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04375114625926211545'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2082784691741723706.post-4823092477013951598</id><published>2008-12-10T06:34:00.001-08:00</published><updated>2008-12-10T06:54:38.345-08:00</updated><title type='text'>Enhancing Java: multiline strings and un-escaped strings</title><content type='html'>Here's my initial proposal for enhanced String handling in Java that I would like to implement as part of the &lt;a href="https://kijaro.dev.java.net/"&gt;Kijaro&lt;/a&gt; project, which is an experimental fork of OpenJDK where Java hackers can try out new language features that they feel are missing.&lt;br /&gt;&lt;br /&gt;Any comments are welcome!&lt;br /&gt;&lt;br /&gt;Link to Google Doc with the specs:&lt;br /&gt;&lt;a href="http://docs.google.com/View?docid=d36kv8n_32g9zj7pdd"&gt;http://docs.google.com/View?docid=d36kv8n_32g9zj7pdd&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Quick teaser:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;i&gt;String sql = """&lt;br /&gt;    SELECT col1, col2, col3&lt;br /&gt;    FROM Table1&lt;br /&gt;    WHERE col1 = 'Test'&lt;br /&gt;    AND col2 = ?&lt;br /&gt;    ORDER BY col1""";&lt;/i&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2082784691741723706-4823092477013951598?l=jacekfurmankiewicz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekfurmankiewicz.blogspot.com/feeds/4823092477013951598/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=2082784691741723706&amp;postID=4823092477013951598' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/4823092477013951598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/4823092477013951598'/><link rel='alternate' type='text/html' href='http://jacekfurmankiewicz.blogspot.com/2008/12/enhanced-string-handling-for-java.html' title='Enhancing Java: multiline strings and un-escaped strings'/><author><name>Jacek Furmankiewicz</name><uri>http://www.blogger.com/profile/05579810225263887512</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04375114625926211545'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2082784691741723706.post-5761470592845967364</id><published>2008-10-30T05:03:00.000-07:00</published><updated>2008-10-30T05:09:31.659-07:00</updated><title type='text'>Java 6u10: code your RIA in any language (Ruby, Scala, Python, Groovy)</title><content type='html'>In what can only be described as an excellent move on the part of Sun Microsystems, the new Java 6u10 update (whose sole aim is fixing up all the applet issues to make them a worthwhile competitor to Flex and Silverlight) has full support for all non-Java languages that can run on the JVM: Ruby, Scala, Jython/Python, Scala...even JavaFX :-)&lt;br /&gt;&lt;br /&gt;This includes the ability to script all of them using JavaScript from the browser page itself:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mail-archive.com/jvm-languages@googlegroups.com/msg01073.html"&gt;http://www.mail-archive.com/jvm-languages@googlegroups.com/msg01073.html&lt;/a&gt;&lt;br /&gt;&lt;a href="https://jdk6.dev.java.net/plugin2/liveconnect/#NON_JAVA_LIVECONNECT"&gt;https://jdk6.dev.java.net/plugin2/liveconnect/#NON_JAVA_LIVECONNECT&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is excellent news that should surely increase the chances of applets against Flex, which currently locks you into the Adobe-only ActionScript language (even though admittedly, it is a JavaScript derivative)&lt;br /&gt;&lt;br /&gt;More info here:&lt;br /&gt;&lt;a href="http://blogs.sun.com/theplanetarium/entry/java_se_6u10_some_things"&gt;http://blogs.sun.com/theplanetarium/entry/java_se_6u10_some_things&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2082784691741723706-5761470592845967364?l=jacekfurmankiewicz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekfurmankiewicz.blogspot.com/feeds/5761470592845967364/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=2082784691741723706&amp;postID=5761470592845967364' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/5761470592845967364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/5761470592845967364'/><link rel='alternate' type='text/html' href='http://jacekfurmankiewicz.blogspot.com/2008/10/java-6u10-code-your-ria-in-any-language.html' title='Java 6u10: code your RIA in any language (Ruby, Scala, Python, Groovy)'/><author><name>Jacek Furmankiewicz</name><uri>http://www.blogger.com/profile/05579810225263887512</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04375114625926211545'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2082784691741723706.post-7054167875338880264</id><published>2008-10-22T06:08:00.000-07:00</published><updated>2008-10-22T07:23:35.567-07:00</updated><title type='text'>Forget JavaFX: PulpCore is the real Java RIA</title><content type='html'>Sometimes a little project out of nowhere comes along and delivers something that instantly grabs you and makes you say "this is it!".&lt;br /&gt;&lt;br /&gt;Such was my experience when on the &lt;a href="http://www.pushing-pixels.org/?p=596"&gt;Swing links of the week&lt;/a&gt; I found a mention of PulpCore, a small framework that is an alternative to the whole JavaFX fiasco and delivers what we've wanted all along: fun, fast, great looking applets &lt;span style="font-weight: bold;"&gt;in pure Java&lt;/span&gt; (not some new questionable language being forced down your throat)!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.interactivepulp.com/pulpcore/"&gt;http://www.interactivepulp.com/pulpcore/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Try these ones in particular:&lt;br /&gt;&lt;a href="http://www.interactivepulp.com/pulpcore/particles/"&gt;http://www.interactivepulp.com/pulpcore/particles/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.interactivepulp.com/pulpcore/sketch/"&gt;http://www.interactivepulp.com/pulpcore/sketch/&lt;/a&gt;   (Flash, eat your heart out on this one) :-)&lt;br /&gt;&lt;br /&gt;The API seems very concise (the code for each of the applets is very short), yet the end results is light years ahead of any of the awkward ugly demos of JavaFX I've seen.&lt;br /&gt;&lt;br /&gt;Maybe there is hope for applets to complete with Flash head on after all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2082784691741723706-7054167875338880264?l=jacekfurmankiewicz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekfurmankiewicz.blogspot.com/feeds/7054167875338880264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=2082784691741723706&amp;postID=7054167875338880264' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/7054167875338880264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/7054167875338880264'/><link rel='alternate' type='text/html' href='http://jacekfurmankiewicz.blogspot.com/2008/10/forget-javafx-pulpcore-is-real-java-ria.html' title='Forget JavaFX: PulpCore is the real Java RIA'/><author><name>Jacek Furmankiewicz</name><uri>http://www.blogger.com/profile/05579810225263887512</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04375114625926211545'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2082784691741723706.post-4453188052279523433</id><published>2008-08-18T10:11:00.000-07:00</published><updated>2008-08-19T01:47:54.509-07:00</updated><title type='text'>Java Swing fonts in Java 6u10 : B.E.A.U.T.I.F.U.L.!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_8Jr5Ge3L1KU/SKqIgUmw5wI/AAAAAAAAAIw/Og68PJomnX4/s1600-h/jdk71.png"&gt;&lt;/a&gt;&lt;br /&gt;I've been known to make a few negative comments here and there about Sun's handling of Java recently, but I have to say they've really delivered on their Swing fidelity promises with the latest update.&lt;br /&gt;&lt;br /&gt;The switch to using the native Windows font rasterizer for font rendering has made an enormous difference. It's just a pleasure to look at Swing applications now (and even though the Swing API is not perfect, I prefer it much more to SWT with its myriad of hard-coded SWT.* styles).&lt;br /&gt;&lt;br /&gt;On the Linux front, the builds of OpenJDK 7 look really great on Ubuntu as well and have fixed most of the glaring GTK+ bugs.&lt;br /&gt;&lt;br /&gt;Thank you Sun for a great job on this. It's good to see solid effort like this being put into maintaining Swing.&lt;br /&gt;&lt;br /&gt;P.S. You asked for JDK 7 / GTK+ screenshots,  so here they are:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_8Jr5Ge3L1KU/SKqIlIUr5GI/AAAAAAAAAI4/IAXvZbjx_5I/s1600-h/jdk7.2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_8Jr5Ge3L1KU/SKqIlIUr5GI/AAAAAAAAAI4/IAXvZbjx_5I/s400/jdk7.2.png" alt="" id="BLOGGER_PHOTO_ID_5236147688242406498" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_8Jr5Ge3L1KU/SKqIgUmw5wI/AAAAAAAAAIw/Og68PJomnX4/s1600-h/jdk71.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_8Jr5Ge3L1KU/SKqIgUmw5wI/AAAAAAAAAIw/Og68PJomnX4/s400/jdk71.png" alt="" id="BLOGGER_PHOTO_ID_5236147605640111874" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2082784691741723706-4453188052279523433?l=jacekfurmankiewicz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekfurmankiewicz.blogspot.com/feeds/4453188052279523433/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=2082784691741723706&amp;postID=4453188052279523433' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/4453188052279523433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/4453188052279523433'/><link rel='alternate' type='text/html' href='http://jacekfurmankiewicz.blogspot.com/2008/08/java-swing-fonts-in-java-6u10-beautiful.html' title='Java Swing fonts in Java 6u10 : B.E.A.U.T.I.F.U.L.!'/><author><name>Jacek Furmankiewicz</name><uri>http://www.blogger.com/profile/05579810225263887512</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04375114625926211545'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_8Jr5Ge3L1KU/SKqIlIUr5GI/AAAAAAAAAI4/IAXvZbjx_5I/s72-c/jdk7.2.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2082784691741723706.post-5490716243067845837</id><published>2008-08-13T06:36:00.000-07:00</published><updated>2008-08-13T06:44:18.545-07:00</updated><title type='text'>Using JavaFX objects from within Java: a very bad joke from Sun</title><content type='html'>So I read this article about accessing JavaFX objects from within Java, which is quite easy, it seems:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/developer/technicalArticles/scripting/javafx/javafx_and_java/index.html"&gt;http://java.sun.com/developer/technicalArticles/scripting/javafx/javafx_and_java/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hidden lower in the article is the first public example I see of the opposite scenario: accessing JavaFX classes from Java.&lt;br /&gt;&lt;br /&gt;I was (naively) expecting this would be done the way Groovy does it...as real JVM classes that are interoperable across all JVM languages. But, as usual JavaFX shows its "thrown-together-in-a-hurry-as-a-response-to-Flex" roots:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;public class Main {&lt;br /&gt;&lt;br /&gt;public static void main (String[] args) {&lt;br /&gt; ScriptEngineManager manager =&lt;br /&gt;     new ScriptEngineManager();&lt;br /&gt;&lt;br /&gt; JavaFXScriptEngine fxEngine =&lt;br /&gt;     (JavaFXScriptEngine) manager.getEngineByName("javafx");&lt;br /&gt;&lt;br /&gt; try {&lt;br /&gt;&lt;br /&gt;   String param = "JavaFX object created in Java";&lt;br /&gt;&lt;br /&gt;   String script = String.format (&lt;br /&gt;       "MyJavaFXClass {property: \"%s\"}", param);&lt;br /&gt;&lt;br /&gt;   Object o = fxEngine.eval(script);&lt;br /&gt;&lt;br /&gt;   fxEngine.invokeMethod(o, "printProperty");&lt;br /&gt;&lt;br /&gt; } catch (Exception ex) {&lt;br /&gt;   ex.printStackTrace();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;I mean, just beautiful, isn't it...who cares about type safety and static compiling, when we just expose a half-baked scripting interface.&lt;br /&gt;&lt;br /&gt;The Silverlight/C# guys must be laughing their heads off looking at that sample.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2082784691741723706-5490716243067845837?l=jacekfurmankiewicz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekfurmankiewicz.blogspot.com/feeds/5490716243067845837/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=2082784691741723706&amp;postID=5490716243067845837' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/5490716243067845837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/5490716243067845837'/><link rel='alternate' type='text/html' href='http://jacekfurmankiewicz.blogspot.com/2008/08/using-javafx-objects-from-within-java.html' title='Using JavaFX objects from within Java: a very bad joke from Sun'/><author><name>Jacek Furmankiewicz</name><uri>http://www.blogger.com/profile/05579810225263887512</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04375114625926211545'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2082784691741723706.post-1544240566774479682</id><published>2008-07-19T03:13:00.000-07:00</published><updated>2008-07-19T03:18:07.487-07:00</updated><title type='text'>Java SwingBuilder 0.2 DEV : added support for SWT-style menu API</title><content type='html'>In my ongoing quest to maximize Swing developer productivity the latest version of the Java SwingBuilder introduces the SWT-style API for creating JMenuItems, which allows you to define the text, mnemonic and accelerator all in one shot, e.g.&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;span class="typ"&gt;JMenuItem&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;name&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt;saveMenu&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; onAction&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt;save&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; text&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="str"&gt;"&amp;amp;Save\tCtrl+S"&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;Also, the visual layout Wiki has been updated to showcase how to implement John O'Conners Layout Manager Challenge:&lt;br /&gt;&lt;a href="http://weblogs.java.net/blog/joconner/archive/2006/10/layout_manager.html"&gt;http://weblogs.java.net/blog/joconner/archive/2006/10/layout_manager.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://weblogs.java.net/blog/joconner/archive/images/addressbookdemo_mac.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px;" src="http://weblogs.java.net/blog/joconner/archive/images/addressbookdemo_mac.png" alt="" border="0" /&gt;&lt;/a&gt;using our visual layout DSL for MigLayout...piece of cake:&lt;br /&gt;&lt;blockquote&gt;&lt;pre class="prettyprint"&gt;&lt;span class="typ"&gt;JPanel&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;JScrollPane&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;name&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt;scroll1&lt;/span&gt;&lt;span class="pun"&gt;):&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;JList&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;name&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt;list&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;JLabel&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;name&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt;lNameLbl&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; text&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="typ"&gt;Last&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;Name&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;JLabel&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;name&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt;fNameLbl&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; text&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="typ"&gt;First&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;Name&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;JLabel&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;name&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt;phoneLbl&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; text&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="typ"&gt;Phone&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;JLabel&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;name&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt;emailLbl&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; text&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="typ"&gt;Email&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;JLabel&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;name&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt;address1Lbl&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; text&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="typ"&gt;Address&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="lit"&gt;1&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;JLabel&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;name&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt;address2Lbl&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; text&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="typ"&gt;Address&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="lit"&gt;2&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;JLabel&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;name&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt;cityLbl&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; text&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="typ"&gt;City&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;JLabel&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;name&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt;stateLbl&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; text&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="typ"&gt;State&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;JLabel&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;name&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt;postalLbl&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; text&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="typ"&gt;Postal&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;Code&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;JLabel&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;name&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt;countryLbl&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; text&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="typ"&gt;Country&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;JTextField&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;name&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt;lName&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;JTextField&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;name&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt;fName&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;JTextField&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;name&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt;phone&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;JTextField&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;name&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt;email&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;JTextField&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;name&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt;address1&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;JTextField&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;name&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt;address2&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;JTextField&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;name&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt;city&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;JTextField&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;name&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt;state&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;JTextField&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;name&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt;postal&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;JTextField&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;name&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt;country&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;JButton&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;name&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt;newBtn&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; text&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="typ"&gt;New&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;JButton&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;name&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt;deleteBtn&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; text&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="typ"&gt;Delete&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;JButton&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;name&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt;editBtn&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; text&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="typ"&gt;Edit&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;JButton&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;name&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt;saveBtn&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; text&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="typ"&gt;Save&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;JButton&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;name&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt;cancelBtn&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; text&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="typ"&gt;Cancel&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span class="pun"&gt;-&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;MigLayout&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;|&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;       &lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="pln"&gt;grow&lt;/span&gt;&lt;span class="pun"&gt;]&lt;/span&gt;&lt;span class="pln"&gt;                       &lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="pln"&gt;grow&lt;/span&gt;&lt;span class="pun"&gt;]&lt;/span&gt;&lt;span class="pln"&gt;                 &lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="pln"&gt;grow&lt;/span&gt;&lt;span class="pun"&gt;]&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;       scroll1&lt;/span&gt;&lt;span class="pun"&gt;+&lt;/span&gt;&lt;span class="lit"&gt;1&lt;/span&gt;&lt;span class="pun"&gt;+*&lt;/span&gt;&lt;span class="pln"&gt;     &lt;/span&gt;&lt;span class="pun"&gt;&gt;&lt;/span&gt;&lt;span class="pln"&gt;lNameLbl    lName       fNameLbl   fName                             &lt;br /&gt;                       &lt;/span&gt;&lt;span class="pun"&gt;&gt;&lt;/span&gt;&lt;span class="pln"&gt;phoneLbl    phone       emailLbl&lt;/span&gt;&lt;span class="pun"&gt;+&lt;/span&gt;&lt;span class="lit"&gt;2&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt;email              &lt;br /&gt;                       &lt;/span&gt;&lt;span class="pun"&gt;&gt;&lt;/span&gt;&lt;span class="pln"&gt;address1Lbl address1&lt;/span&gt;&lt;span class="pun"&gt;+*&lt;/span&gt;&lt;span class="pln"&gt;                                 &lt;br /&gt;                       &lt;/span&gt;&lt;span class="pun"&gt;&gt;&lt;/span&gt;&lt;span class="pln"&gt;address2Lbl address2&lt;/span&gt;&lt;span class="pun"&gt;+*&lt;/span&gt;&lt;span class="pln"&gt;                                 &lt;br /&gt;                       &lt;/span&gt;&lt;span class="pun"&gt;&gt;&lt;/span&gt;&lt;span class="pln"&gt;cityLbl     city        postalLbl  postal              &lt;br /&gt;                       &lt;/span&gt;&lt;span class="pun"&gt;&gt;&lt;/span&gt;&lt;span class="pln"&gt;stateLbl    state                                         &lt;br /&gt;                       &lt;/span&gt;&lt;span class="pun"&gt;^|&lt;/span&gt;&lt;span class="pln"&gt;newBtn&lt;/span&gt;&lt;span class="pun"&gt;+*=&lt;/span&gt;&lt;span class="lit"&gt;1&lt;/span&gt;&lt;span class="pun"&gt;,^&lt;/span&gt;&lt;span class="pln"&gt;deleteBtn&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="lit"&gt;1&lt;/span&gt;&lt;span class="pun"&gt;,^&lt;/span&gt;&lt;span class="pln"&gt;editBtn&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="lit"&gt;1&lt;/span&gt;&lt;span class="pun"&gt;,^&lt;/span&gt;&lt;span class="pln"&gt;saveBtn&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="lit"&gt;1&lt;/span&gt;&lt;span class="pun"&gt;,^&lt;/span&gt;&lt;span class="pln"&gt;cancelBtn&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="lit"&gt;1&lt;/span&gt;&lt;span class="pln"&gt;  &lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="pln"&gt;grow&lt;/span&gt;&lt;span class="pun"&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;pre class="prettyprint"&gt;&lt;span class="pun"&gt;Get the latest version from here:&lt;br /&gt;&lt;a href="http://javabuilders.googlecode.com/files/javabuilder.swing.0.2.DEV.2008-07-19.zip"&gt;http://javabuilders.googlecode.com/files/javabuilder.swing.0.2.DEV.2008-07-19.zip&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;More info as usual on &lt;a href="http://javabuilders.org"&gt;JavaBuilders.org&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2082784691741723706-1544240566774479682?l=jacekfurmankiewicz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekfurmankiewicz.blogspot.com/feeds/1544240566774479682/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=2082784691741723706&amp;postID=1544240566774479682' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/1544240566774479682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/1544240566774479682'/><link rel='alternate' type='text/html' href='http://jacekfurmankiewicz.blogspot.com/2008/07/java-swingbuilder-02-dev-added-support.html' title='Java SwingBuilder 0.2 DEV : added support for SWT-style menu API'/><author><name>Jacek Furmankiewicz</name><uri>http://www.blogger.com/profile/05579810225263887512</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04375114625926211545'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2082784691741723706.post-172183930622002194</id><published>2008-06-24T20:15:00.000-07:00</published><updated>2008-06-24T20:31:00.212-07:00</updated><title type='text'>Taking JavaFX head-on: Java SwingBuilder 0.1.RC1 is here!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_8Jr5Ge3L1KU/SGG5ulZNC4I/AAAAAAAAAEo/zg81PUFno9c/s1600-h/jb2.png"&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_8Jr5Ge3L1KU/SGG5rhB_qSI/AAAAAAAAAEg/2LGc8-nYV3U/s1600-h/Screenshot-Java+SwingBuilder+Samples+Frame.png"&gt;&lt;/a&gt;&lt;br /&gt;JavaFX is no more the only way to do modern declarative UIs on the Java platform. However, unlike JavaFX, the Java SwingBuilder allows you to do it today and in pure Java (using an external YAML file to define the layout, control definitions, data binding setup, event wiring).&lt;br /&gt;&lt;br /&gt;The aim of the Java SwingBuilder is to make UI programming in Java more productive than in any other tool, without the need for any specialized UI builders. The Java SwingBuilder runs on Java 5 and is released under the business friendly Apache 2.0 license.&lt;br /&gt;&lt;br /&gt;Main site:&lt;br /&gt;&lt;a href="http://www.javabuilders.org/"&gt;http://www.javabuilders.org&lt;/a&gt;  [&lt;a href="http://javabuilders.googlecode.com/files/javabuilder.swing.0.1.rc1.zip"&gt;0.1.RC1 direct download&lt;/a&gt;]&lt;br /&gt;&lt;br /&gt;Here are some screenshots from the samples app that is new to this release and showcases the power and productivity of the Java SwingBuilder.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_8Jr5Ge3L1KU/SGG5xR-xinI/AAAAAAAAAEw/v_ntFD3HpTU/s1600-h/jb3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_8Jr5Ge3L1KU/SGG5xR-xinI/AAAAAAAAAEw/v_ntFD3HpTU/s400/jb3.png" alt="" id="BLOGGER_PHOTO_ID_5215654099763169906" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_8Jr5Ge3L1KU/SGG5ulZNC4I/AAAAAAAAAEo/zg81PUFno9c/s1600-h/jb2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_8Jr5Ge3L1KU/SGG5ulZNC4I/AAAAAAAAAEo/zg81PUFno9c/s400/jb2.png" alt="" id="BLOGGER_PHOTO_ID_5215654053434690434" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_8Jr5Ge3L1KU/SGG5rhB_qSI/AAAAAAAAAEg/2LGc8-nYV3U/s1600-h/Screenshot-Java+SwingBuilder+Samples+Frame.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_8Jr5Ge3L1KU/SGG5rhB_qSI/AAAAAAAAAEg/2LGc8-nYV3U/s400/Screenshot-Java+SwingBuilder+Samples+Frame.png" alt="" id="BLOGGER_PHOTO_ID_5215654000723994914" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;And here are samples of the YAML files:&lt;br /&gt;&lt;a href="http://code.google.com/p/javabuilders/source/browse/trunk/org.javabuilders.swing/samples/org/javabuilders/swing/samples/ComponentsPanel.yaml"&gt;http://code.google.com/p/javabuilders/source/browse/trunk/org.javabuilders.swing/samples/org/javabuilders/swing/samples/ComponentsPanel.yaml&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/javabuilders/source/browse/trunk/org.javabuilders.swing/samples/org/javabuilders/swing/samples/BorderPanel.yaml"&gt;http://code.google.com/p/javabuilders/source/browse/trunk/org.javabuilders.swing/samples/org/javabuilders/swing/samples/BorderPanel.yaml&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/javabuilders/source/browse/trunk/org.javabuilders.swing/samples/org/javabuilders/swing/samples/MigLayoutPanel1.yaml"&gt;http://code.google.com/p/javabuilders/source/browse/trunk/org.javabuilders.swing/samples/org/javabuilders/swing/samples/MigLayoutPanel1.yaml&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The only thing missing to really give JavaFX a run for its money is the desktop FX. We will do this in a two-step approach:&lt;br /&gt;&lt;br /&gt;a) integrate JXLayer to provide desktop FX for "traditional" Swing panels (planned for 0.2)&lt;br /&gt;b) integrate Scenegraph once it reaches 1.0 and changes license from pure GPL (no exact plans at this time)&lt;br /&gt;&lt;br /&gt;Please see our wiki (which will be heavily updated with the missing details before 0.1 FINAL).&lt;br /&gt;We look forward to seeing you at the JavaBuilders Google Group with any questions or bug reports:&lt;br /&gt;&lt;a href="http://groups.google.com/group/javabuilders"&gt;http://groups.google.com/group/javabuilders&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;P.S. And last, but not least...the JavaBuilders engine is not Swing-specific. We will be starting development of the Java SWTBuilder shortly (hey, maybe we'll even do a PivotBuilder). Stay tuned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2082784691741723706-172183930622002194?l=jacekfurmankiewicz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekfurmankiewicz.blogspot.com/feeds/172183930622002194/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=2082784691741723706&amp;postID=172183930622002194' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/172183930622002194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/172183930622002194'/><link rel='alternate' type='text/html' href='http://jacekfurmankiewicz.blogspot.com/2008/06/taking-on-javafx-head-on-java.html' title='Taking JavaFX head-on: Java SwingBuilder 0.1.RC1 is here!'/><author><name>Jacek Furmankiewicz</name><uri>http://www.blogger.com/profile/05579810225263887512</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04375114625926211545'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_8Jr5Ge3L1KU/SGG5xR-xinI/AAAAAAAAAEw/v_ntFD3HpTU/s72-c/jb3.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2082784691741723706.post-6197543381190998733</id><published>2008-06-17T05:26:00.000-07:00</published><updated>2008-06-17T05:37:54.572-07:00</updated><title type='text'>New generation Java applet plugin: handles proxies like it's 1995!</title><content type='html'>Every time, I believe Sun's hype on how they are going to bring applets back, I get a crushing dose of reality as to how unlikely it is (and don't get me even started on the colossal mistake in the making that is JavaFX).&lt;br /&gt;&lt;br /&gt;So, I downloaded the latest beta of the new plugin and run via Firefox 3 some of the demos:&lt;br /&gt;&lt;a href="https://scenegraph-demos.dev.java.net/demo-applets.html"&gt;https://scenegraph-demos.dev.java.net/demo-applets.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And voila! What greets me first (running this from work)? A beautiful proxy prompt/password!&lt;br /&gt;&lt;br /&gt;Just like Flash/Flex and Silverlight pop up all the time...no, wait a minute...they don't!&lt;br /&gt;&lt;br /&gt;Imagine what would the acceptance of Flash be if every flash animation forced the user to re-enter their proxy prompt/password. Well, it seems this "new generation" (but same old thinking) plugin can't seem to integrate with the browser properly enough to get its proxy login info correctly!&lt;br /&gt;&lt;br /&gt;For crying out loud! To add insult to injury, there is a little checkbox that says "Remember password". You can check it as many times as you want, but you will still have to re-enter your proxy user name and password every time.&lt;br /&gt;&lt;br /&gt;With QA like this on the "new generation" plugin...I'd better start learning Flex soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2082784691741723706-6197543381190998733?l=jacekfurmankiewicz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekfurmankiewicz.blogspot.com/feeds/6197543381190998733/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=2082784691741723706&amp;postID=6197543381190998733' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/6197543381190998733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/6197543381190998733'/><link rel='alternate' type='text/html' href='http://jacekfurmankiewicz.blogspot.com/2008/06/new-generation-java-applet-plugin_17.html' title='New generation Java applet plugin: handles proxies like it&apos;s 1995!'/><author><name>Jacek Furmankiewicz</name><uri>http://www.blogger.com/profile/05579810225263887512</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04375114625926211545'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2082784691741723706.post-8875389110004957235</id><published>2008-06-16T02:39:00.000-07:00</published><updated>2008-06-16T06:34:05.453-07:00</updated><title type='text'>Java SwingBuilder : finally a 0.1 Beta release</title><content type='html'>I am happy to announce the Java SwingBuilder project has reached 0.1 beta status and is available for download from:&lt;br /&gt;&lt;a href="http://javabuilders.org/"&gt;http://javabuilders.org&lt;/a&gt;  [&lt;a href="http://javabuilders.googlecode.com/files/javabuilder.swing.0.1.beta.zip"&gt;Direct download link&lt;/a&gt;]&lt;br /&gt;&lt;br /&gt;This is the culmination of many months of research and work, dedicated towards bringing the power of declarative UIs to Java Swing (and in the near future SWT), by utilizing the &lt;a href="http://en.wikipedia.org/wiki/YAML"&gt;YAML&lt;/a&gt; file format (instead of XML or JSON) to define the UI and related functionality such as method handlers (no need to write action listeners, ever), support for long running background tasks, data binding, input validation, etc. All layout functionality is based around the amazing MigLayout layout manager and provides a simple DSL to it that makes creating UIs a breeze.&lt;br /&gt;&lt;br /&gt;More info available at the Java Builders wiki:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/javabuilders/wiki/Overview"&gt;http://code.google.com/p/javabuilders/wiki/Overview&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/javabuilders/wiki/JavaSwingBuilder"&gt;http://code.google.com/p/javabuilders/wiki/JavaSwingBuilder&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The 0.1 beta release also comes with optional integration libraries for SwingX and Jide Common Layer swing components.&lt;br /&gt;&lt;br /&gt;Some highlights:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Data binding is performed using the standard Beans Binding library.&lt;/li&gt;&lt;li&gt;Layout management is performed using MigLayout and nothing but MigLayout (it makes all JDK layout managers obsolete and you owe a favour to yourself to learn MigLayout and forget about GridBagLayout and GroupLayout once and for all).&lt;/li&gt;&lt;li&gt;Early versions of integrated input validation is performed using Apache Commons Validators.&lt;/li&gt;&lt;li&gt;Support for long running tasks is performed using SwingWorker.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Runs on Java 5.0.&lt;br /&gt;&lt;br /&gt;All you need to start using it in your project is a decent &lt;a href="http://en.wikipedia.org/wiki/YAML"&gt;YAML&lt;/a&gt; editor, for Eclipse we recommend the &lt;a href="http://code.google.com/p/yamleditor/"&gt;Eclipse YAML editor&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Unfortunately, the JavaBuilders project is not usable with NetBeans due to a critical bug in their &lt;a href="http://en.wikipedia.org/wiki/YAML"&gt;YAML&lt;/a&gt; editor, which at this point &lt;a href="http://www.netbeans.org/issues/show_bug.cgi?id=135166"&gt;they have no plan to fix&lt;/a&gt;. We recommend you use Eclipse or IDEA IntelliJ instead.&lt;br /&gt;&lt;br /&gt;For any questions, support, enhancements, etc. please join our&lt;br /&gt;&lt;a href="http://groups.google.com/group/javabuilders"&gt;Java Builders Google Group&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Long term plans are to provide a full-blown alternative to JavaFX, so that developers can use declarative UI and provide desktop FX in pure Java. Our next step on that path will be to integrate the amazing &lt;a href="https://jxlayer.dev.java.net/"&gt;JXLayer&lt;/a&gt; library as a standard means of providing FX to your Swing app.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://scenegraph.dev.java.net/"&gt;Scenegraph&lt;/a&gt; support will be added once they write up some documentation and change the license from pure GPL to something more business-friendly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2082784691741723706-8875389110004957235?l=jacekfurmankiewicz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekfurmankiewicz.blogspot.com/feeds/8875389110004957235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=2082784691741723706&amp;postID=8875389110004957235' title='18 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/8875389110004957235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/8875389110004957235'/><link rel='alternate' type='text/html' href='http://jacekfurmankiewicz.blogspot.com/2008/06/java-swingbuilder-finally-01-beta.html' title='Java SwingBuilder : finally a 0.1 Beta release'/><author><name>Jacek Furmankiewicz</name><uri>http://www.blogger.com/profile/05579810225263887512</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04375114625926211545'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>18</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2082784691741723706.post-4019075570683391288</id><published>2008-06-04T09:58:00.000-07:00</published><updated>2008-06-05T02:05:06.810-07:00</updated><title type='text'>Java SwingBuilder: help me integrate Scenegraph and take on JavaFX before it even arrives</title><content type='html'>As part of my &lt;a href="http://javabuilders.org/"&gt;Java Builders&lt;/a&gt; project (in particular the &lt;a href="http://code.google.com/p/javabuilders/wiki/JavaSwingBuilder"&gt;Java SwingBuilder&lt;/a&gt;) I am introducing powerful declarative UI building to pure Java using a separate YAML file to define all the layout, data binding, event wiring, layout management, etc., thus saving the Java programmer countless lines of boring, repetitive code.&lt;br /&gt;&lt;br /&gt;As part of this effort I would also like to integrate Project Scenegraph:&lt;br /&gt;&lt;a href="https://scenegraph.dev.java.net/"&gt;https://scenegraph.dev.java.net/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;which is the underlying engine behind most of JavaFX's power, but available in pure Java.&lt;br /&gt;&lt;br /&gt;Unfortunately, Scenegraph is one of the most poorly documented OSS projects out there, despite its importance. It has some minimal FAQ, some slides with API examples that are out of date compared to the latest download, etc, etc. In short it's really hard to understand all the functionality this engine provides without spending countless hours trying every little piece.&lt;br /&gt;&lt;br /&gt;Hours, which unfortunately, I do not have. But, if someone were willing to chip in and do the Scenegraph research and document clearly:&lt;br /&gt;&lt;br /&gt;- how do I add components to a scene?&lt;br /&gt;- how do you handle effects? how do you chain them together?&lt;br /&gt;- how do you handle animations? how do you define them? how do you transition from one state to another?&lt;br /&gt;- how do you do layout management for components within a scene?&lt;br /&gt;&lt;br /&gt;then armed with that documentation I could integrate it into the &lt;a href="http://code.google.com/p/javabuilders/wiki/JavaSwingBuilder"&gt;Java SwingBuilder&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Thus we would have a tool that would have all the power of JavaFX (and more), but available to pure Java...actually available to any VM language that generates Java-compatible classes. We could do RIAs without being forced to go to a different language, especially one such as JavaFX with some very questionable design choices.&lt;br /&gt;&lt;br /&gt;Please use the thread on our &lt;a href="http://groups.google.com/group/javabuilders"&gt;discussion group&lt;/a&gt; to post any findings:&lt;br /&gt;&lt;a href="http://groups.google.com/group/javabuilders/browse_thread/thread/f5b006b83dee6431?hl=en"&gt;http://groups.google.com/group/javabuilders/browse_thread/thread/f5b006b83dee6431?hl=en&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Thank you very much in advance to anyone who is willing to contribute and participate (and maybe submit some working code samples). It will be very much appreciated.&lt;br /&gt;&lt;br /&gt;Cheers, Jacek&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;LICENSE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;P.S. Danno Ferrin has brought up the interesting issue of Scenegraph licensing, which right now is GPL v2 only (the license is pretty hidden, not mentioned on the site, youhave to open the actual source code to see it). This means  it is illegal to use it in any non-GPL project (including mine, since I use Apache 2.0)&lt;br /&gt;I started a thread on this in the Scenegraph forum, let's see what the Sun guys have to say:&lt;br /&gt;&lt;a href="http://forums.java.net/jive/thread.jspa?threadID=41965&amp;amp;tstart=0"&gt;http://forums.java.net/jive/thread.jspa?threadID=41965&amp;amp;tstart=0&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2082784691741723706-4019075570683391288?l=jacekfurmankiewicz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekfurmankiewicz.blogspot.com/feeds/4019075570683391288/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=2082784691741723706&amp;postID=4019075570683391288' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/4019075570683391288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/4019075570683391288'/><link rel='alternate' type='text/html' href='http://jacekfurmankiewicz.blogspot.com/2008/06/java-swingbuilder-help-me-integrate.html' title='Java SwingBuilder: help me integrate Scenegraph and take on JavaFX before it even arrives'/><author><name>Jacek Furmankiewicz</name><uri>http://www.blogger.com/profile/05579810225263887512</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04375114625926211545'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2082784691741723706.post-5445375773996195358</id><published>2008-05-31T04:58:00.000-07:00</published><updated>2008-05-31T06:16:10.263-07:00</updated><title type='text'>Java SwingBuilder: support for JScrollPane, Border, Icon + new discussion group</title><content type='html'>New version up at &lt;a href="http://javabuilders.org"&gt;Java Builders&lt;/a&gt;:&lt;br /&gt;&lt;a href="http://javabuilders.googlecode.com/files/javabuilder.swing.0.1.2008-05-31.zip"&gt;http://javabuilders.googlecode.com/files/javabuilder.swing.0.1.2008-05-31.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Mostly lots of work under the hood, but also plugged in some missing holes:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/javabuilders/wiki/SwingBorder"&gt;Border&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/javabuilders/wiki/Icon"&gt;Icon&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/javabuilders/wiki/JScrollPane"&gt;JScrollPane&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We also hava a Java Builders group now, please join if you have any questions, need an enhancements, run into a bug, etc:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://groups.google.com/group/javabuilders"&gt;http://groups.google.com/group/javabuilders&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Gregg Bolinger has been putting the SwingBuilder through some tests and been able to create a nice panel such as this quite easily (after some initial learning curve and bug fixing on my part):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_8Jr5Ge3L1KU/SEE_8qls0kI/AAAAAAAAADM/1Prv1AApXeY/s1600-h/Screenshot-QAGen%2BUI.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_8Jr5Ge3L1KU/SEE_8qls0kI/AAAAAAAAADM/1Prv1AApXeY/s400/Screenshot-QAGen%2BUI.png" alt="" id="BLOGGER_PHOTO_ID_5206512955674120770" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2082784691741723706-5445375773996195358?l=jacekfurmankiewicz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekfurmankiewicz.blogspot.com/feeds/5445375773996195358/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=2082784691741723706&amp;postID=5445375773996195358' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/5445375773996195358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/5445375773996195358'/><link rel='alternate' type='text/html' href='http://jacekfurmankiewicz.blogspot.com/2008/05/java-swingbuilder-support-for.html' title='Java SwingBuilder: support for JScrollPane, Border, Icon + new discussion group'/><author><name>Jacek Furmankiewicz</name><uri>http://www.blogger.com/profile/05579810225263887512</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04375114625926211545'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_8Jr5Ge3L1KU/SEE_8qls0kI/AAAAAAAAADM/1Prv1AApXeY/s72-c/Screenshot-QAGen%2BUI.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2082784691741723706.post-6937544395092356003</id><published>2008-05-27T04:51:00.000-07:00</published><updated>2008-05-27T04:57:58.759-07:00</updated><title type='text'>Java SwingBuilder: our first bug fix release</title><content type='html'>&lt;a href="http://javabuilders.googlecode.com/files/javabuilder.swing.0.1.2008-05-27.zip"&gt;http://javabuilders.googlecode.com/files/javabuilder.swing.0.1.2008-05-27.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The Ant build was not including all the required resources in the generated jar file, and runtime exceptions could occur. Please update.&lt;br /&gt;&lt;br /&gt;Many thanks to Gregg Bollinger for pointing this out and submitting the first defect as well (although on an unrelated issue). Defects are good (well, not for my ego, they're not...but it's good to get some feedback).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2082784691741723706-6937544395092356003?l=jacekfurmankiewicz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekfurmankiewicz.blogspot.com/feeds/6937544395092356003/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=2082784691741723706&amp;postID=6937544395092356003' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/6937544395092356003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/6937544395092356003'/><link rel='alternate' type='text/html' href='http://jacekfurmankiewicz.blogspot.com/2008/05/java-swingbuilder-our-first-bug-fix.html' title='Java SwingBuilder: our first bug fix release'/><author><name>Jacek Furmankiewicz</name><uri>http://www.blogger.com/profile/05579810225263887512</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04375114625926211545'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2082784691741723706.post-5476693733344578098</id><published>2008-05-26T05:23:00.000-07:00</published><updated>2008-05-26T05:34:16.632-07:00</updated><title type='text'>Swing/SWT programmers: discover the  power of MigLayout</title><content type='html'>I am happy to announce a DevX.com article I wrote about Mikael Grev's amazing MigLayout layout manager:&lt;br /&gt;&lt;a href="http://www.devx.com/Java/Article/38017"&gt;http://www.devx.com/Java/Article/38017&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you are doing any UI development in either Swing or SWT, you deserver to give this layout manager a try. After getting familiar with it, I would find it painful to go back to anything else.&lt;br /&gt;&lt;br /&gt;I used one of the samples the readers have sent me on the complex UI challenge post from a few weeks ago as the base for the most complex screen in the article...I can't even imagine how convoluted the code would have been in any standard JDK layout manager.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://assets.devx.com/articlefigs/miglayout3.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px;" src="http://assets.devx.com/articlefigs/miglayout3.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Don't forget to vote on the RFE to get MigLayout included in the base JDK:&lt;br /&gt;&lt;a href="http://bugs.sun.com/bugdatabase/view_bug.do;jsessionid=2532262642c44ffffffffa36083a3bd0096c?bug_id=6530906"&gt;http://bugs.sun.com/bugdatabase/view_bug.do;jsessionid=2532262642c44ffffffffa36083a3bd0096c?bug_id=6530906&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;BTW, what's wrong with this picture? The RFE is in the top 10 RFEs, but Sun marked the priority as "5-Very Low". Earth to Sun, Earth to Sun...listen to your users. 90% of the layout manager tutorial could have been redone with nothing but MigLayout.&lt;br /&gt;&lt;br /&gt;Pretty much all layout managers in the JDK (outside of FlowLayout) could be marked as @Deprecated and replaced with MigLayout.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2082784691741723706-5476693733344578098?l=jacekfurmankiewicz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekfurmankiewicz.blogspot.com/feeds/5476693733344578098/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=2082784691741723706&amp;postID=5476693733344578098' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/5476693733344578098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/5476693733344578098'/><link rel='alternate' type='text/html' href='http://jacekfurmankiewicz.blogspot.com/2008/05/swingswt-programmers-discover-power-of.html' title='Swing/SWT programmers: discover the  power of MigLayout'/><author><name>Jacek Furmankiewicz</name><uri>http://www.blogger.com/profile/05579810225263887512</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04375114625926211545'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2082784691741723706.post-8461863618560128558</id><published>2008-05-24T03:42:00.000-07:00</published><updated>2008-05-24T03:56:53.832-07:00</updated><title type='text'>Java SwingBuilder : first support for validations, inching towards 0.1 release</title><content type='html'>I just committed the first working code that has some integrated validator logic. Latest code drop available as usual on &lt;a href="http://javabuilders.org/"&gt;javabuilders.org&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Just like with binding, it is a new root node in the YAML file:&lt;br /&gt;&lt;pre&gt;JFrame(name=frame,title=Binding Frame,size=packed):&lt;br /&gt;content:&lt;br /&gt;   - JLabel(name=fnLbl, text="First name:",labelFor=fName)&lt;br /&gt;   - JTextField(name=fName)&lt;br /&gt;   - JLabel(name=lnLbl, text="Last name:", labelFor=lName)&lt;br /&gt;   - JTextField(name=lName)&lt;br /&gt;   - JButton(name=ok, text=OK, onAction=(validateInput,save,cancel))&lt;br /&gt;   - JButton(name=cancel, text=Cancel, onAction=cancel)&lt;br /&gt;layout: |&lt;br /&gt;   []      [grow,200px]&lt;br /&gt;   &gt;fnLbl  fName&lt;br /&gt;   &gt;lnLbl  lName    &lt;br /&gt;   &gt;ok+*=1,cancel=1      [grow,bottom]&lt;br /&gt;bind:&lt;br /&gt;- firstName: fName.text&lt;br /&gt;- lastName: lName.text&lt;br /&gt;validate:&lt;br /&gt;- fName.text: {label: First Name, mandatory: true, minLength : 5}&lt;br /&gt;&lt;/pre&gt;Right now it only supports "mandatory" and "minLength", but shortly I will be adding all the validator routines supported by Apache Commons Validators:&lt;br /&gt;&lt;a href="http://commons.apache.org/validator/apidocs/org/apache/commons/validator/routines/package-summary.html#package_description"&gt;http://commons.apache.org/validator/apidocs/org/apache/commons/validator/routines/package-summary.html#package_description&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In the above example, if the First name field is missing or less than 5 characters,&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_8Jr5Ge3L1KU/SDfy4als0hI/AAAAAAAAAC4/OgsJIT9Eh-g/s1600-h/Screenshot-Binding+Frame-2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_8Jr5Ge3L1KU/SDfy4als0hI/AAAAAAAAAC4/OgsJIT9Eh-g/s400/Screenshot-Binding+Frame-2.png" alt="" id="BLOGGER_PHOTO_ID_5203894945473942034" border="0" /&gt;&lt;/a&gt;it will display a nice error dialog to inform the user:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_8Jr5Ge3L1KU/SDfyQals0gI/AAAAAAAAACw/dRdPZpnp0cw/s1600-h/Screenshot-Validation+Errors.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_8Jr5Ge3L1KU/SDfyQals0gI/AAAAAAAAACw/dRdPZpnp0cw/s400/Screenshot-Validation+Errors.png" alt="" id="BLOGGER_PHOTO_ID_5203894258279174658" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;At this point, the validation logic still needs to be called manually from the Java side:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;private final BuildResult result = SwingBuilder.build(this);&lt;br /&gt;&lt;br /&gt;public boolean validateInput() {&lt;br /&gt;return result.validate();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;but I will be looking into automating this soon.&lt;br /&gt;&lt;br /&gt;You can see the full YAML and Java here:&lt;br /&gt;&lt;a href="http://code.google.com/p/javabuilders/source/browse/trunk/org.javabuilders.swing/samples/org/javabuilders/swing/samples/binding/BindingFrame1.yaml"&gt;http://code.google.com/p/javabuilders/source/browse/trunk/org.javabuilders.swing/samples/org/javabuilders/swing/samples/binding/BindingFrame1.yaml&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/javabuilders/source/browse/trunk/org.javabuilders.swing/samples/org/javabuilders/swing/samples/binding/BindingFrame1.java"&gt;http://code.google.com/p/javabuilders/source/browse/trunk/org.javabuilders.swing/samples/org/javabuilders/swing/samples/binding/BindingFrame1.java&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Happy building! Once this is done, an official 0.1 release will finally arrive.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2082784691741723706-8461863618560128558?l=jacekfurmankiewicz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekfurmankiewicz.blogspot.com/feeds/8461863618560128558/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=2082784691741723706&amp;postID=8461863618560128558' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/8461863618560128558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/8461863618560128558'/><link rel='alternate' type='text/html' href='http://jacekfurmankiewicz.blogspot.com/2008/05/java-swingbuilder-first-support-for.html' title='Java SwingBuilder : first support for validations, inching towards 0.1 release'/><author><name>Jacek Furmankiewicz</name><uri>http://www.blogger.com/profile/05579810225263887512</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04375114625926211545'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_8Jr5Ge3L1KU/SDfy4als0hI/AAAAAAAAAC4/OgsJIT9Eh-g/s72-c/Screenshot-Binding+Frame-2.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2082784691741723706.post-792425660975900229</id><published>2008-05-22T11:49:00.000-07:00</published><updated>2008-05-22T11:51:17.792-07:00</updated><title type='text'>Java SwingBuilder: now with proper Wiki</title><content type='html'>One of the biggest shortcomings of this project was the lack of documentation, outside of this blog. I have been working on getting the Wiki complete, and although it is still not 100% done, it should give newcomers a good introduction to what this project is all about:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/javabuilders/wiki/Overview"&gt;http://code.google.com/p/javabuilders/wiki/Overview&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2082784691741723706-792425660975900229?l=jacekfurmankiewicz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekfurmankiewicz.blogspot.com/feeds/792425660975900229/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=2082784691741723706&amp;postID=792425660975900229' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/792425660975900229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/792425660975900229'/><link rel='alternate' type='text/html' href='http://jacekfurmankiewicz.blogspot.com/2008/05/java-swingbuilder-now-with-proper-wiki.html' title='Java SwingBuilder: now with proper Wiki'/><author><name>Jacek Furmankiewicz</name><uri>http://www.blogger.com/profile/05579810225263887512</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04375114625926211545'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2082784691741723706.post-7310063346678167741</id><published>2008-05-16T07:40:00.000-07:00</published><updated>2008-05-16T07:44:03.517-07:00</updated><title type='text'>Java to get a new WebKit-based browser component</title><content type='html'>Exciting news for all Java developers that plugs in an outstanding hole in the stack.&lt;br /&gt;Buried deep in the sometimes heated discussions about JavaFX on javalobby.org there was a statement from one of the core Swing developers at Sun:&lt;br /&gt;&lt;a href="http://java.dzone.com/articles/paying-price-javafx#comment-3252"&gt;http://java.dzone.com/articles/paying-price-javafx#comment-3252&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;"BTW, I was forgotting it: we're also going to have JWebPane, an embedded Swing/JavaFX component based on WebKit. It's another huge, historical gap that it's going to be closed."&lt;br /&gt;&lt;br /&gt;This is great news! Kudos to Sun for making it happen...I'll be first in line to play with JWebPane when it arrives.&lt;br /&gt;&lt;br /&gt;Also, all the new media stuff (video codecs, etc) will be integrated right into Java 7.&lt;br /&gt;&lt;br /&gt;All I can say is great work Sun. Would it be better if it was a year earlier, but I'll take it anyway without asking any questions. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2082784691741723706-7310063346678167741?l=jacekfurmankiewicz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekfurmankiewicz.blogspot.com/feeds/7310063346678167741/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=2082784691741723706&amp;postID=7310063346678167741' title='32 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/7310063346678167741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/7310063346678167741'/><link rel='alternate' type='text/html' href='http://jacekfurmankiewicz.blogspot.com/2008/05/java-to-get-new-webkit-based-browser.html' title='Java to get a new WebKit-based browser component'/><author><name>Jacek Furmankiewicz</name><uri>http://www.blogger.com/profile/05579810225263887512</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04375114625926211545'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>32</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2082784691741723706.post-8103158001904744998</id><published>2008-05-16T02:52:00.000-07:00</published><updated>2008-05-16T05:37:44.868-07:00</updated><title type='text'>Java SwingBuilder: turbo-charging YAML with virtual constructor flow</title><content type='html'>I *was* supposed to look into integrating Commons Validators into the JavaBuilder concept, but occasionally one had that flash of inspiration where for a moment you cross into "mad scientist" territory...and this week had one of those. I've added a new concept to YAML that I call "virtual constructor flow" that basically compacts the file format to the maximum level allowed by natural law. :-)&lt;br /&gt;&lt;br /&gt;OK, but let's start from the beginning. Let's say we have a typical builder file like this in YAML, with the traditional YAML white-space indentaton to indicate hierarchy:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;JFrame:&lt;br /&gt;     name: myFrame&lt;br /&gt;     title: My App Frame&lt;br /&gt;     state: max&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;YAML supports the concept of alternate flows, hence the same data can be expressed in-line, which basically turns a portion of it into JSON:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;JFrame: {name: myFrame, title: My App Frame, state: max}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This is very cool and it helps to reduce the number of lines in a file. However, it does not work if the node in question has additional child nodes. In Java SwingBuilder, by convention children are grouped under the "content" list node (same name as in JavaFX...not a coincidence, obviously):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;JFrame:&lt;br /&gt;     name: myFrame&lt;br /&gt;     title: My App Frame&lt;br /&gt;     state: max&lt;br /&gt;     content:&lt;br /&gt;        - JPanel:&lt;br /&gt;            name: mainPanel&lt;br /&gt;                content:&lt;br /&gt;                    - JButton: {name: okButton, text: OK}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The limitation / design (?) of YAML is that once you escape into the JSON format the entire child node has to be expressed in it, even if it has children of its own. This unfortunately would lead to many nested "{", "}", "[", "]" brackets (if you've seen any serious JavaFX code, you will see it often has lots of secton with 10 or more levels of nested brackets of various type).&lt;br /&gt;&lt;br /&gt;So, if I wanted to cut down on the number of lines in  a file and do it all inline it loses all the nice, clear YAML whitespace indentation and descends into JSON closing bracket hell:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;JFrame: {&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;name: myFrame, &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;title: My App Frame, &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;state: max, content: [&lt;br /&gt;     {JPanel: {name: mainPanel, content: [&lt;br /&gt;          {JButton: {name: okButton, text: OK}}&lt;br /&gt;     ]}&lt;br /&gt;]}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;In other complex file very soon you will have multiple levels of nested "}]}" type closing brackets, which makes it very unreadable IMHO. That's why I opted for YAML instead of JSON.&lt;br /&gt;&lt;br /&gt;What I would like to do is to use the in-line formats for the properties belonging to the current node and then go back to regular white-space YAML for its children, e.g.:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;JFrame: {name: myFrame, title: My App Frame, state: max}&lt;br /&gt; content:&lt;br /&gt;     - JPanel: {name: mainPanel}&lt;br /&gt;          content:&lt;br /&gt;              - JButton: {name: okButton, text: OK}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;However, this is not allowed in YAML and the YAML parsing library will exit with an exception. It's all whitespace or it's all JSON-style brackets, but you can't mix and match them.&lt;br /&gt;&lt;br /&gt;So, this is where the mad scientist mode entered. I decided to add a new flow type to YAML via  a custom preprocesor that I call "virtual constructor flow" and it looks like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;JFrame(name=myFrame, title=MyAppFrame, state=max):&lt;br /&gt;    content:&lt;br /&gt;        - JPanel(name=mainPanel):&lt;br /&gt;            content:&lt;br /&gt;                 - JButton(nam=okButton, text=OK)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This is still valid YAML (it gets processed without errors), but obviously the child properties are now embedded directly into the YAML node definition, so it does not know about them, it just sees a node defined as &lt;span style="font-family:courier new;"&gt;JFrame(name=myFrame, title=MyAppFrame, state=max)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;The JB pre-processor will take the YAML Object and do a second pass through and "explode" those properties embedded int the virtual constructor flow and create at run-time the exact same "pure" YAML hierarchy as seen at the beginning.&lt;br /&gt;&lt;br /&gt;Also, the pre-processor does some nifty stuff such as if a node is defined right off the bat as a list (e.g. "JFrame: " with "- JButton", "- JLabel" nods underneath it) it will property "move" the list one level down to the default "content" node.&lt;br /&gt;&lt;br /&gt;Therefore all we have left is:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;JFrame(name=myFrame, title=MyAppFrame, state=max):&lt;br /&gt;    - JPanel(name=mainPanel):&lt;br /&gt;        - JButton(nam=okButton, text=OK)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;A lot less than the original input:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;JFrame:&lt;br /&gt;     name: myFrame&lt;br /&gt;     title: My App Frame&lt;br /&gt;     state: max&lt;br /&gt;     content:&lt;br /&gt;        - JPanel:&lt;br /&gt;            name: mainPanel&lt;br /&gt;                content:&lt;br /&gt;                    - JButton: {name: okButton, text: OK}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;but at run-time the pre-processor will "explode" the compressed format to &lt;span style="font-weight: bold;"&gt;exactly the same thing&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Now you are wondering, "well OK, this is cool, but is it really worth it to bastardize YAML with some sort of custom extension?". And the answer is YES, it is worth, 'cause it brings amazing reduction in the size and levels of indentation when defining UIs via Java SwingBuilder.&lt;br /&gt;&lt;br /&gt;Let's say we have a simple JFrame with 3 main menus and some child menus underneath them:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_8Jr5Ge3L1KU/SC1Z34sT6rI/AAAAAAAAACk/jnzQbi3zFe4/s1600-h/jb_menu.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_8Jr5Ge3L1KU/SC1Z34sT6rI/AAAAAAAAACk/jnzQbi3zFe4/s400/jb_menu.png" alt="" id="BLOGGER_PHOTO_ID_5200911961328708274" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The pure YAML version of the build file for this looks like this:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/javabuilders/source/browse/trunk/org.javabuilders.swing/samples/org/javabuilders/swing/samples/menu/FrameWithMenu.yaml"&gt;http://code.google.com/p/javabuilders/source/browse/trunk/org.javabuilders.swing/samples/org/javabuilders/swing/samples/menu/FrameWithMenu.yaml&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;but the compressed version is WAY smaller less verbose:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/javabuilders/source/browse/trunk/org.javabuilders.swing/samples/org/javabuilders/swing/samples/menu/FrameWithMenuCondensed.yaml"&gt;http://code.google.com/p/javabuilders/source/browse/trunk/org.javabuilders.swing/samples/org/javabuilders/swing/samples/menu/FrameWithMenuCondensed.yaml&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Basically, this allows you across the board to define an entire object and all of its properties in one line of "enhanced" YAML using the virtual constructor flow.&lt;br /&gt;&lt;br /&gt;The latest build of Java SwingBuilder with support for this enhanced format is up on &lt;a href="http://javabuilders.org/"&gt;javabuilders.org&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;P.S. Here's another form converted to the new format with before/after samples:&lt;br /&gt;&lt;br /&gt;Before:&lt;br /&gt;&lt;a href="http://code.google.com/p/javabuilders/source/browse/trunk/org.javabuilders.swing/samples/org/javabuilders/swing/samples/binding/BindingFrame1.yaml?r=150"&gt;http://code.google.com/p/javabuilders/source/browse/trunk/org.javabuilders.swing/samples/org/javabuilders/swing/samples/binding/BindingFrame1.yaml?r=150&lt;/a&gt;&lt;br /&gt;After:&lt;br /&gt;&lt;a href="http://code.google.com/p/javabuilders/source/browse/trunk/org.javabuilders.swing/samples/org/javabuilders/swing/samples/binding/BindingFrame1.yaml?r=157"&gt;http://code.google.com/p/javabuilders/source/browse/trunk/org.javabuilders.swing/samples/org/javabuilders/swing/samples/binding/BindingFrame1.yaml?r=157&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Less code and less lines to type = good! :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2082784691741723706-8103158001904744998?l=jacekfurmankiewicz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekfurmankiewicz.blogspot.com/feeds/8103158001904744998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=2082784691741723706&amp;postID=8103158001904744998' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/8103158001904744998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/8103158001904744998'/><link rel='alternate' type='text/html' href='http://jacekfurmankiewicz.blogspot.com/2008/05/java-swingbuilder-turbo-charging-yaml.html' title='Java SwingBuilder: turbo-charging YAML with virtual constructor flow'/><author><name>Jacek Furmankiewicz</name><uri>http://www.blogger.com/profile/05579810225263887512</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04375114625926211545'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_8Jr5Ge3L1KU/SC1Z34sT6rI/AAAAAAAAACk/jnzQbi3zFe4/s72-c/jb_menu.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2082784691741723706.post-947341201960895533</id><published>2008-05-15T09:20:00.000-07:00</published><updated>2008-05-15T09:29:03.210-07:00</updated><title type='text'>NetBeans 6.1 : no go for YAML development</title><content type='html'>I've tried doing some YAML work in the new NetBeans 6.1 to see how it stacks up against Eclipse for JavaBuilder development.&lt;br /&gt;&lt;br /&gt;Unfortunately, a few things out the bat went wrong:&lt;br /&gt;a) the YAML editor is not part of the base IDE, nor is it a stand-alone plugin. You have to download the entire Ruby support bundle to get it. Minor, but a little annoying.&lt;br /&gt;&lt;br /&gt;YAML != Ruby on Rails&lt;br /&gt;YAML &gt; Ruby on Rails&lt;br /&gt;&lt;br /&gt;b) the editor seems to only support a small subset of YAML syntax (probably just what is needed for Ruby on Rails) and in particular it does not recognize YAML block literals:&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/YAML#Newlines_preserved"&gt;http://en.wikipedia.org/wiki/YAML#Newlines_preserved&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;which I use all over the place, especially for the "layout" definitions.&lt;br /&gt;&lt;br /&gt;I've filed two issues for this, please vote on them and help to get them fixed in a future update:&lt;br /&gt;&lt;a href="http://www.netbeans.org/issues/show_bug.cgi?id=135165"&gt;http://www.netbeans.org/issues/show_bug.cgi?id=135165&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.netbeans.org/issues/show_bug.cgi?id=135166"&gt;http://www.netbeans.org/issues/show_bug.cgi?id=135166&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2082784691741723706-947341201960895533?l=jacekfurmankiewicz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekfurmankiewicz.blogspot.com/feeds/947341201960895533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=2082784691741723706&amp;postID=947341201960895533' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/947341201960895533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/947341201960895533'/><link rel='alternate' type='text/html' href='http://jacekfurmankiewicz.blogspot.com/2008/05/netbeans-61-no-go-for-yaml-development.html' title='NetBeans 6.1 : no go for YAML development'/><author><name>Jacek Furmankiewicz</name><uri>http://www.blogger.com/profile/05579810225263887512</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04375114625926211545'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2082784691741723706.post-8420179068458157455</id><published>2008-05-15T07:10:00.000-07:00</published><updated>2008-05-15T07:16:53.250-07:00</updated><title type='text'>Trolltech makes Qt run as GTK+</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://chaos.troll.no/%7Ejbache/human.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; " src="http://chaos.troll.no/%7Ejbache/human.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Great news for us Linux fans. One of the pain points is the different look and feels of GTK+ and KDE/Qt apps.&lt;br /&gt;&lt;br /&gt;It seems the fine folks at Trolltech are working on making this go away by allowing Qt apps to use GTK+ for all the rendering (not imitated, real GTK+).&lt;br /&gt;&lt;br /&gt;Thank you Trolltech, this is a great idea. I would love to see Amarok and KTorrent blend seamlessly into my Ubuntu GNOME desktop.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://labs.trolltech.com/page/Projects/Styles/GtkStyle"&gt;http://labs.trolltech.com/page/Projects/Styles/GtkStyle&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2082784691741723706-8420179068458157455?l=jacekfurmankiewicz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekfurmankiewicz.blogspot.com/feeds/8420179068458157455/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=2082784691741723706&amp;postID=8420179068458157455' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/8420179068458157455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/8420179068458157455'/><link rel='alternate' type='text/html' href='http://jacekfurmankiewicz.blogspot.com/2008/05/trolltech-makes-qt-run-as-gtk.html' title='Trolltech makes Qt run as GTK+'/><author><name>Jacek Furmankiewicz</name><uri>http://www.blogger.com/profile/05579810225263887512</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04375114625926211545'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2082784691741723706.post-1323273690064263885</id><published>2008-05-12T19:52:00.000-07:00</published><updated>2008-05-12T20:00:27.766-07:00</updated><title type='text'>Java SwingBuilder: binding done, SwingWorker done, fat trimmed</title><content type='html'>Latest code drop on &lt;a href="http://javabuilders.org"&gt;javabuilders.org&lt;/a&gt; has the latest and greatest.&lt;br /&gt;&lt;br /&gt;The binding support comes in two basic flavors:&lt;br /&gt;&lt;br /&gt;a) straight bean-style property, e.g:&lt;br /&gt;&lt;br /&gt;bind:&lt;br /&gt;    - this.lastName : firstNameTextField.text&lt;br /&gt;&lt;br /&gt;This is a straighforward command to bind the text field's Text property (the source) to the "lastName" property of the backing Java class.&lt;br /&gt;&lt;br /&gt;b) EL-style property that allows binding to multiple properties, e.g.:&lt;br /&gt;&lt;br /&gt;bind:&lt;br /&gt;    - this.fullName: "${this.firstName} ${this.lastName}"&lt;br /&gt;&lt;br /&gt;Since "{" and "}" are reserved characters in YAML you have to break out into quoted string to put it in. Note that when dealing with multiple properties like this it is NOT POSSIBLE to bind to properties from a different object (e.g. get the text from one text field and then one from another and combine them). This is just a limitation of how Beans Binding works.&lt;br /&gt;&lt;br /&gt;As I mentioned before, the support for running background methods via @DoInBackground is done and it automatically pops up a nice progress dialog with an optional cancel button, if required. See the code in the sample's save() method to see how you can interact with it from the Java code:&lt;br /&gt;&lt;a href="http://code.google.com/p/javabuilders/source/browse/trunk/org.javabuilders.swing/samples/org/javabuilders/swing/samples/binding/BindingFrame1.java"&gt;http://code.google.com/p/javabuilders/source/browse/trunk/org.javabuilders.swing/samples/org/javabuilders/swing/samples/binding/BindingFrame1.java&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In another node, I removed all the Log4J logging code and switched to regular Java logging API (even though it is sucky compared to Log4J). Thanks to this I cut nearly 500KB in the download size (for the actual JB jar and its dependencies). We are now at a total of 1.1 MB...an overhead of 50% seemed a lot for something like logging, hence Log4J had to go.&lt;br /&gt;&lt;br /&gt;I like to keep it lean. This ain't .Net with a 30MB download forced upon you in the background via Windows Update :-)&lt;br /&gt;&lt;br /&gt;Next up: validations. Stay tuned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2082784691741723706-1323273690064263885?l=jacekfurmankiewicz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekfurmankiewicz.blogspot.com/feeds/1323273690064263885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=2082784691741723706&amp;postID=1323273690064263885' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/1323273690064263885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/1323273690064263885'/><link rel='alternate' type='text/html' href='http://jacekfurmankiewicz.blogspot.com/2008/05/java-swingbuilder-binding-done.html' title='Java SwingBuilder: binding done, SwingWorker done, fat trimmed'/><author><name>Jacek Furmankiewicz</name><uri>http://www.blogger.com/profile/05579810225263887512</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04375114625926211545'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2082784691741723706.post-6735669072495165745</id><published>2008-05-09T07:16:00.000-07:00</published><updated>2008-05-11T21:54:52.265-07:00</updated><title type='text'>Java SwingBuilder: latest updates on binding, SwingWorker and validations</title><content type='html'>It may seem quiet in JB land, but deep in the underground bowels of the Furmankiewicz Laboratories, things are churning nightly.&lt;br /&gt;&lt;br /&gt;There's a lot of unstable code right now that needs to be finished, hence no new updates, hopefully more next week.&lt;br /&gt;&lt;br /&gt;Priority is to complete a 0.1 release which will have finished support for:&lt;br /&gt;&lt;br /&gt;a) binding (Bean and EL) e.g.&lt;br /&gt;&lt;br /&gt;bind:&lt;br /&gt;- this.lastName : lastNameTextField.text&lt;br /&gt;- this.fullName: "${firstNameTextField.text} ${lastNameTextField.text}"&lt;br /&gt;&lt;br /&gt;b) support for running long running methods via SwingWorker&lt;br /&gt;&lt;br /&gt;- first, all the event handlers now support executing multiple methods in sequence, so you can do:&lt;br /&gt;&lt;br /&gt;onAction: save&lt;br /&gt;or:&lt;br /&gt;onAction: [validate, save, close]&lt;br /&gt;&lt;br /&gt;On the Java side you can use an annotation to flag which method is to be run in background:&lt;br /&gt;&lt;br /&gt;private void validate() {}&lt;br /&gt;&lt;br /&gt;@DoInBackground(progressMessage="Saving customer data...")&lt;br /&gt;private save(BackgroundEvent evt) {}&lt;br /&gt;&lt;br /&gt;private close() {&lt;br /&gt;//will only be executed AFTER the background method finishes successfully&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;c) integration with Commons Validations (or JSR 303 if there was a reference implementation), e.g.:&lt;br /&gt;&lt;br /&gt;validate:&lt;br /&gt;- firstNameTextField.text : {mandatory : true. minLength: 5, maxLength: 40}&lt;br /&gt;&lt;br /&gt;etc, etc.&lt;br /&gt;&lt;br /&gt;This is the dev plan for next week and once it's done and stable, 0.1 will be released and then maybe JB will get some notice. Wish me luck in my late night coding endeavours.&lt;br /&gt;&lt;br /&gt;P.S. Update for May 12: binding and background task support is done!&lt;br /&gt;Get latest code drop from &lt;a href="http://javabuilders.org"&gt;javabuilders.org&lt;/a&gt; to see it.&lt;br /&gt;Working example of both:&lt;br /&gt;&lt;a href="http://code.google.com/p/javabuilders/source/browse/trunk/org.javabuilders.swing/samples/org/javabuilders/swing/samples/binding/BindingFrame1.yaml"&gt;http://code.google.com/p/javabuilders/source/browse/trunk/org.javabuilders.swing/samples/org/javabuilders/swing/samples/binding/BindingFrame1.yaml&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/javabuilders/source/browse/trunk/org.javabuilders.swing/samples/org/javabuilders/swing/samples/binding/BindingFrame1.java"&gt;http://code.google.com/p/javabuilders/source/browse/trunk/org.javabuilders.swing/samples/org/javabuilders/swing/samples/binding/BindingFrame1.java&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I need to do some more work on binding to allow binding a target to multiple elements, but that can come later.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2082784691741723706-6735669072495165745?l=jacekfurmankiewicz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekfurmankiewicz.blogspot.com/feeds/6735669072495165745/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=2082784691741723706&amp;postID=6735669072495165745' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/6735669072495165745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/6735669072495165745'/><link rel='alternate' type='text/html' href='http://jacekfurmankiewicz.blogspot.com/2008/05/java-swingbuilder-latest-updates.html' title='Java SwingBuilder: latest updates on binding, SwingWorker and validations'/><author><name>Jacek Furmankiewicz</name><uri>http://www.blogger.com/profile/05579810225263887512</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04375114625926211545'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2082784691741723706.post-4561214925225598087</id><published>2008-04-30T21:28:00.000-07:00</published><updated>2008-04-30T21:34:08.531-07:00</updated><title type='text'>JavaBuilder for Swing : more binding updates</title><content type='html'>I think my initial instinct to put the bindings on the YAML side were right after all. But, this requires much larger changes.&lt;br /&gt;&lt;br /&gt;I think I have the right approach though...I will define bindings as a totally stand-alone separate root node, after all the UI elements have been created. Unlike JavaFX, I will &lt;span style="font-weight: bold;"&gt;not&lt;/span&gt; put the binding definition directly into the property value (since that entails an ugly hack like "bind: &lt;span style="font-style: italic;"&gt;binding expression&lt;/span&gt;"). This way we will have a very clear separation of concerns, just like with the "layout" component (i.e. not putting layout info at the control level, but in a separate node of its own).&lt;br /&gt;&lt;br /&gt;Here's a sample of what it *may* look like on the YAML side:&lt;br /&gt;(see the "binding" node at the end):&lt;br /&gt;&lt;a href="http://code.google.com/p/javabuilders/source/browse/trunk/org.javabuilders.swing/samples/org/javabuilders/swing/samples/binding/BindingFrame3.yaml"&gt;http://code.google.com/p/javabuilders/source/browse/trunk/org.javabuilders.swing/samples/org/javabuilders/swing/samples/binding/BindingFrame3.yaml&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I did major updates to the core engine to support multiple root nodes, so major instabilities in the code right now (probably)...will continue on this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2082784691741723706-4561214925225598087?l=jacekfurmankiewicz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekfurmankiewicz.blogspot.com/feeds/4561214925225598087/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=2082784691741723706&amp;postID=4561214925225598087' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/4561214925225598087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/4561214925225598087'/><link rel='alternate' type='text/html' href='http://jacekfurmankiewicz.blogspot.com/2008/04/javabuilder-for-swing-more-binding.html' title='JavaBuilder for Swing : more binding updates'/><author><name>Jacek Furmankiewicz</name><uri>http://www.blogger.com/profile/05579810225263887512</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04375114625926211545'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2082784691741723706.post-7126342740974893885</id><published>2008-04-30T11:02:00.000-07:00</published><updated>2008-04-30T11:05:24.841-07:00</updated><title type='text'>And now for something completely different: the new Agile baritones</title><content type='html'>Time to take a break from all this JavaBuilder madness and remember my other great passion: guitars!&lt;br /&gt;&lt;br /&gt;I already own the amazing black Agile AB-3500 baritone (perfect for those brewtal riffz tuned to B), but Rondo Music has shown up the new model, in amazing tribal green flame maple finish:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.rondomusic.com/product931.html"&gt;http://www.rondomusic.com/product931.html&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.rondomusic.net/photos/electric/ab3500tribalgreen6a.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px;" src="http://www.rondomusic.net/photos/electric/ab3500tribalgreen6a.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Man, if I didn't only have all those bills to pay I would get this beauty in a second...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2082784691741723706-7126342740974893885?l=jacekfurmankiewicz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekfurmankiewicz.blogspot.com/feeds/7126342740974893885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=2082784691741723706&amp;postID=7126342740974893885' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/7126342740974893885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/7126342740974893885'/><link rel='alternate' type='text/html' href='http://jacekfurmankiewicz.blogspot.com/2008/04/and-now-for-something-completely.html' title='And now for something completely different: the new Agile baritones'/><author><name>Jacek Furmankiewicz</name><uri>http://www.blogger.com/profile/05579810225263887512</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04375114625926211545'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2082784691741723706.post-1315339145124502524</id><published>2008-04-29T21:09:00.000-07:00</published><updated>2008-04-29T21:31:40.045-07:00</updated><title type='text'>JavaBuilder for Swing : now with two-way binding support!</title><content type='html'>I am happy to announce the first working support for binding in JavaBuilders, with full support for two way binding!&lt;br /&gt;&lt;br /&gt;I realised I had the wrong idea initially (i.e. putting binding info in the YAML file). Instead in belongs on the Java side. This is especially important once I start adding support for EL binding (that's scheduled for later this week).&lt;br /&gt;&lt;br /&gt;Here's the sample YAML build file:&lt;br /&gt;&lt;a href="http://code.google.com/p/javabuilders/source/browse/trunk/org.javabuilders.swing/samples/org/javabuilders/swing/samples/binding/BindingFrame1.yaml"&gt;http://code.google.com/p/javabuilders/source/browse/trunk/org.javabuilders.swing/samples/org/javabuilders/swing/samples/binding/BindingFrame1.yaml&lt;/a&gt;&lt;br /&gt;and the corresponding Java file:&lt;br /&gt;&lt;a href="http://code.google.com/p/javabuilders/source/browse/trunk/org.javabuilders.swing/samples/org/javabuilders/swing/samples/binding/BindingFrame1.java"&gt;&lt;span style="text-decoration: underline;"&gt;http://code.google.com/p/javabuilders/source/browse/trunk/org.javabuilders.swing/samples/org/javabuilders/swing/samples/binding/BindingFrame1.java&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And here is the resulting window when it opens:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_8Jr5Ge3L1KU/SBfzduCtxTI/AAAAAAAAACU/nSyPlWn1aLg/s1600-h/Screenshot-Binding+Frame.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_8Jr5Ge3L1KU/SBfzduCtxTI/AAAAAAAAACU/nSyPlWn1aLg/s400/Screenshot-Binding+Frame.png" alt="" id="BLOGGER_PHOTO_ID_5194888387096331570" border="0" /&gt;&lt;/a&gt;The initial field values get populated from the Java side via the two-way binding (see the constructor code).&lt;br /&gt;&lt;br /&gt;We modify it on the screen, press OK (the OK button is wired from YAML to execute the save() method) and we get:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_8Jr5Ge3L1KU/SBfzd-CtxUI/AAAAAAAAACc/Tamw59Bd5JM/s1600-h/BindingFrame2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_8Jr5Ge3L1KU/SBfzd-CtxUI/AAAAAAAAACc/Tamw59Bd5JM/s400/BindingFrame2.png" alt="" id="BLOGGER_PHOTO_ID_5194888391391298882" border="0" /&gt;&lt;/a&gt;Voila!&lt;br /&gt;&lt;br /&gt;This is starting to make Swing programming look really a lot like JSF where the YAML file has all the layout/creation info and the corresponding Java class looks like a JSF backing bean, with just the relevant properties and event methods.&lt;br /&gt;&lt;br /&gt;New code drop with this features to celebrate this:&lt;br /&gt;&lt;a href="http://javabuilders.googlecode.com/files/javabuilder.swing.0.0.2008-04-30.zip"&gt;http://javabuilders.googlecode.com/files/javabuilder.swing.0.0.2008-04-30.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In other news, the @Name annotation was changed to @Alias to more clearly indicate what it really does.&lt;br /&gt;&lt;br /&gt;Plans for the next short future:&lt;br /&gt;a) support for EL binding, e.g.&lt;br /&gt;&lt;br /&gt;@Bind("{fName.text} {lName.text}")&lt;br /&gt;private String fullName;&lt;br /&gt;&lt;br /&gt;although this would be read-only of course (from YAML to Java, not two-way).&lt;br /&gt;&lt;br /&gt;b) initial investigation of integration with a validation framework (maybe Hibernate Validators, if it's not JPA specific)&lt;br /&gt;&lt;br /&gt;c) finished the MouseListener handler to provide support for the following events:&lt;br /&gt;&lt;br /&gt;onMouseClicked&lt;br /&gt;onMouseDoubleClicked&lt;br /&gt;onMouseRightClicked&lt;br /&gt;onMouseEnter&lt;br /&gt;onMouseExited&lt;br /&gt;onMousePressed&lt;br /&gt;onMouseReleased&lt;br /&gt;&lt;br /&gt;See sample:&lt;br /&gt;&lt;a href="http://code.google.com/p/javabuilders/source/browse/trunk/org.javabuilders.swing/samples/org/javabuilders/swing/samples/TestFrame.yaml"&gt;http://code.google.com/p/javabuilders/source/browse/trunk/org.javabuilders.swing/samples/org/javabuilders/swing/samples/TestFrame.yaml&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Stay tuned!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2082784691741723706-1315339145124502524?l=jacekfurmankiewicz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekfurmankiewicz.blogspot.com/feeds/1315339145124502524/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=2082784691741723706&amp;postID=1315339145124502524' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/1315339145124502524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2082784691741723706/posts/default/1315339145124502524'/><link rel='alternate' type='text/html' href='http://jacekfurmankiewicz.blogspot.com/2008/04/javabuilder-for-swing-now-with-two-way.html' title='JavaBuilder for Swing : now with two-way binding support!'/><author><name>Jacek Furmankiewicz</name><uri>http://www.blogger.com/profile/05579810225263887512</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04375114625926211545'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_8Jr5Ge3L1KU/SBfzduCtxTI/AAAAAAAAACU/nSyPlWn1aLg/s72-c/Screenshot-Binding+Frame.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>11</thr:total></entry></feed>