<?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-18862554</id><updated>2009-07-03T01:48:02.878+02:00</updated><title type='text'>Java Blog</title><subtitle type='html'>In diesem Blog schreibt Christian Ullenboom über aktuelle Java-Entwicklungen, neue Open-Source-Bibliotheken, Best-Practices, neue Eclipse-Plugins und Neuerungen im Buch ›Java ist auch eine Insel‹.</subtitle><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default'/><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default?start-index=26&amp;max-results=25'/><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.tutego.com/blog/javainsel/atom.xml'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>353</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-18862554.post-4458960644573136884</id><published>2009-07-03T01:48:00.001+02:00</published><updated>2009-07-03T01:48:02.998+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Die wöchentliche Dosis Java'/><title type='text'>Thema der Woche: Effective Java</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Das Buch &lt;a href='http://www.amazon.de/Effective-Java-Programming-Language-Guide/dp/0201310058'&gt;Effective Java&lt;/a&gt; ist eines der beliebtesten Bücher für den fortgeschrittenen Java-Programmierer (http://java.sun.com/docs/books/effective/). Vor gar nicht allzulanger Zeit ist das Buch in die 2. Aufgabe gegangen (erste Auflage &lt;a href='http://www.google.de/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=12&amp;amp;url=http%3A%2F%2Fresearch.rmutp.ac.th%2Febook%2FEffective%2520Java%2520-%2520Programming%2520Language%2520Guide%2520-%25201st%2520Ed%25202001.pdf&amp;amp;ei=UUVNSoy2HYr1_AaKlb2-BQ&amp;amp;usg=AFQjCNGppJKec04sleK4o48dzaO3PSG_Uw&amp;amp;sig2=27YEULaPvPMrmXakkMsh1A'&gt;online&lt;/a&gt;).&lt;br/&gt;&lt;br/&gt;Gehe die verfügbaren Informationen durch:&lt;br/&gt;&lt;ul&gt;&lt;li&gt;&lt;a href='http://www.google.de/search?q=effective+java+pdf&amp;amp;hl=de&amp;amp;client=firefox-a&amp;amp;rls=org.mozilla:en-US:official&amp;amp;start=10&amp;amp;sa=N'&gt;Online-Version der ersten Auflage&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Aus der 2. Aufgabe ist das Generics-Kapitel frei verfügbar: &lt;a href='http://java.sun.com/docs/books/effective/generics.pdf'&gt;http://java.sun.com/docs/books/effective/generics.pdf&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='developers.sun.com/learning/javaoneonline/2007/pdf/TS-2689.pdf'&gt;developers.sun.com/learning/javaoneonline/2007/pdf/TS-2689.pdf&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://sites.google.com/site/io/effective-java-reloaded'&gt;http://sites.google.com/site/io/effective-java-reloaded&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://jaoo.com.au/brisbane-2009/file?path=/jaoo-sydney-2009/slides/JoshuaBloch_KeynoteEffectiveJavaStillEffectiveAfterAllTheseYears.pdf'&gt;http://jaoo.com.au/brisbane-2009/file?path=/jaoo-sydney-2009/slides/JoshuaBloch_KeynoteEffectiveJavaStillEffectiveAfterAllTheseYears.pdf&lt;/a&gt;&lt;br/&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-4458960644573136884?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/4458960644573136884/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18862554&amp;postID=4458960644573136884' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/4458960644573136884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/4458960644573136884'/><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2009/07/thema-der-woche-effective-java.html' title='Thema der Woche: Effective Java'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01526790562813987856'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-7818884048193186318</id><published>2009-07-02T21:15:00.001+02:00</published><updated>2009-07-02T21:15:59.258+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><title type='text'>Welches Projekt wird von Maven wie oft referenziert?</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Das sagt &lt;a href='http://www.mvnbrowser.com/most-referenced.html'&gt;http://www.mvnbrowser.com/most-referenced.html&lt;/a&gt;. Die Liste ist interessant zu lesen. Vielleicht nicht ganz unerwartet ist ganz oben JUnit und log4j -- das wird von nahezu allen Programmen referenziert. Interessant in der Liste finde ich,&lt;br/&gt;&lt;ul&gt;&lt;li&gt;das HSQLDB doch noch so oft (für Tests) gebraucht wird, aber Derby noch auf die erste Seite kommt,&lt;br/&gt;&lt;/li&gt;&lt;li&gt;Spring (schon) so weit oben seht,&lt;/li&gt;&lt;li&gt;CXF vor Axis und dem alten XFire steht,&lt;/li&gt;&lt;li&gt;JAXB so groß im Einsatz ist,&lt;/li&gt;&lt;li&gt;Plexus von CodeHaus in der Liste auf der ersten Seite steht (unter anderem von Maven2 genutztes IoC-Framwork und daher wohl so weit vorne),&lt;/li&gt;&lt;li&gt;dom4j populärer als JDOM ist,&lt;/li&gt;&lt;li&gt;Struts ist (ein wenig) wichtiger als WebWork aber weit abgeschlagen von JSF.&lt;br/&gt;&lt;/li&gt;&lt;/ul&gt;Eher unbekannte Projekte sind:&lt;br/&gt;&lt;ul&gt;&lt;li&gt;http://classworlds.codehaus.org/&lt;/li&gt;&lt;li&gt;http://qdox.codehaus.org/&lt;/li&gt;&lt;li&gt;http://www.janino.net/&lt;/li&gt;&lt;/ul&gt;&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-7818884048193186318?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/7818884048193186318/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18862554&amp;postID=7818884048193186318' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/7818884048193186318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/7818884048193186318'/><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2009/07/welches-projekt-wird-von-maven-wie-oft.html' title='Welches Projekt wird von Maven wie oft referenziert?'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01526790562813987856'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-1506299508272617141</id><published>2009-07-02T20:17:00.001+02:00</published><updated>2009-07-02T20:17:38.184+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><title type='text'>JavaDoc in Wiki-Notation statt HTML</title><content type='html'>&lt;p&gt;Das ist das Ziel vom &lt;a title="http://code.google.com/p/markdown-doclet/" href="http://code.google.com/p/markdown-doclet/"&gt;http://code.google.com/p/markdown-doclet/&lt;/a&gt;. Mit der Syntax von &lt;a title="http://daringfireball.net/projects/markdown/syntax" href="http://daringfireball.net/projects/markdown/syntax"&gt;http://daringfireball.net/projects/markdown/syntax&lt;/a&gt; und zusammen mit leicht optimiertem CSS und kleinen UML-Diagrammen für die Hierarchien, folgt:&lt;/p&gt; &lt;p&gt;&lt;a name="Example"&gt;&lt;img src="http://www.richardnichols.net/custom/markdown/example.jpg"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-1506299508272617141?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/1506299508272617141/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18862554&amp;postID=1506299508272617141' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/1506299508272617141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/1506299508272617141'/><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2009/07/javadoc-in-wiki-notation-statt-html.html' title='JavaDoc in Wiki-Notation statt HTML'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01526790562813987856'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-5781441063153595352</id><published>2009-07-02T16:52:00.001+02:00</published><updated>2009-07-02T16:52:43.149+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Entwicklungsumgebung'/><title type='text'>IDE-Woche: Eclipse 3.5, NetBeans 6.7, IntelliJ 9 M1</title><content type='html'>&lt;p&gt;So viel IDE gab es noch nie. In einer Woche drei wichtige Neuerungen.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Mit viel Tamtam wurde Eclipse 3.5 (Galileo) veröffentlicht. &lt;a title="http://www.eclipse.org/downloads/" href="http://www.eclipse.org/downloads/"&gt;http://www.eclipse.org/downloads/&lt;/a&gt;&lt;/li&gt; &lt;li&gt;Bei Sun gibt es mit NetBeans 6.7 ebenfalls ein neues Release. &lt;a title="http://www.netbeans.org/servlets/NewsItemView?newsItemID=1399" href="http://www.netbeans.org/servlets/NewsItemView?newsItemID=1399"&gt;http://www.netbeans.org/servlets/NewsItemView?newsItemID=1399&lt;/a&gt;&lt;/li&gt; &lt;li&gt;IntelliJ IDEA 9 Milestone 1 ist verfügbar. &lt;a href="http://www.jetbrains.com/idea/nextversion/index.html?utm_source=TSS&amp;amp;utm_media=Anouncement&amp;amp;utm_campaign=IDEA9_M1"&gt;http://www.jetbrains.com/idea/nextversion/index.html?utm_source=TSS&amp;amp;utm_media=Anouncement&amp;amp;utm_campaign=IDEA9_M1&lt;/a&gt;. IntelliJ ist Vorreiter bei Java EE 6 und integriert auch Google Android Entwicklung und weitere Innovationen.&lt;/li&gt;&lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-5781441063153595352?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/5781441063153595352/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18862554&amp;postID=5781441063153595352' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/5781441063153595352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/5781441063153595352'/><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2009/07/ide-woche-eclipse-35-netbeans-67.html' title='IDE-Woche: Eclipse 3.5, NetBeans 6.7, IntelliJ 9 M1'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01526790562813987856'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-2465331296859399521</id><published>2009-06-11T22:18:00.001+02:00</published><updated>2009-06-11T22:18:53.279+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><title type='text'>JaQue Version 1.5: MS LINQ Expression Trees für Java</title><content type='html'>&lt;p&gt;Von der &lt;a href="http://code.google.com/p/jaque/"&gt;Webseite&lt;/a&gt;:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;a name="Outline"&gt;JaQue provides an infrastructure for Microsoft &lt;/a&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb308959.aspx"&gt;LINQ&lt;/a&gt; like capabilities on Java platform. Using &lt;a href="http://asm.objectweb.org"&gt;ASM&lt;/a&gt;, JaQue builds expression trees, which are used to build a query in domain specific technology or language, such as SQL. This way Java developers can focus on writing application logic in the language they know - Java, regardless what the underlying technology or language is in use. JaQue to Objects and JaQue to XML are currently supported and JaQue to JPA is under development.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Ein Beispiel macht das praktisch deutlich:&lt;pre&gt;EntityManagerFactory emf = Persistence.createEntityManagerFactory("hibernate");&lt;br&gt;&amp;nbsp; EntityManager em = emf.createEntityManager();&lt;br&gt;&amp;nbsp; JaqueEntityManager jem = new JaqueEntityManager(em);&lt;br&gt;&amp;nbsp; Queryable&amp;lt;Order&amp;gt; orders = jem.from(Order.class);&lt;br&gt;&lt;br&gt;&amp;nbsp; System.out.println(count(where(new Predicate&amp;lt;Order&amp;gt;() {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Boolean invoke(Order t) throws Throwable {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return t.getOrderID() &amp;gt; 11000;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp; }, orders)));&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Wie bei LINQ soll eine eine API für die verschiedenen Datenquellen geben, also XML, Objekte, Datenbanken, … Für JPA schreibt die Seite “Currently it's able to perform only simple SELECTs, JOINs and AGGREGATEs”. Das ist natürlich nicht viel. Insofern ist diese Lösung WEIT von den LINQ to SQL-Möglichkeiten entfernt.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Der Hinweis der Webseite auf “&lt;a name="Interoperability_with_Java_Closures"&gt;Interoperability with Java Closures&lt;/a&gt;” ist natürlich hinfällig. Dadurch, dass Closures aber wegfallen, wird die ganze API viel aufgeblähter, als wenn man Closures hätte. Die Scala-Variante ist daher auch viel kürzer.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;PS: Die nächsten 2 Wochen gibt es keine Blog-Einträge, da ich ich Afrika bin.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-2465331296859399521?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/2465331296859399521/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18862554&amp;postID=2465331296859399521' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/2465331296859399521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/2465331296859399521'/><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2009/06/jaque-version-15-ms-linq-expression.html' title='JaQue Version 1.5: MS LINQ Expression Trees für Java'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01526790562813987856'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-5425726809355605509</id><published>2009-06-10T10:38:00.001+02:00</published><updated>2009-06-10T10:38:13.742+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Frameworks'/><title type='text'>GWT-bezogene Videos von der Google I/O Konferenz 2009</title><content type='html'>&lt;p&gt;Im &lt;a href="http://google-code-updates.blogspot.com/2009/06/google-web-toolkit-at-google-io.html"&gt;Google Code Blog&lt;/a&gt; werden einige Videos vorgestellt, die den aktuellen Zustand von GWT widerspiegeln. Etwa&lt;/p&gt; &lt;p&gt;GWT Can Do What?!?! A Preview of Google Web Toolkit 2.0 (&lt;a href="http://dl.google.com/io/2009/pres/W_1115_GWTCanDoWhat.pdf"&gt;PDF&lt;/a&gt;):&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/e9A4FqholOY&amp;amp;hl=de&amp;amp;fs=1&amp;amp;rel=0&amp;amp;color1=0x234900&amp;amp;color2=0x4e9e00"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/e9A4FqholOY&amp;amp;hl=de&amp;amp;fs=1&amp;amp;rel=0&amp;amp;color1=0x234900&amp;amp;color2=0x4e9e00" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt; &lt;p&gt;Und weitere:&lt;/p&gt; &lt;p&gt;&lt;a href="http://code.google.com/events/io/sessions/GoogleWavePoweredByGWT.html"&gt;Google Wave - Powered by GWT&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://code.google.com/events/io/sessions/GoogleWebToolkitBestPractices.html"&gt;Google Web Toolkit Architecture: Best Practices for Architecting your GWT App&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://code.google.com/events/io/sessions/MeasureMillisecondsPerformanceTipsWebToolkit.html"&gt;Measure in Milliseconds: Performance Tips for Google Web Toolkit&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://code.google.com/events/io/sessions/EffectiveGwt.html"&gt;Effective GWT: Developing a Complex, High- performance App with Google Web Toolkit&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://code.google.com/events/io/sessions/StoryCompilerGwtCompiler.html"&gt;The Story of your Compile: Reading the Tea Leaves of the GWT Compiler for an Optimized Future&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://code.google.com/events/io/sessions/ProgressivelyEnhanceAjaxApps.html"&gt;Progressively Enhance AJAX Applications with Google Web Toolkit and GQuery&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://code.google.com/events/io/sessions/BuildingAppsGoogleAPIs.html"&gt;Building Applications with Google APIs&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-5425726809355605509?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/5425726809355605509/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18862554&amp;postID=5425726809355605509' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/5425726809355605509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/5425726809355605509'/><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2009/06/gwt-bezogene-videos-von-der-google-io.html' title='GWT-bezogene Videos von der Google I/O Konferenz 2009'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01526790562813987856'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-2752080982756232764</id><published>2009-06-08T21:06:00.001+02:00</published><updated>2009-06-08T21:06:42.242+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Swing'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Frameworks'/><title type='text'>Mit AjaxSwing Swing Anwendungen als Web-Anwendungen laufen lassen</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Das macht die Swing - AJAX bridge. Das &lt;a href='http://www.creamtec.com/products/ajaxswing/demos.html'&gt;SwingSet2 Demo&lt;/a&gt; ist schon mal ein guter Start. Die Entwickler sagen, dass das Demo ohne Quellcodemodifikationen läuft. Lauf FAQ laufen 95% der Anwendungen vernünfitg nach 30 Minuten Konfiguration. Die Vorraussetzungen für den Web-Server, das das hostet ist minimal: es läuft schon ab Java 1.2. Auch für den Client sind die Anforderungen wirklich gering: Internet Explorer 4+, FireFox 1.2+ bzw. jeder HTML 4.0 Browser. (Vielleich sieht daher das LaF von AjaxSwing standardmäßig so schrottig aus. Lässt sich aber alles anpassen.) Probleme kann es im Einzelfall etwa beim Eventing geben, wenn der Browser nicht alle Events weitergibt. Auch bei Multithreaded-Anwendungen kann es Probleme geben, wenn im AWT-Event-Thread neue Threads aufgemacht werden und die die Gui modifizieren (auch mit SwingUtilities.invokeLater/Now). Da AjaxSwing auch schon bei JComponent mit der Abbildung beginnt, laufen auch Bibliotheken wie SwingX. Mit einen SnapshotRenderer für "harte" Fälle lässt sich auch serverseitig rendern und dann als JPG in die Seite einfügen.&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-2752080982756232764?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/2752080982756232764/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18862554&amp;postID=2752080982756232764' title='2 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/2752080982756232764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/2752080982756232764'/><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2009/06/mit-ajaxswing-swing-anwendungen-als-web.html' title='Mit AjaxSwing Swing Anwendungen als Web-Anwendungen laufen lassen'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01526790562813987856'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-7869407042604762996</id><published>2009-06-08T12:05:00.001+02:00</published><updated>2009-06-08T12:05:43.802+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Die wöchentliche Dosis Java'/><title type='text'>Thema der Woche: Pull-Parser/StAX</title><content type='html'>&lt;p&gt;Nicht immer können und müssen Objektgraphen von XML-Dateien – entweder pur als XML-DOM, oder gemappt über etwa JAXB – im Speicher gehalten werden. Muss nur einmal eine XML-Datei abgelaufen werden (natürlich können in diesem einen Durchlauf dann der XML-DOM aufgebaut werden), kann gut ein Pull-Parser eingesetzt werden.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Lies &lt;a href="http://openbook.galileocomputing.de/javainsel8/javainsel_15_004.htm#mjd0dbb53e72e3b53b011e15c20054078f"&gt;Serielle Verarbeitung mit StAX&lt;/a&gt;&lt;/li&gt; &lt;li&gt;Warum kann ein Pull-Parser schnell als Push-Parser (SAX) arbeiten?&lt;/li&gt; &lt;li&gt;Verstehe im Groben &lt;a title="http://jira.codehaus.org/secure/attachment/28197/StaxBuilder.java" href="http://jira.codehaus.org/secure/attachment/28197/StaxBuilder.java"&gt;http://jira.codehaus.org/secure/attachment/28197/StaxBuilder.java&lt;/a&gt;.&lt;/li&gt; &lt;li&gt;Implementiere einen XHTML-Prüfer, der meldet, ob im &lt;strong&gt;img&lt;/strong&gt;-Tag das Attribut &lt;strong&gt;alt&lt;/strong&gt; gesetzt ist.&lt;/li&gt;&lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-7869407042604762996?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/7869407042604762996/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18862554&amp;postID=7869407042604762996' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/7869407042604762996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/7869407042604762996'/><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2009/06/thema-der-woche-pull-parserstax.html' title='Thema der Woche: Pull-Parser/StAX'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01526790562813987856'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-7580787128932119770</id><published>2009-06-06T23:04:00.001+02:00</published><updated>2009-06-06T23:04:46.388+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Frameworks'/><title type='text'>Ext GWT Beispiel mit EditorGrid/GroupingView/GroupingStore</title><content type='html'>&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_gE1YIJtpGBw/SirZ65olCLI/AAAAAAAAAJ4/8QvX3kQfJ3I/s1600-h/sshot-1%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="sshot-1" border="0" alt="sshot-1" src="http://lh5.ggpht.com/_gE1YIJtpGBw/SirZ7YoR6sI/AAAAAAAAAJ8/3IeALkpveQs/sshot-1_thumb%5B1%5D.png?imgmax=800" width="803" height="380"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;GroupingStore&amp;lt;BaseModel&amp;gt; store = new GroupingStore&amp;lt;BaseModel&amp;gt;(); &lt;/p&gt; &lt;p&gt;BaseModel c1 = new BaseModel();&lt;br&gt;c1.set( "title", "Java 1" );&lt;br&gt;c1.set( "category", "JAVA" );&lt;br&gt;c1.set( "price", 100 );&lt;br&gt;store.add( c1 );  &lt;p&gt;BaseModel c2 = new BaseModel();&lt;br&gt;c2.set( "title", "Java 2" );&lt;br&gt;c2.set( "category", "JAVA" );&lt;br&gt;c2.set( "price", 200 );&lt;br&gt;store.add( c2 );  &lt;p&gt;BaseModel c3 = new BaseModel();&lt;br&gt;c3.set( "title", "C#" );&lt;br&gt;c3.set( "category", ".NET" );&lt;br&gt;c3.set( "price", 100 );&lt;br&gt;store.add( c3 );  &lt;p&gt;List&amp;lt;ColumnConfig&amp;gt; config = new ArrayList&amp;lt;ColumnConfig&amp;gt;();&lt;br&gt;config.add( new ColumnConfig( "category", "Kategorie", 200 ) );&lt;br&gt;config.add( new ColumnConfig( "title", "Titel", 100 ) );&lt;br&gt;config.add( new ColumnConfig( "price", "Preis", 100 ) );  &lt;p&gt;store.groupBy( "category" );  &lt;p&gt;final ColumnModel cm = new ColumnModel( config );  &lt;p&gt;GroupingView view = new GroupingView();&lt;br&gt;view.setShowGroupedColumn( false );&lt;br&gt;view.setForceFit( true );&lt;br&gt;view.setGroupRenderer( new GridGroupRenderer()&lt;br&gt;{&lt;br&gt;&amp;nbsp; public String render( GroupColumnData data )&lt;br&gt;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; String header = cm.getColumnById( data.field ).getHeader();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; String items = data.models.size() == 1 ? "Eintrag" : "Einträge";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return header + " " + data.group + " (" + data.models.size() + " " + items + ")";&lt;br&gt;&amp;nbsp; }&lt;br&gt;} );  &lt;p&gt;EditorGrid&amp;lt;BaseModel&amp;gt; grid = new EditorGrid&amp;lt;BaseModel&amp;gt;( store, cm );&lt;br&gt;grid.setView( view );&lt;br&gt;grid.setBorders( true );&lt;br&gt;grid.setAutoHeight( true );&amp;nbsp; &lt;p&gt;ContentPanel cp = new ContentPanel();&lt;br&gt;cp.add( grid );&lt;br&gt;cp.setHeight( 500 );&lt;br&gt;RootPanel.get().add( cp );&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-7580787128932119770?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/7580787128932119770/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18862554&amp;postID=7580787128932119770' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/7580787128932119770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/7580787128932119770'/><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2009/06/ext-gwt-beispiel-mit.html' title='Ext GWT Beispiel mit EditorGrid/GroupingView/GroupingStore'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01526790562813987856'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-4415830610842442681</id><published>2009-06-06T19:39:00.001+02:00</published><updated>2009-06-06T19:39:24.797+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Frameworks'/><title type='text'>Will ich eigentlich RIA mit Ext GWT?</title><content type='html'>&lt;p&gt;Nach dem ich nun eine Woche eine Anwendung mit Ext GWT (GXT) zusammengebaut habe, kommen mir Zweifel, ob Ext GWT überhaupt das richtige für meinen Anwendungsfall ist. Einige Fragen in dem Zusammenhang:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Ist Ext GWT 2.0 M2 gut gewählt?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Ext GWT 2 gibt es noch gar nicht lange (&lt;a title="http://extjs.com/blog/2009/05/20/ext-gwt-20-milestone-2-released/" href="http://extjs.com/blog/2009/05/20/ext-gwt-20-milestone-2-released/"&gt;http://extjs.com/blog/2009/05/20/ext-gwt-20-milestone-2-released/&lt;/a&gt;), neues M2 Release also vor 2 Wochen, und die Komponenten sind grundsätzlich toll. Auf der Demo Seite &lt;a title="http://extjs.com/examples-dev/explorer.html#overview" href="http://extjs.com/examples-dev/explorer.html#overview"&gt;http://extjs.com/examples-dev/explorer.html#overview&lt;/a&gt; kann man sich das anschauen.&lt;/p&gt; &lt;p&gt;Probleme: Ext GWT 2.0 hat in meinen Augen sehr vielen Änderungen in der API. Quellcode für Ext GWT 1.0 findet man im Netz, doch viele Beispiele lassen sich nicht ohne weiteres auf die 2er Version übertragen. Wer migrieren will/muss wird noch seinen Spaß bekommen. Einige Beispiele laufen in der Demo nicht (&lt;a title="http://extjs.com/examples-dev/explorer.html#grouping" href="http://extjs.com/examples-dev/explorer.html#grouping"&gt;http://extjs.com/examples-dev/explorer.html#grouping&lt;/a&gt;), bei anderen fehlt der Quellcode im Demo. Da muss man dann die Quellen laden.&lt;/p&gt; &lt;p&gt;Laut Ankündigung müsste GXT schon längst fertig sein.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Was passt mir an Ext GWT nicht?&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Die Dokumentation. Einfache Beispiele zu finden kostet viel Zeit. Es fehlt so etwas wie ein &lt;a href="http://www.exampledepot.com/"&gt;Java-Almanac&lt;/a&gt; für Ext GWT. Aus komplexen Szenarien kann man sich einfache Beispiele ableiten, von dort diese auf seinen Anwendungsfall übertragen. Selbst die Beispiele aus dem ShowCase könnten einfacher sein, denn der ShowCase nutzt interne “Demo-Datengeber-Klassen”. Hier wären in meinen Augen einfachere Beispiele gut gewesen, die wirklich eigenständig sind um schnell die wichtigsten Schnittstellen ablesen zu können. &lt;li&gt;Compiliere ich meine Programme, so lassen sich im Browser plötzlich keine Textfelder mehr selektieren und den Cursor sieht man nicht.  &lt;li&gt;Das Layout-Handing. Da die Ext GWT Anwendungen auf eine “Bildschirmseite” kommen, und weniger auf einem beliebig langen HTML-Dokument, gibt es Probleme mit den Höhen. Manches mal sind die Elemente in einem Scroll-Container zu klein, dann zu groß. Ich habe viel Zeit damit verbracht, große Tabellen in den richtigen Größen auf den Container zu setzen. &lt;li&gt;Während das Orginal-GWT viele eher den typischen Web-Charakter hat, basiert Ext GWT auf dem Applikationsgedanken: (Popup-)Menüs in Web-Applikationen? Hm … &lt;li&gt;Anpassungen des Aussehens sind eine Qual. Die CSS-Datei gxt-all.css ist &lt;strong&gt;6478&lt;/strong&gt; Zeilen lang, gxt-gray.css noch mal 443! Wer viel Zeit hat, kann einmal versuchen, den Font 2 Pixel größer zu setzen. Dazu müssen natürlich auch die Icons passen. Strg++ geht nicht einfach so. &lt;li&gt;Es “erfindet” GXT eigentlich alles neu: Widgets, Container, Layout-Manager, Grafik-Einbindung, …. Besonders blöd ist das bei den Grafiken, wo Google mit Proxies einen schönen Ansatz fährt. &lt;li&gt;Es gibt keinen Gui-Builder, für GWT aber schon.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;War Ext GWT eine gute Wahl, oder hätte es doch SmartGWT sein sollen?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Das weiß ich nicht, denn mit SmartGWT habe ich nur einfache Beispiele programmiert. Ext GWT hat aber den gleichen RIA-Ansatz wie SmartGWT, und unterscheidet sich nicht großartig im Ansatz. Die GXT-Komponenten sehen auf jeden Fall super aus. Daher hat mich GXT ja auch so angezogen. Wer hübscher ist gewinnt :) Die Komponenten sind fancy und meine Lieblinge sind &lt;a title="http://extjs.com/examples-dev/explorer.html#advancedcharts" href="http://extjs.com/examples-dev/explorer.html#advancedcharts"&gt;http://extjs.com/examples-dev/explorer.html#advancedcharts&lt;/a&gt; (cool), &lt;a title="http://extjs.com/examples-dev/explorer.html#gridplugins" href="http://extjs.com/examples-dev/explorer.html#gridplugins"&gt;http://extjs.com/examples-dev/explorer.html#gridplugins&lt;/a&gt;, &lt;a title="http://extjs.com/examples-dev/explorer.html#grouping" href="http://extjs.com/examples-dev/explorer.html#grouping"&gt;http://extjs.com/examples-dev/explorer.html#grouping&lt;/a&gt;, &lt;a title="http://extjs.com/examples-dev/explorer.html#filtertree" href="http://extjs.com/examples-dev/explorer.html#filtertree"&gt;http://extjs.com/examples-dev/explorer.html#filtertree&lt;/a&gt;, &lt;a title="http://extjs.com/examples-dev/explorer.html#gridtogrid" href="http://extjs.com/examples-dev/explorer.html#gridtogrid"&gt;http://extjs.com/examples-dev/explorer.html#gridtogrid&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Ist ein RIA-Framework wie GXT immer gut?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Das ist eigentlich die zentrale Frage.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Die Standard-Komponenten von GWT sind etwas “einfach”. Natürlich nutzt GXT das GWT als Infrastruktur, aber hat sich in meinen Augen weit davon entfernt.&lt;/li&gt; &lt;li&gt;GXT versucht, alle Desktop-Komponenten in den Browser zu bekommen. Und so bekommen wir immer mehr und mehr tolle Komponenten. Das hat aber seinen Preis! Der generierte JavaScript-Code wird schnell astronomisch. Und die Anwendungen sehen eben nicht mehr so aus wie Webseiten. Das ist mal gewollt, mal nicht gewollt. Ein richtig und falsch gibt es nicht! Wer aber vollständige Applikationen im Web-Schreiben möchte, der bekommt mit GXT ein gutes Framework. Alles ist vorbereitet und das Look-and-Feel konsistent.&lt;/li&gt; &lt;li&gt;Änderungen des Aussehens sind aufwändig. Wenn man also HTML/CSS sehen und damit designen möchte, ist mit GXT nicht optimal bedient. (Als nächstes teste ich &lt;a title="http://code.google.com/p/google-web-toolkit-incubator/wiki/UiBinder" href="http://code.google.com/p/google-web-toolkit-incubator/wiki/UiBinder"&gt;http://code.google.com/p/google-web-toolkit-incubator/wiki/UiBinder&lt;/a&gt; --- wenn der denn mal im Trunk ist…) Soll ein (echte) Webdesigner eine GXT-Anwendung skinnen, wird der sicherlich nicht glücklich werden. Es ist eben nicht Design first.&lt;/li&gt;&lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-4415830610842442681?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/4415830610842442681/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18862554&amp;postID=4415830610842442681' title='4 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/4415830610842442681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/4415830610842442681'/><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2009/06/will-ich-eigentlich-ria-mit-ext-gwt.html' title='Will ich eigentlich RIA mit Ext GWT?'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01526790562813987856'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-4823763313863614957</id><published>2009-06-05T16:02:00.001+02:00</published><updated>2009-06-05T16:02:17.539+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Swing'/><title type='text'>SwingX 1.0</title><content type='html'>&lt;p&gt;Ich habe ja schon nicht mehr damit gerechnet: &lt;a href="http://weblogs.java.net/blog/rah003/archive/ReleaseNotes.1.0.html"&gt;SwingX hat es in den 1.0 Status&lt;/a&gt; geschafft. Die Fixes/Enhancements sind aber eigentlich minimal und die Freigabe hätte schon früher kommen können …&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Download: &lt;a title="http://swinglabs.org/downloads.jsp" href="http://swinglabs.org/downloads.jsp"&gt;http://swinglabs.org/downloads.jsp&lt;/a&gt;&lt;/li&gt; &lt;li&gt;SwingX-Forum: &lt;a href="http://forums.java.net/jive/forum.jspa?forumID=73"&gt;http://forums.java.net/jive/forum.jspa?forumID=73&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Und wenn man liest, “From now on, the Java 5 compatibility will no longer be maintained.” heißt das nur, dass die kommenden Versionen mindestens Java 6 erwarten; SwingX 1.0 ist selbstverständlich unter Java 5 lauffähig.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-4823763313863614957?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/4823763313863614957/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18862554&amp;postID=4823763313863614957' title='1 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/4823763313863614957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/4823763313863614957'/><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2009/06/swingx-10.html' title='SwingX 1.0'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01526790562813987856'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-274762569854947485</id><published>2009-06-04T19:12:00.001+02:00</published><updated>2009-06-04T19:12:27.865+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><title type='text'>Einen einfachen Baum mit Ext GWT (Tree, TreeItem)</title><content type='html'>&lt;p&gt;Im Mittelpunkt steht com.extjs.gxt.ui.client.widget.tree.Tree, dem entweder com.extjs.gxt.ui.client.widget.tree.TreeItem-Objekte zugeordnet werden, oder ein komplexeres Modell zugewiesen wird. Mit TreeItem ist schnell ein statischer Baum aufgebaut: &lt;p&gt;Tree tree = new Tree();  &lt;p&gt;TreeItem rootTreeItem = new TreeItem( "Hauptobjekte" );&lt;br&gt;tree.getRootItem().add( rootTreeItem );  &lt;p&gt;rootTreeItem.add( new TreeItem( "Kunden" ) );&lt;br&gt;rootTreeItem.add( new TreeItem( "Seminare" ) );&lt;br&gt;rootTreeItem.add( new TreeItem( "Referenten" ) );&lt;br&gt;rootTreeItem.setExpanded( true );  &lt;p&gt;tree.addListener( Events.OnClick, new Listener&amp;lt;TreeEvent&amp;gt;()&lt;br&gt;{&lt;br&gt;&amp;nbsp; @Override public void handleEvent( TreeEvent be )&lt;br&gt;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( be.getItem().isLeaf() )&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Info.display( "Element: ", be.getItem().getText() );&lt;br&gt;&amp;nbsp; }&lt;br&gt;} );&lt;br&gt;contentPanel.add( tree ); &lt;p&gt;Wie bei Swing gibt es ein Root-Icon und darunter liegen die Kinder. &lt;p&gt;Mit einem Listener lässt sich erfragen, ob der Baum ausgefaltet wird oder ob Blätter ausgewählt wurden. Das Beispiel hört nur auf die Auswahl der Kinder und gibt eine Meldung aus.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-274762569854947485?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/274762569854947485/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18862554&amp;postID=274762569854947485' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/274762569854947485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/274762569854947485'/><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2009/06/einen-einfachen-baum-mit-ext-gwt-tree.html' title='Einen einfachen Baum mit Ext GWT (Tree, TreeItem)'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01526790562813987856'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-4868239566110147457</id><published>2009-06-04T12:36:00.001+02:00</published><updated>2009-06-04T12:36:33.491+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='Swing'/><title type='text'>Quaqua Look And Feel. Das bessere Mac OS X LaF</title><content type='html'>&lt;p&gt;&lt;a href="http://www.randelshofer.ch/quaqua/"&gt;Quaqua&lt;/a&gt; ist ein Swing-LaF, was besonders gut an die Apple Human Interface Guidelines ranreicht.&lt;/p&gt;&lt;img alt="Quaqua Look And Feel - Metalworks" src="http://www.randelshofer.ch/quaqua/images/quaqua_metalworks.png" width="460" height="370"&gt; &lt;p&gt;Das Demo&amp;nbsp; läuft auch unter Windows.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.randelshofer.ch/quaqua/jws/quaqua-test.jnlp"&gt;&lt;img border="0" alt="Java Webstart" src="http://www.randelshofer.ch/images/webstart.small.gif" width="88" height="34"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Features (von der Webseite):&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;(Nearly) Native User Experience&lt;br&gt;&lt;/strong&gt;Quaqua user interface delegates closely look and behave like their native counterparts. Complex user interface components, such as JFileChooser and JColorChooser, are close enough to make end users feel comfortable with them.  &lt;li&gt;&lt;strong&gt;Blends into OS X Designs&lt;/strong&gt;&lt;br&gt;Quaqua supports three OS X designs: Tiger, Panther, Jaguar. Quaqua automatically chooses the right design for the current operating system.  &lt;li&gt;&lt;strong&gt;Alternative Styles&lt;/strong&gt;&lt;br&gt;Quaqua offers alternative styles for many user interface elements. Such as small styles for most of the components, as well as a striped style for tables, lists and trees. Jaguar-design like tabbed panes with stacking tabs are also supported.  &lt;li&gt;&lt;strong&gt;Additional Components&lt;br&gt;&lt;/strong&gt;Quaqua provides Swing implementations of NSBrowser and NSSheet (named JBrowser and JSheet).  &lt;li&gt;&lt;strong&gt;Clean Layout&lt;/strong&gt;&lt;br&gt;Laying out Aqua components with Java is quite challenging. Quaqua provides an API for component alignment based on visual criteria (baseline, visual bounds, preferred gaps). JScrollPane's automatically avoid overlaps with the grow-boxes of windows. &lt;li&gt;&lt;strong&gt;Localized in four languages&lt;/strong&gt;&lt;br&gt;Quaqua is localized in the following languages: German, French, Italian and English. &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Neben dem LaF für Standardkomponenten gibt es mit &lt;a href="http://www.randelshofer.ch/quaqua/guide/jbrowser.html"&gt;JBrowser&lt;/a&gt; und &lt;a href="http://www.randelshofer.ch/quaqua/guide/jsheet.html"&gt;JSheet&lt;/a&gt; noch zwei “Spezialkomponenten”.&lt;/p&gt; &lt;p&gt;Die Lizenz ist &lt;a href="http://www.randelshofer.ch/quaqua/license.html"&gt;License (LGPL or BSD)&lt;/a&gt;, und die &lt;a href="http://www.randelshofer.ch/quaqua/guide/index.html"&gt;Doku&lt;/a&gt; mit vielen Screenshots. Tolle Arbeit!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-4868239566110147457?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/4868239566110147457/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18862554&amp;postID=4868239566110147457' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/4868239566110147457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/4868239566110147457'/><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2009/06/quaqua-look-and-feel-das-bessere-mac-os.html' title='Quaqua Look And Feel. Das bessere Mac OS X LaF'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01526790562813987856'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-2032836172281815264</id><published>2009-06-03T23:35:00.001+02:00</published><updated>2009-06-03T23:35:29.292+02:00</updated><title type='text'>Die Duke-Awards 2009 ...</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;... listet Sun unter &lt;a href='http://www.sun.com/aboutsun/pr/2009-06/sunflash.20090601.3.xml'&gt;http://www.sun.com/aboutsun/pr/2009-06/sunflash.20090601.3.xml&lt;/a&gt; auf. Mit Teracotta und Clover haben James Java Gosling und weitere Experten eine gute Wahl getroffen.&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-2032836172281815264?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/2032836172281815264/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18862554&amp;postID=2032836172281815264' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/2032836172281815264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/2032836172281815264'/><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2009/06/die-duke-awards-2009.html' title='Die Duke-Awards 2009 ...'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01526790562813987856'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-961930527826178491</id><published>2009-06-03T23:29:00.002+02:00</published><updated>2009-06-06T10:59:47.227+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Frameworks'/><title type='text'>Wie viel GWT steckt in Google Square?</title><content type='html'>In &lt;a href="http://www.google.com/squared"&gt;Google Wave&lt;/a&gt; steckt eine Zeile, die einen Einsatz &lt;br /&gt;vom GWT nahe legt:&lt;pre&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;/squared/styles/squared.css&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;script language=&amp;quot;javascript&amp;quot; src=&amp;quot;/squared/js/templates.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script language=&amp;quot;javascript&amp;quot; src=&amp;quot;/squared/api/com.google.quality.views.squared.client.Squared.nocache.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;p&gt;Verfolgt man den &lt;a href="http://www.google.com/squared/api/com.google.quality.views.squared.client.Squared.nocache.js"&gt;Link&lt;/a&gt; ist das typische obfuscated JavaScript zu sehen. Wer viiiiel Zeit hat, kann das ja mal debuggen und hier berichten. Ein kleiner Test mit FireBug zeigt, dass Squared sich über Service per RPC die Objekte geben lässt&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;[&amp;quot;&lt;b&gt;com.google.quality.views.squared.shared.model.Workspace&lt;/b&gt;/4054808271&amp;quot;,&amp;quot;US presidents&amp;quot;,&lt;br /&gt; &amp;quot;&lt;b&gt;com.google.quality.views.squared.shared.model.Suggestions&lt;/b&gt;/3280816700&amp;quot;,&lt;br /&gt; &amp;quot;&lt;b&gt;java.util.ArrayList&lt;/b&gt;/3821976829&amp;quot;,&lt;br /&gt; &amp;quot;&lt;b&gt;com.google.quality.views.squared.shared.model.Entry&lt;/b&gt;/3459296909&amp;quot; ...&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-961930527826178491?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/961930527826178491/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18862554&amp;postID=961930527826178491' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/961930527826178491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/961930527826178491'/><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2009/06/google-square-auch-eine-gwt-anwendung.html' title='Wie viel GWT steckt in Google Square?'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01526790562813987856'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-7116988264124420925</id><published>2009-06-02T21:56:00.001+02:00</published><updated>2009-06-02T21:56:19.991+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><title type='text'>Java FX 1.2</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Der Blog &lt;a href='http://steveonjava.com/2009/05/31/javafx-1-2-top-10/'&gt;http://steveonjava.com/2009/05/31/javafx-1-2-top-10/&lt;/a&gt; stellt Neuigkeiten von Java FX 1.2 vor. Interessant ist, das der Compiler verschärft wurde, und so alten Programmcode abweisen kann. Nun warten wir noch auf das Super-Design-Tool und Java FX kann was werden ...&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-7116988264124420925?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/7116988264124420925/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18862554&amp;postID=7116988264124420925' title='1 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/7116988264124420925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/7116988264124420925'/><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2009/06/java-fx-12.html' title='Java FX 1.2'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01526790562813987856'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-7807420999622492779</id><published>2009-06-01T16:00:00.001+02:00</published><updated>2009-06-01T16:00:09.410+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><title type='text'>OpenOffice Draw + XForms Export + iText = PDF</title><content type='html'>&lt;p&gt;Für unseren Seminarbetrieb erstellen wir nach dem Seminarabschluss aus einer XML-Datei die Rechnung und Zertifikate für den Kunden. Die Vorlagen sind in OpenOffice verfasst und können ohne Probleme verändert werden. Ein großer Vorteil ist weiterhin, dass OO einen PDF Exporter mitbringt.&lt;/p&gt; &lt;p&gt;Der Nachteil der Lösung, OpenOffice für die PDF-Erzeugung fernzusteuern ist, dass es sehr schwergewichtig. OO muss installiert und gestartet werden. Das ist auf einem Server, etwa einem einfachen Servlet-Container oder sogar der Google App Engine for Java natürlich nicht denkbar.&lt;/p&gt; &lt;p&gt;Ein anderer Weg ist daher, zwar weiterhin OpenOffice für die Erstellung einer Vorlage zu verwenden, aber beim PDF-Export anders vorzugehen. Die Lösungen können &lt;a href="http://en.wikipedia.org/wiki/Portable_Document_Format#Interactive_elements"&gt;Acrobat Forms (Acroforms)&lt;/a&gt; bieten, also eigentlich interaktive Felder, die man später über ein Programm füllen kann. Im ersten Schritt erzeugt man daher mit OpenOffice Draw eine Formular. (Das wird etwa beschrieben unter &lt;a title="http://www.devx.com/opensource/Article/38178/" href="http://www.devx.com/opensource/Article/38178/"&gt;http://www.devx.com/opensource/Article/38178/&lt;/a&gt;.) Dann exportiert man das Dokument in PDF unter Erhaltung der Formulareigenschaften. Dieses PDF lässt sich nun mit iText auslesen, die Formularzellen füllen und wieder als PDF schreiben. Dabei kann die “Formulareigenschaft” wegfallen, dass man später bei dem PDF-Dokument nichts mehr von interaktiven Elementen sieht.&lt;/p&gt; &lt;p&gt;import java.io.FileOutputStream;&lt;br&gt;import com.lowagie.text.pdf.*;&lt;br&gt;&lt;br&gt;public class FillInPdfForm&lt;br&gt;{&lt;br&gt;&amp;nbsp; public static void main(String[] args) throws Exception&lt;br&gt;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PdfReader reader = new PdfReader("c:/rein.pdf");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("c:/raus.pdf"));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BaseFont font = BaseFont.createFont("c:\\windows\\fonts\\Calibri.ttf", BaseFont.CP1252, BaseFont.NOT_EMBEDDED);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AcroFields form = stamper.getAcroFields();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for( Object o : reader.getAcroForm().getFields() )&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; form.setFieldProperty( ((PRAcroForm.FieldInformation) o).getName(), "textfont", font, null);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; form.setField("name", "Christian Ullenboom");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; form.setField("content", "Brav sein\nLieb sein");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; stamper.setFormFlattening(true);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; stamper.close();&lt;br&gt;&amp;nbsp; }&lt;br&gt;} &lt;p&gt;Etwas lästig ist, dass beim Ausfüllen der in OO zugewiesen Font flöten geht. Daher muss man diesen neu zuweisen. Sonst ist es Arial/Helvetica.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-7807420999622492779?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/7807420999622492779/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18862554&amp;postID=7807420999622492779' title='3 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/7807420999622492779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/7807420999622492779'/><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2009/06/openoffice-draw-xforms-export-itext-pdf.html' title='OpenOffice Draw + XForms Export + iText = PDF'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01526790562813987856'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-7058619119649847215</id><published>2009-05-31T15:52:00.003+02:00</published><updated>2009-06-06T10:31:08.541+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><title type='text'>Wie Google Wave das GWT antreibt</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Über &lt;a href="http://wave.google.com/"&gt;Googe Wave&lt;/a&gt; wurde in den Medien schon ausreichend gesprochen. (Auf jeden Fall das Video ansehen! Der korrigierende Editor ist super.)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ajaxian.com/archives/gwt-team-waves-goodbye-to-annoying-question-its-the-api-stupid"&gt;&lt;img src="http://cache0.techcrunch.com/wp-content/uploads/2009/05/google_wave_snapshots_inbox-630x411.png" style="max-width: 800px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Wirklich interessant ist ist die Tatsache, dass die Clientseite von Google Wave in GWT implementiert ist. Das ist in meinen Augen ein unschlagbares Argument für die Ausgereiftheit von GWT, wenn Google das in einem Projekt einsetzt, was von unglaublichen vielen Menschen verwendert werden wird und definitiv performant laufen muss. Dabei sollte laut einem Blog-Eintrag &lt;a href="http://mtwong.ning.com/profiles/blogs/google-io-conference-google-1"&gt;http://mtwong.ning.com/profiles/blogs/google-io-conference-google-1&lt;/a&gt; Wave auch überhaupt nicht in GWT entwickelt werden, da der Projektleiter Zweifel hatte, GWT würde gescheit laufen. Aber Wave hat wohl auch die Entwicklung von GWT positiv beeinflusst, etwa bei den Tools. Der Blog-Eintrag erwähnt interessante weitere Projekte und GWT-Features:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/google-web-toolkit-incubator/wiki/UiBinder"&gt;http://code.google.com/p/google-web-toolkit-incubator/wiki/UiBinder&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://groups.google.com/group/Google-Web-Toolkit-Contributors/browse_thread/thread/eb9c8cf046cbaaf2?pli=1"&gt;http://groups.google.com/group/Google-Web-Toolkit-Contributors/browse_thread/thread/eb9c8cf046cbaaf2?pli=1&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/google-web-toolkit/wiki/CodeSplitting"&gt;http://code.google.com/p/google-web-toolkit/wiki/CodeSplitting&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-7058619119649847215?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/7058619119649847215/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18862554&amp;postID=7058619119649847215' title='2 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/7058619119649847215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/7058619119649847215'/><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2009/05/wie-google-wave-das-gwt-antreibt.html' title='Wie Google Wave das GWT antreibt'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01526790562813987856'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-3447181868815224780</id><published>2009-05-29T19:13:00.001+02:00</published><updated>2009-05-29T19:13:18.664+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java SE'/><title type='text'>Update JDK 1.6.0_14 (6u14)</title><content type='html'>&lt;p&gt;Änderungen listet &lt;a title="http://java.sun.com/javase/6/webnotes/6u14.html" href="http://java.sun.com/javase/6/webnotes/6u14.html"&gt;http://java.sun.com/javase/6/webnotes/6u14.html&lt;/a&gt; auf. Interessant sind meines Erachtens: &lt;a name="hotspot14.0-G1-6u14"&gt;Compressed Object Pointers &lt;/a&gt;und &lt;a name="hotspot14.0-G1-6u14"&gt;Garbage First (G1) Garbage Collector&lt;/a&gt;, weil diese Dinge sind, die für Java 7 vorgesehen waren. Aber nun kann man die schon mal “in the wild” testen, was eine gute Sache ist. Dann noch &lt;a name="jaxws-6u14"&gt;JAX WS 2.1.6 and JAXB 2.1.10&lt;/a&gt; und ein Update von JavaDB (wobei Derby schon deutlich weiter ist, komisch).&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-3447181868815224780?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/3447181868815224780/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18862554&amp;postID=3447181868815224780' title='3 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/3447181868815224780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/3447181868815224780'/><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2009/05/update-jdk-16014-6u14.html' title='Update JDK 1.6.0_14 (6u14)'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01526790562813987856'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-4212227227487460300</id><published>2009-05-29T00:24:00.001+02:00</published><updated>2009-05-29T00:24:56.287+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java 7'/><title type='text'>Vorschläge für Projekt Coin (Java 7 Sprachänderungen) geht in die nächste Runde</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Eine Abstimmung hat ergeben, welche Spracherweiterungen es in Java 7 geben könnte:&lt;br/&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href='http://mail.openjdk.java.net/pipermail/coin-dev/2009-February/000001.html'&gt;Strings in switch&lt;/a&gt;, &lt;br /&gt;Joe Darcy&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href='http://mail.openjdk.java.net/pipermail/coin-dev/2009-February/000003.html'&gt;Improved Exception Handling for Java&lt;/a&gt;, &lt;br /&gt;Neal Gafter&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href='http://mail.openjdk.java.net/pipermail/coin-dev/2009-February/000011.html'&gt;Automatic Resource Management&lt;/a&gt;, &lt;br /&gt;Josh Bloch&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href='http://mail.openjdk.java.net/pipermail/coin-dev/2009-February/000009.html'&gt;Improved Type Inference for Generic Instance Creation&lt;/a&gt;,&lt;br /&gt;Jeremy Manson &lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href='http://mail.openjdk.java.net/pipermail/coin-dev/2009-March/000047.html'&gt;Elvis and Other Null-Safe Operators&lt;/a&gt;, Neal Gafter, Stephen Colebourne&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href='http://mail.openjdk.java.net/pipermail/coin-dev/2009-March/000217.html'&gt;Simplified Varargs Method Invocation&lt;/a&gt;,&lt;br /&gt;Bob Lee &lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;In der näheren Auswahl sind desweiteren noch:&lt;br/&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Integer-Literale:&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href='http://mail.openjdk.java.net/pipermail/coin-dev/2009-March/000905.html'&gt;Byte and Short Integer Literal Suffixes&lt;/a&gt;, &lt;br /&gt;Bruce Chapman&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href='http://mail.openjdk.java.net/pipermail/coin-dev/2009-March/000929.html'&gt;Binary Literals&lt;/a&gt;, &lt;br /&gt;Derek Foster&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href='http://mail.openjdk.java.net/pipermail/coin-dev/2009-April/001628.html'&gt;Underscores in numbers&lt;/a&gt;, &lt;br /&gt;Derek Foster&lt;/p&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href='http://mail.openjdk.java.net/pipermail/coin-dev/2009-March/001131.html'&gt;Language support for JSR 292&lt;/a&gt; &lt;br /&gt;(&lt;a href='http://wikis.sun.com/display/mlvm/ProjectCoinProposal'&gt;wiki&lt;/a&gt;), &lt;br /&gt;John Rose&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href='http://mail.openjdk.java.net/pipermail/coin-dev/2009-March/001108.html'&gt;Indexing access syntax for Lists and Maps&lt;/a&gt;, &lt;br /&gt;Shams Mahmood Imam&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href='http://mail.openjdk.java.net/pipermail/coin-dev/2009-March/001193.html'&gt;Collection Literals&lt;/a&gt;, &lt;br /&gt;Joshua Bloch&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href='http://mail.openjdk.java.net/pipermail/coin-dev/2009-March/000869.html'&gt;Large arrays (revised)&lt;/a&gt;, &lt;br /&gt;James Lowden&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Alle andere Vorschläge, die bisher in der Mailingliste http://mail.openjdk.java.net/pipermail/coin-dev/ vorstellt wurden, sind damit raus. (Eine Begründung für die Ablehnung gibt es nicht zwangsläufig.)&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-4212227227487460300?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/4212227227487460300/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18862554&amp;postID=4212227227487460300' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/4212227227487460300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/4212227227487460300'/><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2009/05/vorschlage-fur-projekt-coin-java-7.html' title='Vorschläge für Projekt Coin (Java 7 Sprachänderungen) geht in die nächste Runde'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01526790562813987856'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-1570990582133570786</id><published>2009-05-28T15:13:00.001+02:00</published><updated>2009-05-28T15:13:33.660+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Insel'/><title type='text'>Initialisierung von Schnittstellenkonstanten</title><content type='html'>&lt;p&gt;Eine Schnittstelle kann Attribute deklarieren, aber das sind dann immer initialisierte public final static Konstanten. &lt;p&gt;import java.util.Properties; &lt;p&gt;public interface PropertyReader &lt;p&gt;{ &lt;p&gt;&lt;b&gt; Properties DEFAULT_PROPERTIES = new Properties();&lt;/b&gt; &lt;p&gt; Properties getProperties(); &lt;p&gt;} &lt;p&gt;Würden wir DEFAULT_PROPERTIES nicht mit new Properties() initialisieren, gäbe es einen Compilerfehler. &lt;p&gt;Nun stellt sich das Problem, wenn die statischen Attribute nicht einfach mit einem Objekt initialisiert werden können, sondern wenn zusätzlicher Programmcode zur Initialisierung gewünscht ist. Für unser Beispiel soll das Properties-Objekt unter dem Schlüssel date die Zeit speichern, an der die Klasse initialisiert wurde. Über statische Initialisierer ist dies jedenfalls nicht möglich. &lt;p&gt;import java.util.*; &lt;p&gt;public interface PropertyReader &lt;p&gt;{ &lt;p&gt;&amp;nbsp; Properties DEFAULT_PROPERTIES = new Properties(); &lt;p&gt;&lt;b&gt;static&lt;/b&gt; &lt;p&gt;&lt;b&gt;&amp;nbsp; ^&lt;/b&gt; &lt;p&gt;&lt;b&gt;// Hier gibt's den Compilerfehler&lt;/b&gt; &lt;p&gt;&lt;b&gt;// "Interfaces can't have static initializers."&lt;/b&gt; &lt;p&gt;&lt;b&gt;&amp;nbsp; {&lt;/b&gt; &lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DEFAULT_PROPERTIES.setProperty( "date", new Date().toString() );&lt;/b&gt; &lt;p&gt;&lt;b&gt;}&lt;/b&gt; &lt;p&gt;&amp;nbsp; Properties getProperties(); &lt;p&gt;} &lt;p&gt;Zwar sind statische Initialisierungsblöcke nicht möglich, aber mit zwei Tricks kann die Initialisierung erreicht werden. Eine innere anonyme Kasse ist eine Lösung: &lt;p&gt;import java.util.*; &lt;p&gt;public interface PropertyReader &lt;p&gt;{ &lt;p&gt;&amp;nbsp; Properties DEFAULT_PROPERTIES = new Properties()&lt;b&gt; { {&lt;/b&gt; &lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; setProperty( "date", new Date().toString() );&lt;/b&gt; &lt;p&gt;&lt;b&gt;} }&lt;/b&gt;; &lt;p&gt;&amp;nbsp; Properties getProperties(); &lt;p&gt;} &lt;p&gt;Diese Lösung funktioniert allerdings nur, wenn keinen primitiven Werte über extra Programmcode initialisiert werden, und wenn es nicht-finale Klassen sind, von den überhaupt Unterklassen erlaubt sind. &lt;p&gt;Mit einem anderen Trick lassen sich auch diese Hürden nehmen. Die Idee liegt in der Einführung einer inneren statischen Klasse, die wir $$ nennen wollen. Innerhalb dieser Klasse platzieren einen static-Block. Anschließend muss nur noch eine Dummy-Variable gesetzt werden, damit der Initialisierungsblock der inneren Klasse auch ausgeführt wird, wenn die Klasse geladen wird. Dazu definieren wir die Variable $. Sie ist static und final, also somit eine echte Konstante. Da leider innere Klassen und Konstanten von Schnittstellen nicht privat sein können, und so unglücklicherweise von außen zugänglich sind, geben wir ihnen die schönen kryptischen Namen $ und $$, sodass sie nicht so attraktiv erscheinen. &lt;p&gt;import java.util.*; &lt;p&gt;public interface PropertyReader &lt;p&gt;{ &lt;p&gt;&amp;nbsp; Properties DEFAULT_PROPERTIES = new Properties(); &lt;p&gt;&lt;b&gt;&amp;nbsp; PropertyReaderInit $ = new $$();&lt;/b&gt; &lt;p&gt;&lt;b&gt;&lt;/b&gt; &lt;p&gt;&lt;b&gt;&amp;nbsp; static final class $$&lt;/b&gt; &lt;p&gt;&lt;b&gt;&amp;nbsp; { &lt;/b&gt; &lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; static&lt;/b&gt; &lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/b&gt; &lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DEFAULT_PROPERTIES.setProperty( "date", new Date().toString() );&lt;/b&gt; &lt;p&gt;&lt;b&gt;}&lt;/b&gt; &lt;p&gt;&lt;b&gt;&amp;nbsp; }&lt;/b&gt; &lt;p&gt;&amp;nbsp; Properties getProperties(); &lt;p&gt;} &lt;p&gt;Innerhalb von static-Block lässt sich auf das Properties-Objekt zugreifen und somit auch die Werte eintragen. Ohne die Erzeugung des Objekts $ geht es nicht, denn andernfalls würde die Klasse $$ nicht initialisiert werden. Das Programm kann nun alle Elemente wie folgt nutzen: &lt;p&gt;import java.util.Properties; &lt;p&gt;public class SystemPropertyReaderDemo implements PropertyReader &lt;p&gt;{ &lt;p&gt;&amp;nbsp; @Override public Properties getProperties() &lt;p&gt;&amp;nbsp; { &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return System.getProperties(); &lt;p&gt;&amp;nbsp; } &lt;p&gt;&amp;nbsp; public static void main( String[] args ) &lt;p&gt;&amp;nbsp; { &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println( &lt;b&gt;PropertyReader.DEFAULT_PROPERTIES&lt;/b&gt; ); // {date=Thu … &lt;p&gt;} &lt;p&gt;} &lt;p&gt;&lt;strong&gt;Hinweis:&amp;nbsp;&amp;nbsp; Aufzählugen über enum können einfacher initialisiert werden.&lt;/strong&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-1570990582133570786?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/1570990582133570786/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18862554&amp;postID=1570990582133570786' title='2 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/1570990582133570786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/1570990582133570786'/><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2009/05/initialisierung-von-schnittstellenkonst.html' title='Initialisierung von Schnittstellenkonstanten'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01526790562813987856'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-2702208591375228721</id><published>2009-05-28T12:58:00.001+02:00</published><updated>2009-05-28T12:58:15.043+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Insel'/><title type='text'>MouseInfo und PointerInfo für eine globale Farbpipette</title><content type='html'>&lt;p&gt;Mit der Klasse Robot lassen sich zwar Tastatur- und Maus-Ereignisse produzieren und Screenshots nehmen, doch Informationen über die aktuelle Mausposition liefert die Klasse nicht. Auch das MouseEvent liefert nur die aktuellen relativen Koordinaten bei einem Fenster, doch nicht die Position der Maus auf dem physikalischen Schirm. &lt;p&gt;Die Klasse MouseInfo liefert diese Information. Die statische Funktion MouseInfo.getPointerInfo() liefert ein PointerInfo-Objekt, das Aussagen über die anzeigende Einheit und über die Position des Mauszeigers macht. MouseInfo.getNumberOfButtons() liefert die Anzahl der Knöpfe. &lt;p&gt;Die Anzahl der Anwendungsfälle ist vielfältig. So ermöglicht dies zum Beispiel eine Farbpipette, mit der sich die Farbe eines Punktes nehmen lässt, der unter dem Mauszeiger steht. &lt;p&gt;while ( true ) &lt;p&gt;{ &lt;p&gt; Rectangle screenSize = new Rectangle( Toolkit.getDefaultToolkit().getScreenSize() ); &lt;p&gt; BufferedImage image = new Robot().createScreenCapture( screenSize ); &lt;p&gt; Point location = &lt;b&gt;MouseInfo.getPointerInfo().getLocation()&lt;/b&gt;; &lt;p&gt; System.out.println( new Color( image.getRGB( location.x, location.y ) ) ); &lt;p&gt;} &lt;p&gt;An den Ausgaben lassen sich gut die RGB-Bestandteile der Farbe ablesen.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-2702208591375228721?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/2702208591375228721/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18862554&amp;postID=2702208591375228721' title='3 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/2702208591375228721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/2702208591375228721'/><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2009/05/mouseinfo-und-pointerinfo-fur-eine.html' title='MouseInfo und PointerInfo für eine globale Farbpipette'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01526790562813987856'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-6349637144441949272</id><published>2009-05-28T12:32:00.001+02:00</published><updated>2009-05-28T12:32:24.570+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Insel'/><title type='text'>Spielerei mit Javas dynamischer Bindung und überschatteten Attributen</title><content type='html'>&lt;p&gt;Werfen wir ein Blick auf folgendes Java-Programm: &lt;p&gt;class SuperBoaster &lt;p&gt;{ &lt;p&gt;&lt;b&gt;&amp;nbsp; int nr = 1;&lt;/b&gt; &lt;p&gt;&lt;b&gt;void boast()&lt;/b&gt; &lt;p&gt;&amp;nbsp; { &lt;p&gt;System.out.println( "Ich bin die Nummber " + nr ); &lt;p&gt;} &lt;p&gt;} &lt;p&gt;public class SubBoaster extends SuperBoaster &lt;p&gt;{ &lt;p&gt;&lt;b&gt;int nr = 2;&lt;/b&gt; &lt;p&gt;&amp;nbsp; @Override &lt;b&gt;void boast()&lt;/b&gt; &lt;p&gt;{ &lt;p&gt;&lt;b&gt;super.boast()&lt;/b&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Ich bin die Nummber 1 &lt;p&gt;System.out.println( &lt;b&gt;super.nr&lt;/b&gt; );&amp;nbsp; // 1 &lt;p&gt;System.out.println( &lt;b&gt;nr&lt;/b&gt; );&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 2 &lt;p&gt;&amp;nbsp; } &lt;p&gt;&amp;nbsp; public static void main( String[] args ) &lt;p&gt;{ &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; new SubBoaster().boast(); &lt;p&gt;&amp;nbsp; } &lt;p&gt;} &lt;p&gt;Die Methode boast() aus SubBoaster ruft mit super.boast() die Methode der Oberklasse auf. Ein einfacher Aufruf von boast() in der Unterklasse würde in eine Rekursion führen. Die Unterklasse hat mit super.nr Zugriff auf die überschattete Objektvariable nr aus der Oberklasse. Es ist super wie this eine spezielle Referenz und kann auch genauso eingesetzt werden, nur das super in den Namensraum der Oberklasse geht. &lt;p&gt;Eine Aneinanderreihung von super-Schlüsselwörtern bei einer tieferen Vererbungshierarchie ist nicht möglich. Hinter einem super muss eine Objekteigenschaft stehen und Anweisungen wie super.super.nr sind somit immer ungültig. &lt;p&gt;Für Variablen gibt es eine Möglichkeit, die sich durch einen Cast in die Oberklasse ergibt. Setzen wir in boast() der Unterklasse folgende Anweisung &lt;p&gt;System.out.println( ((SuperBoaster) this).nr );&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 1 &lt;p&gt;Die Ausgabe 1 ist also identisch mit System.out.println( super.nr ). &lt;p&gt;Die this-Referenz entspricht einem Objekt vom Typ SubBoaster. Wenn wir dies aber in den Typ SuperBoaster konvertieren, bekommen wir genau das nr aus der Basisklasse unserer Hierarchie. Wir erkennen hier eine sehr wichtige Eigenschaft von Java, nämlich, dass Variablen nicht dynamisch gebunden werden. Anders wäre es, wenn wir folgendes in die Methode boast()der Unterklasse SubBoaster setzen: &lt;p&gt;((SuperBoaster)this).boast(); &lt;p&gt;Hier ruft die Laufzeitumgebung nicht boast() aus SuperBoaster auf, sondern die aktuelle Funktion boast(), aus SubBoaster sodass wir in einer Rekursion landen. Der Grund dafür liegt in der dynamischen Bindung zur Laufzeit, die ein Compiler-Typecast nicht ändert.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-6349637144441949272?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/6349637144441949272/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18862554&amp;postID=6349637144441949272' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/6349637144441949272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/6349637144441949272'/><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2009/05/spielerei-mit-javas-dynamischer-bindung.html' title='Spielerei mit Javas dynamischer Bindung und überschatteten Attributen'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01526790562813987856'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-1808939358405594010</id><published>2009-05-28T12:04:00.001+02:00</published><updated>2009-05-28T12:04:23.072+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Insel'/><title type='text'>Bildschirmabzüge (Screenshots) und die Frage, ob der Benutzer etwas vor dem Bildschirm tut</title><content type='html'>&lt;p&gt;Eine sehr interessante Funktion der Robot-Klasse ist createScreenCapture(). Mit ihr lässt sich ein Bildschirmabzug (engl. screenshot) ohne Mauszeiger (zumindest unter Windows, Linux, Solaris und Mac OS X) machen. Die Funktion erwartet als Argument ein Rectangle-Objekt (speichert x, y, height und width), das den zu »fotografierenden« Bereich spezifiziert. Das Ergebnis von createScreenCapture() ist ein BufferedImage-Objekt, das direkt mit ImageIO in eine Datei kommen kann.  &lt;p&gt;&lt;b&gt;BufferedImage bi = new Robot().createScreenCapture(&lt;/b&gt;  &lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()) );&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/b&gt; &lt;p&gt;ImageIO.write( bi, "jpg", new File("c:/screenshot.jpg") );  &lt;p&gt;Mit createScreenCapture() lassen sich sehr interessante Lösungen realisieren. So lässt sich zum Beispiel überwachen, ob sich Bildschirminhalte ändern. Mit einer Bildanalyse ließe sich auch herausfinden, was der Anwender sich gerade anschaut.  &lt;p&gt;In einem kleinen Beispiel wollen wir feststellen, ob der Benutzer aktiv vom dem Bildschirm ist oder nicht. Wir machen dies an der Anzahl Pixel fest, die sich jede Sekunden verändern. Ein Programm soll dazu jede Sekunde ein Bildschirmabzug nehmen und ausgeben, um wie viel Prozent sich die Pixel gegenüber dem Vorgängerbild verändert haben.  &lt;p&gt;package com.tutego.insel.ui.image;  &lt;p&gt;import java.awt.*;  &lt;p&gt;import java.awt.image.*;  &lt;p&gt;public class ImageDiffs  &lt;p&gt;{  &lt;p&gt;&amp;nbsp; public static void main( String args[] ) throws Exception  &lt;p&gt;&amp;nbsp; {  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Rectangle screenSize = new Rectangle( Toolkit.getDefaultToolkit().getScreenSize() );  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BufferedImage image1 = new Robot().createScreenCapture( screenSize );  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while ( true )  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Thread.sleep( 1000 );&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BufferedImage image2 = new Robot().createScreenCapture( screenSize );  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataBuffer dataBuffer1 = image1.getData().getDataBuffer(); &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataBuffer dataBuffer2 = image2.getData().getDataBuffer();  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int total = dataBuffer1.getSize(), diff = 0;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for ( int i = 0; i &amp;lt; total; i++ )  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( dataBuffer1.getElem( i ) != dataBuffer2.getElem( i ) )  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; diff++;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.printf( "Pixel total=%d, unterschiedliche Pixel=%d, Unterschied=%.2f%%%n",  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; total, diff, (double) 100 * diff / total );  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; image1 = image2;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }  &lt;p&gt;&amp;nbsp; }  &lt;p&gt;}  &lt;p&gt;Nach dem der Bildschirmabzug gemacht wurde, gilt es auf die Pixel zuzugreifen und die beiden Bilder zu vergleichen. Um das Bild abzulaufen, könnten wir entweder vom BufferedImage mit den Methode getRGB(int x, int y) arbeiten, oder uns – anders macht es getRGB() auch nicht – das Datenmodel der Grafik holen und es einfach komplett auflaufen; die Größe und Breite der beiden Bildschirmabzüge ist ja immer gleich, und so spielt die Höhe und Breite keine Rolle. Von den beiden DataBuffer-Objekten, die die Rohdaten der Grafik repräsentieren, erfragt getElem() den Farbwert und wenn es Unterschiede gibt, inkrementiert das Programm einen Zähler. Nach dem Ablaufen aller Werte gibt es eine Statistik, die etwa so beginnen kann:  &lt;p&gt;Pixel total=2304000, unterschiedliche Pixel=297, Unterschied=0,01%  &lt;p&gt;Pixel total=2304000, unterschiedliche Pixel=1708, Unterschied=0,07%  &lt;p&gt;Pixel total=2304000, unterschiedliche Pixel=1689, Unterschied=0,07%  &lt;p&gt;Pixel total=2304000, unterschiedliche Pixel=1000568, Unterschied=43,43%  &lt;p&gt;Pixel total=2304000, unterschiedliche Pixel=1002525, Unterschied=43,51%  &lt;p&gt;Pixel total=2304000, unterschiedliche Pixel=2087, Unterschied=0,09%&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-1808939358405594010?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/1808939358405594010/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18862554&amp;postID=1808939358405594010' title='2 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/1808939358405594010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/1808939358405594010'/><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2009/05/bildschirmabzuge-screenshots-und-die.html' title='Bildschirmabzüge (Screenshots) und die Frage, ob der Benutzer etwas vor dem Bildschirm tut'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01526790562813987856'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18862554.post-724526753445459558</id><published>2009-05-27T12:18:00.001+02:00</published><updated>2009-05-27T12:18:53.003+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Entwicklungsumgebung'/><title type='text'>Hast du nix zu tun, schreibst du eine neue IDE …</title><content type='html'>&lt;p&gt;Das ist zumindest das Ziel von &lt;a title="https://gravityide.dev.java.net/" href="https://gravityide.dev.java.net/"&gt;https://gravityide.dev.java.net/&lt;/a&gt;. Eine “Easy-to-use Java IDE for Java and other JVM languages”. Problem nur: Was einfach mit einem Editor beginnt wird (zwangsläufig) komplexer und komplexer und komplexer. Man kann darüber streiten, was – nach einer gewissen Einarbeitungszeit – nun intuitiver ist, IntelliJ, NetBeans, Eclipse, JDevelper (oder vi?), aber dass es bei einem Editor mit farblicher Hervorhebung nicht getan ist, ist klar. Und wer mit lauten Sprüchen wie “Gravity will be the only IDE you'll need.” wirbt, und mit dem Satz “A GUI editor so you can make forms in seconds!” schreit, macht sich keine Freunde, wenn gravityide Vaporware bleibt; gravityide bleibt also vorerst das Duke Nukem Forever der Java-IDEs. Toll!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18862554-724526753445459558?l=www.tutego.com%2Fblog%2Fjavainsel'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/724526753445459558/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=18862554&amp;postID=724526753445459558' title='1 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/724526753445459558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18862554/posts/default/724526753445459558'/><link rel='alternate' type='text/html' href='http://www.tutego.com/blog/javainsel/2009/05/hast-du-nix-zu-tun-schreibst-du-eine.html' title='Hast du nix zu tun, schreibst du eine neue IDE …'/><author><name>Christian Ullenboom</name><uri>http://www.blogger.com/profile/02403398196910607248</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01526790562813987856'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry></feed>