<?xml version="1.0"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Planet NetBeans</title>
    <link>http://www.planetnetbeans.org/de/</link>
    <language>de</language>
    <description>Planet NetBeans - http://www.planetnetbeans.org/de/</description>
    <item>
      <title>JNBB - Joschs NetBeans Blog: Source Talk Tage 2008 in Göttingen</title>
      <guid isPermaLink="false">http://www.sepix.de/blogs/blogrittner/blog/archive////source_talk_tage_2008_in_goettingen/index.html</guid>
      <link>http://www.sepix.de/blogs/blogrittner/blog/archive////source_talk_tage_2008_in_goettingen/index.html</link>
      <description>&lt;p class="bodytext"&gt;&lt;img src="http://www.sepix.de/blogs/blogrittner/uploads/RTEmagicC_0323011faf.jpg.jpg" alt="" height="112" width="600" /&gt; &lt;/p&gt; &lt;p class="bodytext"&gt;Dieses Jahr ist es wieder soweit. Die &lt;a title="Source Talk Tage 2008" href="http://www.sourcetalk.de/2008/programm.php" target="_blank" class="external-link-new-window"&gt;Source Talk Tage&lt;/a&gt; im Mathematischen Institut in Göttingen laufen an. Von Dienstag, 23. September bis Donnerstag, 25.
      September 2008 gibt es wieder spannende Themen wie eLearning, OpenSolaris und Java. &lt;/p&gt; &lt;p class="bodytext"&gt;Es werden einige "bekannte Gesichter" rund um die Blog Scene der NetBeans Community anwesend sein. &lt;a title="Blog" href="http://blogs.sun.com/roumen/" target="_blank" class="external-link-new-window"&gt;Roman Strobl&lt;/a&gt; (er war schon mal mit Geertjan da) will uns zeigen, was OpenSolaris als Betriebssystem so spannend macht und &lt;a title="Blog"
      href="http://eppleton.com/blog/?cat=3" target="_blank" class="external-link-new-window"&gt;Anton Epple&lt;/a&gt; führt in die RCP Programmierung mit NetBeans 6.5 ein. &lt;/p&gt; &lt;p class="bodytext"&gt;Ich selbst werde auch am Mittwoch und Donnerstag rein schauen. Würde mich freuen eine volles Haus vorzufinden :-) &lt;/p&gt; &lt;p class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160; Josch. &lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt;</description>
      <pubDate>Thu, 28 Aug 2008 16:20:00 +0000</pubDate>
    </item>
    <item>
      <title>JNBB - Joschs NetBeans Blog: PHP - welche IDE wird es werden?</title>
      <guid isPermaLink="false">http://www.sepix.de/blogs/blogrittner/blog/archive////php_welche_ide_wird_es_werden/index.html</guid>
      <link>http://www.sepix.de/blogs/blogrittner/blog/archive////php_welche_ide_wird_es_werden/index.html</link>
      <description>&lt;p class="bodytext"&gt;Nun ist es raus, &lt;a title="Opens external link in new window" href="http://www.eclipse.org/pdt/" target="_blank" class="external-link-new-window"&gt;PDT for Eclipse&lt;/a&gt; wird auf Dezember verschoben. Zu viele Probleme sind da gewachsen und das PDT soll produktiv noch nicht einsetzbar sein. &lt;/p&gt; &lt;p class="bodytext"&gt;Vernünftige PHP-Entwicklungsumgebungen gab es ja bisher noch gar nicht (meine persönliche Meinung). Nur &lt;a title="Opens
      external link in new window" href="http://www.zend.com/de/" target="_blank" class="external-link-new-window"&gt;Zend&lt;/a&gt; bot etwas an. Einige IDEs boten Integrationen an, die meistens über das Syntax Highlighting nicht hinauskamen und als Höhepunkt gerade mal eine Verknüpfung zur Online Doku boten. &lt;/p&gt; &lt;p class="bodytext"&gt;Mit &lt;a title="NetBeans PHP 6.5 Infos" href="http://wiki.netbeans.org/NewAndNoteWorthyMilestone2NB65#section-NewAndNoteWorthyMilestone2NB65-PHP" target="_blank"
      class="external-link-new-window"&gt;NetBeans&lt;/a&gt; erwächst langsam vielleicht ein Licht am Streifen des Horizonts nach der Sonnenfinsternis ;-) - Es mag noch nicht so viele Features geben wie in Eclipse PDT, doch eines kristalisiert sich heraus: Das was geht wirkt robust, einheitlich und sauber in die IDE integriert. &lt;/p&gt; &lt;p class="bodytext"&gt;PHP ist nicht meine Primärsprache, aber NetBeans ist inzwischen auch für PHP meine Primär-IDE geworden. Dank an die Entwickler, die das Projekt
      so voran treiben. &lt;/p&gt; &lt;p class="bodytext"&gt;&lt;br /&gt;Beste Grüße,&lt;br /&gt;&#160; Josch. &lt;/p&gt; &lt;p class="bodytext"&gt;Links: &lt;a title="Code templates in PHP" href="http://blogs.sun.com/netbeansphp/entry/generate_constructor_getters_and_setters" target="_blank" class="external-link-new-window"&gt;Code templates in PHP&lt;/a&gt;, &lt;a title="Semantic coloring in PHP" href="http://blogs.sun.com/netbeansphp/entry/improving_semantic_coloring_continue" target="_blank"
      class="external-link-new-window"&gt;Semantic(!) coloring&lt;/a&gt;, &lt;a title="FTP support in PHP Projects" href="http://blogs.sun.com/netbeansphp/entry/ftp_support_added" target="_blank" class="external-link-new-window"&gt;FTP support&lt;/a&gt;, &lt;a title="Free PHP interpreter in project" href="http://blogs.sun.com/netbeansphp/entry/project_specific_php_interpreter_possible" target="_blank" class="external-link-new-window"&gt;PHP Interpreter frei wählbar&lt;/a&gt; &lt;/p&gt; &lt;p
      class="bodytext"&gt;&#160;&lt;/p&gt;</description>
      <pubDate>Thu, 28 Aug 2008 15:48:00 +0000</pubDate>
    </item>
    <item>
      <title>Seapegasus Blog: Continuous Integration Im Kampf Gegen Den Golem</title>
      <guid isPermaLink="false">http://blogs.sun.com/seapegasus/entry/continuous_integration_im_kampf_gegen</guid>
      <link>http://blogs.sun.com/seapegasus/entry/continuous_integration_im_kampf_gegen</link>
      <description>&lt;p&gt; Es ist vielleicht eine vergessene Tatsache, aber wenn bei NetBeans ein Engineer es schafft, trotz aller Tests und Checks die Build zu vermurksen, dann wird derjenige zur Strafe von dem furchterregenden &lt;a href="http://weblogs.java.net/blog/timboudreau/archive/2006/03/the_netbeans_go.html"&gt;Prager Golem&lt;/a&gt; heimgesucht! (Nein, ich weiss nicht wer ihn gerade zu Besuch hat, wir harmlosen Tech Writer machen ja nie nie nie was an der Build kaputt... :-D)
      &lt;/p&gt;&lt;p&gt; Hat Eure Firma auch so nette Traditionen? Falls Ihr Euch für Eure wachsenden Team-Projekte gerade nach Werkzeugen für automatisierte Builds und automatisierte Tests umseht, dann lege ich Euch diesen Vortrag zum Stichwort &lt;a href="http://de.wikipedia.org/wiki/Kontinuierliche_Integration"&gt;Permanente Integration&lt;/a&gt; ans Herz: &lt;/p&gt; &lt;blockquote&gt;In München findet am 19. September das erste &lt;b&gt;Continuous Integration Camp&lt;/b&gt; statt. Veranstalter ist die
      &lt;b&gt;NetBeans User Gruppe der JUG München&lt;/b&gt;. Mit dem Meeting wollen wir die Möglichkeit zum Erfahrungsaustausch und zu Diskussionen darüber bieten, was möglich und was sinnvoll ist. &lt;a href="http://haug-server.dyndns.org/confluence/display/NUGM/Continuous+Integration+Camp"&gt;Weitere Informationen findet Ihr im WIKI der JUGM&lt;/a&gt;.&lt;/blockquote&gt; &lt;p&gt;Es gibt einen Vortrag von Toni Epple und eine konkrete Fallstudie. Einfach per Email anmelden und dann am 19.9. (Freitag
      Nachmittag) ab nach Heimstetten. Gebt dem Golem keine Chance! ;-)&lt;/p&gt;</description>
      <pubDate>Wed, 27 Aug 2008 15:23:05 +0000</pubDate>
    </item>
    <item>
      <title>Seapegasus Blog: GlassFish-Vortrag in Berlin</title>
      <guid isPermaLink="false">http://blogs.sun.com/seapegasus/entry/glassfish_vortrag_in_berlin</guid>
      <link>http://blogs.sun.com/seapegasus/entry/glassfish_vortrag_in_berlin</link>
      <description>&lt;p&gt;Wie &lt;a href="http://blogs.sun.com/arungupta/"&gt;Arun&lt;/a&gt; schon auf Englisch angekündigt hat, gibt es im September einen &lt;a href="http://blogs.sun.com/arungupta/entry/glassfish_berlin_brandenburg_jug_and"&gt;Vortrag über den GlassFish Application Server&lt;/a&gt; zusammen mit der Berlin-Brandenburg JUG.&lt;/p&gt; &lt;p&gt; Mittwoch, 3. September&lt;br /&gt; 17:30 - ca. 19:30&lt;br /&gt; Zimmer FR5516, Technische Universität Berlin&lt;br /&gt; Franklinstrasse 28/29
      (&lt;a href="http://maps.google.de/maps?f=q&amp;amp;hl=de&amp;amp;geocode=&amp;amp;q=franklinstr,+28+berlin&amp;amp;sll=51.151786,10.415039&amp;amp;sspn=8.32859,26.345215&amp;amp;ie=UTF8&amp;amp;z=16&amp;amp;iwloc=addr"&gt;Stadtplan&lt;/a&gt;)&lt;br /&gt; 10587 Berlin&lt;br /&gt; &lt;/p&gt; &lt;p&gt;Bitte &lt;a href="https://www.xing.com/app/events?op=detail;id=240568"&gt;meldet Euch vorher via XING&lt;/a&gt; an! Dort findet Ihr auch die &lt;a
      href="https://www.xing.com/app/events?op=detail;id=240568"&gt;Beschreibung&lt;/a&gt;. Arun hält den Vortrag auf Englisch.&lt;/p&gt;</description>
      <pubDate>Fri, 22 Aug 2008 13:54:07 +0000</pubDate>
    </item>
    <item>
      <title>JNBB - Joschs NetBeans Blog: BeanDev: AutoUpdateCenter per Ant-Script updaten - Teil II</title>
      <guid isPermaLink="false">http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_autoupdatecenter_per_ant_script_updaten_teil_ii/index.html</guid>
      <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_autoupdatecenter_per_ant_script_updaten_teil_ii/index.html</link>
      <description>&lt;p class="bodytext"&gt;Ich hatte vergangenen Monat darüber &lt;a href="http://www.sepix.de/blogs/blogrittner/blog/archive/2008/july/31/-1e9d96439e/index.html" class="external-link-new-window" title="AutoUpdate Dateien automatisch kopieren"&gt;berichtet&lt;/a&gt;, wie man ein UpdateCenter automatisch per Ant-Script über ftp auf den Server pushen kann. &lt;/p&gt; &lt;p class="bodytext"&gt;Ich hatte da schon Bedenken geäußert das ftp-Kennwort im Build-Script zu hinterlegen und zeigte die
      Möglichkeit auf das Kennwort in den private.properties einzupflegen. Damit fließt das Kennwort nicht in die Versionierung und bleibt (so lange lokal kein fremder Zugriff besteht) geheim. &lt;/p&gt; &lt;p class="bodytext"&gt;Wenn man das Kennwort gar nicht speichern will, gibt es den input-Task, mit dem das Ant-Script stoppt, ein Abfrage-Diaolg startet und damit das Kennwort setzen kann. &lt;/p&gt; &lt;p class="bodytext"&gt;Man braucht nur drei Zeilen dem Build-Script hizuzufügen und das Target
      distribute-dev bei depends anpassen: &lt;/p&gt; &lt;p class="bodytext"&gt;&lt;/p&gt;&lt;div class="indent"&gt;&lt;pre&gt;&#160;&#160;&#160; &amp;lt;target name="-distribute-prompt-for-ftppass" unless="dev.ftp.password"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;input addproperty="dev.ftp.password" message="Kennwort für das Update-Center:"/&gt;&lt;br /&gt;&#160;&#160;&#160; &amp;lt;/target&gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;target name="distribute-dev"
      depends="-distribute-prompt-for-ftppass" description="Distributes to developers and testers"&gt;&lt;/pre&gt; &lt;p&gt;&lt;/p&gt; &lt;p class="bodytext"&gt;Das war es auch schon. Wenn das Kennwort nicht in einer Property-Datei hinterlegt wurde, kommt der Dialog.&#160;Bei richtig hinterlegtem Kennwort oder bei korrekter Eingabe wird dann alles notwendige auf den Server kopiert. &lt;/p&gt; &lt;p class="bodytext"&gt;Man sollte nur beachten, dass die Kennworteingabe nicht durch ein Password-Field erfolgt.
      D.h. bei der Eingabe sieht man das Kennwort! &lt;/p&gt; &lt;p class="bodytext"&gt;Mit einem eigenen InputHandler wäre das lösbar. &lt;a title="Sourceforge Projekt für einen Ant InputHandler" href="https://sourceforge.net/project/showfiles.php?group_id=103509" target="_blank" class="external-link-new-window"&gt;Hier findet sich eine Quelle&lt;/a&gt;, die einen PasswordInputHandler implementiert hat (Download-Datei ist antinput.zip). &lt;/p&gt; &lt;p class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160;
      Josch.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>Fri, 08 Aug 2008 07:29:00 +0000</pubDate>
    </item>
    <item>
      <title>JNBB - Joschs NetBeans Blog: BeanDev: Plattform Übersetzung als Plugin</title>
      <guid isPermaLink="false">http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_platform_uebersetzung_als_plugin/not_cached/index.html</guid>
      <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_platform_uebersetzung_als_plugin/not_cached/index.html</link>
      <description>&lt;p class="bodytext"&gt;Wie ich schon in einem &lt;a href="http://www.sepix.de/blogs/blogrittner/blog/archive/2008/june/20/beandev_notfall_branding_nb_61_plattform_zu_90_auf_deutsch/index.html" class="external-link-new-window" title="BeanDev: Notfall-Branding - NB 6.1 Plattform zu 90% auf Deutsch"&gt;älteren Blog-Eintrag&lt;/a&gt; geschrieben hatte, ist es möglich eine Programm-Suite mit einem Branding so zu versehen, dass man eine Übersetzung der Plattform hat. &lt;/p&gt; &lt;p
      class="bodytext"&gt;Bei dem Verfahren gibt es einen bedeutenden Nachteil: Nur per ZIP-Distribution wird die Übersetzung installiert. Der Anwender kann nicht darüber entscheiden, ob er diese Sprache haben will und kann das auch nicht zurücknehmen (außer er löscht die JAR-Dateien aus dem ./locale-Ordner. &lt;/p&gt; &lt;p class="bodytext"&gt;&lt;a title="Tonny Kohars Blog" href="http://blogs.kiyut.com/tonny/" target="_blank" class="external-link-new-window"&gt;Tonny Kohar&lt;/a&gt; zeigt in seinem Blog,
      wie man &lt;a title="Netbeans platform localization as plugins" href="http://blogs.kiyut.com/tonny/2008/08/06/netbeans-platform-localization-as-plugins/" target="_blank" class="external-link-new-window"&gt;für eigene Projekte ein Plugin&lt;/a&gt; erstellen kann, um eine Sprachvariante installierbar zu machen. &lt;/p&gt; &lt;p class="bodytext"&gt;Das beschriebene Build-Script ist aber sehr auf das Projekt zugeschnitten und skizziert nur den Aufbau. Ich habe mich mal der Sache angenommen und ein
      Build-Script erstellt, dass generell für alle Projekte verwendet werden kann. Außerdem halte ich mich an die Suite-Branding Konvention die lokalisierten Bundle.properties im branding-Ordner (und nicht unter src) zu halten. Das vereinfacht die Integration in das bestehende Build-System von NetBeans. &lt;/p&gt; &lt;p class="bodytext"&gt;Wie Tonny auch schon schreibt, reicht es, erst ein normales Modul zu erstellen. Ich gebe dem Modul immer den Namen der Suite mit der Endung -l10n.Ggf. kann man aber
      auch das Sprachkennzeichen verwenden (z.B. deDE), damit man später unterschieldiche Übersetzungen in getrennten Installationen anbieten kann. &lt;/p&gt; &lt;p class="bodytext"&gt;In der Files Ansicht des Explorers lege ich dann den branding-Ordner an. Im Gegensatz zur Suite wird der branding-Ordner in einem Module nicht automatisch vom Build-Script erkannt. Suite-Projekte starten ein speziellen Build-Abschnitt, wenn der branding-Ordner existiert. &lt;/p&gt; &lt;p class="bodytext"&gt;Unter dem
      branding-Ordner werden nun die Abschnitte der Übersetzungen für die Module abgelegt. Core weicht da ein wenig vom Standard ab, aber die Modul-Übersetzungen der Plattform heißen vom Ordner immer wie die zu erzeugenden Übersetzungs-JAR-Dateien: &lt;/p&gt; &lt;p class="bodytext"&gt;&lt;img src="http://www.sepix.de/fileadmin/l10n-proj-aufbau.JPG" alt="" height="425" width="389" /&gt; &lt;/p&gt; &lt;p class="bodytext"&gt;Unter core und modules werden nun für die Platform-Module die
      Bundle_xx_XX.properties-Dateien, ein paar Helpset-Dateien und Bildchen eingefügt. Ich hatte schon mal was vorbereitet (allerdings ohne _de_DE-Anhängsel an den Bundle-Dateien): Ein ZIP-Archiv &lt;a href="http://www.sepix.de/fileadmin/modules.zip" class="download" title="Initiates file download"&gt;findet sich hier&lt;/a&gt;. &lt;/p&gt; &lt;p class="bodytext"&gt;Im Prinzip sollte es so aussehen: &lt;/p&gt; &lt;p class="bodytext"&gt;&lt;img
      src="http://www.sepix.de/fileadmin/l10n-proj-aufbau-details.JPG" alt="" height="554" width="363" /&gt; &lt;/p&gt; &lt;p class="bodytext"&gt;Jetzt geht es ans Eingemachte. Das Build-Script muss erweitert werden. &lt;/p&gt; &lt;p class="bodytext"&gt;Dafür nun Build.xml öffnen (findet sich am schnellsten in der Projektansicht unter Important Files). &lt;/p&gt; &lt;p class="bodytext"&gt;Direkt unter dem ersten import geht es los. Zunächst benötigen wir die Eigenschaften aus dem Suite-Projekt, damit wir
      den Application-Namen bekommen: &lt;/p&gt; &lt;pre&gt;&#160; &#160; &amp;lt;property file="${suite.dir}/nbproject/project.properties" prefix="prjsuite"/&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Dann erzeugen wir ein kleines Makro, damit die Tipparbeit für die Module nicht ausufert: &lt;/p&gt; &lt;pre&gt;&#160; &#160; &amp;lt;macrodef name="sub-jar"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &amp;lt;attribute name="dep"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &amp;lt;attribute name="module"
      default="modules"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &amp;lt;sequential&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;jar jarfile="${locale.dir}/@{dep}_${app.name}.jar" compress="${build.package.compress}"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;fileset dir="branding/@{module}/@{dep}.jar/"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;/jar&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;
      &amp;lt;/sequential&gt;&lt;br /&gt;&#160;&#160;&#160; &amp;lt;/macrodef&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Nun&#160; hängen wir uns in das Target build-init ein, um zwei Variablen zu füllen: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160; &amp;lt;target name="build-init" depends="harness.build-init"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &amp;lt;property name="locale.dir" value="${basedir}/build/cluster/modules/locale/"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &amp;lt;property
      name="app.name" value="${prjsuite.app.name}"/&gt;&lt;br /&gt;&#160;&#160;&#160; &amp;lt;/target&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Dabei ist locale.dir das Zielverzeichnis für die Übersetzungen und app.name holt sich einfach den Wert aus den Suite-Properties. &lt;/p&gt; &lt;p class="bodytext"&gt;Nun hängen wir uns in das jar-Target, erzeugen das locale.dir und basteln schon für das core.jar die erste Übersetzung. Da kann ich das Makro nicht verwenden, weil der Zielname der Übersetzung anders
      als die JAR-Datei heißen soll: &lt;/p&gt; &lt;pre&gt;&#160;&#160; &amp;lt;target name="jar" depends="projectized-common.jar"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;mkdir dir="${locale.dir}"/&gt;&lt;br /&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;!-- Sonderbehandlung für das core-package --&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;jar jarfile="${locale.dir}/org-netbeans-core_${app.name}.jar"
      compress="${build.package.compress}"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;fileset dir="branding/core/core.jar/"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;/jar&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Nun folgen die restlichen Übersetzungen aus dem modules-Ordner. Das funktioniert sehr gut mit dem Makro. Hier ein Auszug: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;!-- Lokalisierung für die
      modules packages --&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;sub-jar dep="org-jdesktop-layout"/&gt; &lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;sub-jar dep="org-netbeans-api-progress"/&gt; &lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;sub-jar dep="org-netbeans-api-visual"/&gt; &lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;sub-jar dep="org-netbeans-core-execution"/&gt; &lt;/pre&gt; &lt;p class="bodytext"&gt;Als letztes in
      diesem Target kopiere ich die fertigen Archive in das Suite-Projekt. Das ist nicht unbedingt notwendig, erleichtert aber das Erstellen von ZIP-Distributionen mit fertig übersetzten Archiven: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;!-- Kopieren der JAR-Dateien in das Suite locale Verzeichnis--&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;copy todir="${cluster}/modules/locale/" &gt;&lt;br
      /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;fileset dir="${locale.dir}"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;exclude name="${module.jar.basename}"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;/fileset&gt;&#160;&#160;&#160; &lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;/copy&gt;&lt;br /&gt;&#160;&#160;&#160;
      &amp;lt;/target&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Somit ist zumindest die Erstellung der übersetzten Dateien automatisiert in ein extra Modul implementiert. Aber installierbar ist das noch nicht. Ich verlasse mich da ganz auf die Fähigkeiten von Tonny und übernehme sein erweitertes Target nbm: &lt;/p&gt; &lt;pre&gt; &amp;lt;target name="nbm" depends="projectized-common.nbm"&gt;&lt;br /&gt; &amp;lt;property name="nbm-expand" value="nbm-expand"/&gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- 1: NBM
      Datei extrahieren --&gt;&lt;br /&gt; &amp;lt;unjar src="build/${nbm}" dest="build/${nbm-expand}"&gt;&lt;br /&gt; &amp;lt;patternset&gt;&lt;br /&gt; &amp;lt;exclude name="META-INF/**"/&gt;&lt;br /&gt; &amp;lt;/patternset&gt;&lt;br /&gt; &amp;lt;/unjar&gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- 2: Übersetzugen in den passenden Ordner packen --&gt;&lt;br /&gt; &amp;lt;copy todir="build/${nbm-expand}/netbeans/modules/locale/" &gt;&lt;br /&gt; &amp;lt;fileset dir="${cluster}/modules/locale/" /&gt;&lt;br
      /&gt; &amp;lt;/copy&gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- 3: Nun wieder als JAR zusammensetzen --&gt;&lt;br /&gt; &amp;lt;jar jarfile="build/${nbm}" compress="true"&gt;&lt;br /&gt; &amp;lt;fileset dir="build/${nbm-expand}" /&gt;&lt;br /&gt; &amp;lt;/jar&gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- 4: Signieren, wenn gewünscht --&gt;&lt;br /&gt; &amp;lt;antcall target="sign-nbm" /&gt;&lt;br /&gt; &amp;lt;/target&gt;&#160;&#160;&#160; &lt;/pre&gt; &lt;p class="bodytext"&gt;Für das optionale Signieren
      fehlt noch: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160; &amp;lt;target name="sign-nbm" if="keystore"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;signjar jar="build/${nbm}" keystore="${keystore}" storepass="${storepass}" alias="${nbm_alias}" /&gt;&lt;br /&gt;&#160;&#160;&#160; &amp;lt;/target&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Und das war es auch schon! &lt;/p&gt; &lt;p class="bodytext"&gt;Das Modul kann nun ganz normal im Update-Center publiziert werden. Es können weitere
      Sprachen hinzugefügt werden. Nur funktioniert es nicht, dass man mehrere Module mit unterschiedlichen Sprachen installieren kann. Dazu müsste man das Makro umprogrammieren und dort ein Lokalisierungskennzeichen (z.B. _deDE) hinzufügen: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;jar jarfile="${locale.dir}/@{dep}_${app.name}_deDE.jar" compress="${build.package.compress}"&gt;&lt;br /&gt; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;fileset
      dir="branding/@{module}/@{dep}.jar/"/&gt;&lt;br /&gt; &#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;/jar&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Vielleicht kann man sich dazu auch ein Symbol in den project.properties anlegen. Man darf nur die Sonderbehandlung von core.jar nicht vergessen! &lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt; &lt;p class="bodytext"&gt;&lt;a href="http://www.sepix.de/fileadmin/build.xml" class="download" title="Initiates file download"&gt;Hier noch mal das komplette
      Build.xml Script&lt;/a&gt;, wo alle Module der NetBeans-Plaform übersetzt werden. &lt;/p&gt; &lt;p class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160; Josch.&lt;/p&gt;</description>
      <pubDate>Thu, 07 Aug 2008 05:27:00 +0000</pubDate>
    </item>
    <item>
      <title>JNBB - Joschs NetBeans Blog: BeanDev: Plattform Übersetzung als Plugin</title>
      <guid isPermaLink="false">http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_platform_uebersetzung_als_plugin/index.html</guid>
      <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_platform_uebersetzung_als_plugin/index.html</link>
      <description>&lt;p class="bodytext"&gt;Wie ich schon in einem &lt;a href="http://www.sepix.de/blogs/blogrittner/blog/archive/2008/june/20/beandev_notfall_branding_nb_61_plattform_zu_90_auf_deutsch/index.html" class="external-link-new-window" title="BeanDev: Notfall-Branding - NB 6.1 Plattform zu 90% auf Deutsch"&gt;älteren Blog-Eintrag&lt;/a&gt; geschrieben hatte, ist es möglich eine Programm-Suite mit einem Branding so zu versehen, dass man eine Übersetzung der Plattform hat. &lt;/p&gt; &lt;p
      class="bodytext"&gt;Bei dem Verfahren gibt es einen bedeutenden Nachteil: Nur per ZIP-Distribution wird die Übersetzung installiert. Der Anwender kann nicht darüber entscheiden, ob er diese Sprache haben will und kann das auch nicht zurücknehmen (außer er löscht die JAR-Dateien aus dem ./locale-Ordner. &lt;/p&gt; &lt;p class="bodytext"&gt;&lt;a title="Tonny Kohars Blog" href="http://blogs.kiyut.com/tonny/" target="_blank" class="external-link-new-window"&gt;Tonny Kohar&lt;/a&gt; zeigt in seinem Blog,
      wie man &lt;a title="Netbeans platform localization as plugins" href="http://blogs.kiyut.com/tonny/2008/08/06/netbeans-platform-localization-as-plugins/" target="_blank" class="external-link-new-window"&gt;für eigene Projekte ein Plugin&lt;/a&gt; erstellen kann, um eine Sprachvariante installierbar zu machen. &lt;/p&gt; &lt;p class="bodytext"&gt;Das beschriebene Build-Script ist aber sehr auf das Projekt zugeschnitten und skizziert nur den Aufbau. Ich habe mich mal der Sache angenommen und ein
      Build-Script erstellt, dass generell für alle Projekte verwendet werden kann. Außerdem halte ich mich an die Suite-Branding Konvention die lokalisierten Bundle.properties im branding-Ordner (und nicht unter src) zu halten. Das vereinfacht die Integration in das bestehende Build-System von NetBeans. &lt;/p&gt; &lt;p class="bodytext"&gt;Wie Tonny auch schon schreibt, reicht es, erst ein normales Modul zu erstellen. Ich gebe dem Modul immer den Namen der Suite mit der Endung -l10n.Ggf. kann man aber
      auch das Sprachkennzeichen verwenden (z.B. deDE), damit man später unterschieldiche Übersetzungen in getrennten Installationen anbieten kann. &lt;/p&gt; &lt;p class="bodytext"&gt;In der Files Ansicht des Explorers lege ich dann den branding-Ordner an. Im Gegensatz zur Suite wird der branding-Ordner in einem Module nicht automatisch vom Build-Script erkannt. Suite-Projekte starten ein speziellen Build-Abschnitt, wenn der branding-Ordner existiert. &lt;/p&gt; &lt;p class="bodytext"&gt;Unter dem
      branding-Ordner werden nun die Abschnitte der Übersetzungen für die Module abgelegt. Core weicht da ein wenig vom Standard ab, aber die Modul-Übersetzungen der Plattform heißen vom Ordner immer wie die zu erzeugenden Übersetzungs-JAR-Dateien: &lt;/p&gt; &lt;p class="bodytext"&gt;&lt;img src="http://www.sepix.de/fileadmin/l10n-proj-aufbau.JPG" alt="" height="425" width="389" /&gt; &lt;/p&gt; &lt;p class="bodytext"&gt;Unter core und modules werden nun für die Platform-Module die
      Bundle_xx_XX.properties-Dateien, ein paar Helpset-Dateien und Bildchen eingefügt. Ich hatte schon mal was vorbereitet (allerdings ohne _de_DE-Anhängsel an den Bundle-Dateien): Ein ZIP-Archiv &lt;a href="http://www.sepix.de/fileadmin/modules.zip" class="download" title="Initiates file download"&gt;findet sich hier&lt;/a&gt;. &lt;/p&gt; &lt;p class="bodytext"&gt;Im Prinzip sollte es so aussehen: &lt;/p&gt; &lt;p class="bodytext"&gt;&lt;img
      src="http://www.sepix.de/fileadmin/l10n-proj-aufbau-details.JPG" alt="" height="554" width="363" /&gt; &lt;/p&gt; &lt;p class="bodytext"&gt;Jetzt geht es ans Eingemachte. Das Build-Script muss erweitert werden. &lt;/p&gt; &lt;p class="bodytext"&gt;Dafür nun Build.xml öffnen (findet sich am schnellsten in der Projektansicht unter Important Files). &lt;/p&gt; &lt;p class="bodytext"&gt;Direkt unter dem ersten import geht es los. Zunächst benötigen wir die Eigenschaften aus dem Suite-Projekt, damit wir
      den Application-Namen bekommen: &lt;/p&gt; &lt;pre&gt;&#160; &#160; &amp;lt;property file="${suite.dir}/nbproject/project.properties" prefix="prjsuite"/&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Dann erzeugen wir ein kleines Makro, damit die Tipparbeit für die Module nicht ausufert: &lt;/p&gt; &lt;pre&gt;&#160; &#160; &amp;lt;macrodef name="sub-jar"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &amp;lt;attribute name="dep"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &amp;lt;attribute name="module"
      default="modules"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &amp;lt;sequential&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;jar jarfile="${locale.dir}/@{dep}_${app.name}.jar" compress="${build.package.compress}"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;fileset dir="branding/@{module}/@{dep}.jar/"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;/jar&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;
      &amp;lt;/sequential&gt;&lt;br /&gt;&#160;&#160;&#160; &amp;lt;/macrodef&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Nun&#160; hängen wir uns in das Target build-init ein, um zwei Variablen zu füllen: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160; &amp;lt;target name="build-init" depends="harness.build-init"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &amp;lt;property name="locale.dir" value="${basedir}/build/cluster/modules/locale/"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &amp;lt;property
      name="app.name" value="${prjsuite.app.name}"/&gt;&lt;br /&gt;&#160;&#160;&#160; &amp;lt;/target&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Dabei ist locale.dir das Zielverzeichnis für die Übersetzungen und app.name holt sich einfach den Wert aus den Suite-Properties. &lt;/p&gt; &lt;p class="bodytext"&gt;Nun hängen wir uns in das jar-Target, erzeugen das locale.dir und basteln schon für das core.jar die erste Übersetzung. Da kann ich das Makro nicht verwenden, weil der Zielname der Übersetzung anders
      als die JAR-Datei heißen soll: &lt;/p&gt; &lt;pre&gt;&#160;&#160; &amp;lt;target name="jar" depends="projectized-common.jar"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;mkdir dir="${locale.dir}"/&gt;&lt;br /&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;!-- Sonderbehandlung für das core-package --&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;jar jarfile="${locale.dir}/org-netbeans-core_${app.name}.jar"
      compress="${build.package.compress}"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;fileset dir="branding/core/core.jar/"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;/jar&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Nun folgen die restlichen Übersetzungen aus dem modules-Ordner. Das funktioniert sehr gut mit dem Makro. Hier ein Auszug: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;!-- Lokalisierung für die
      modules packages --&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;sub-jar dep="org-jdesktop-layout"/&gt; &lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;sub-jar dep="org-netbeans-api-progress"/&gt; &lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;sub-jar dep="org-netbeans-api-visual"/&gt; &lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;sub-jar dep="org-netbeans-core-execution"/&gt; &lt;/pre&gt; &lt;p class="bodytext"&gt;Als letztes in
      diesem Target kopiere ich die fertigen Archive in das Suite-Projekt. Das ist nicht unbedingt notwendig, erleichtert aber das Erstellen von ZIP-Distributionen mit fertig übersetzten Archiven: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;!-- Kopieren der JAR-Dateien in das Suite locale Verzeichnis--&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;copy todir="${cluster}/modules/locale/" &gt;&lt;br
      /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;fileset dir="${locale.dir}"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;exclude name="${module.jar.basename}"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;/fileset&gt;&#160;&#160;&#160; &lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;/copy&gt;&lt;br /&gt;&#160;&#160;&#160;
      &amp;lt;/target&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Somit ist zumindest die Erstellung der übersetzten Dateien automatisiert in ein extra Modul implementiert. Aber installierbar ist das noch nicht. Ich verlasse mich da ganz auf die Fähigkeiten von Tonny und übernehme sein erweitertes Target nbm: &lt;/p&gt; &lt;pre&gt; &amp;lt;target name="nbm" depends="projectized-common.nbm"&gt;&lt;br /&gt; &amp;lt;property name="nbm-expand" value="nbm-expand"/&gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- 1: NBM
      Datei extrahieren --&gt;&lt;br /&gt; &amp;lt;unjar src="build/${nbm}" dest="build/${nbm-expand}"&gt;&lt;br /&gt; &amp;lt;patternset&gt;&lt;br /&gt; &amp;lt;exclude name="META-INF/**"/&gt;&lt;br /&gt; &amp;lt;/patternset&gt;&lt;br /&gt; &amp;lt;/unjar&gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- 2: Übersetzugen in den passenden Ordner packen --&gt;&lt;br /&gt; &amp;lt;copy todir="build/${nbm-expand}/netbeans/modules/locale/" &gt;&lt;br /&gt; &amp;lt;fileset dir="${cluster}/modules/locale/" /&gt;&lt;br
      /&gt; &amp;lt;/copy&gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- 3: Nun wieder als JAR zusammensetzen --&gt;&lt;br /&gt; &amp;lt;jar jarfile="build/${nbm}" compress="true"&gt;&lt;br /&gt; &amp;lt;fileset dir="build/${nbm-expand}" /&gt;&lt;br /&gt; &amp;lt;/jar&gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- 4: Signieren, wenn gewünscht --&gt;&lt;br /&gt; &amp;lt;antcall target="sign-nbm" /&gt;&lt;br /&gt; &amp;lt;/target&gt;&#160;&#160;&#160; &lt;/pre&gt; &lt;p class="bodytext"&gt;Für das optionale Signieren
      fehlt noch: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160; &amp;lt;target name="sign-nbm" if="keystore"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;signjar jar="build/${nbm}" keystore="${keystore}" storepass="${storepass}" alias="${nbm_alias}" /&gt;&lt;br /&gt;&#160;&#160;&#160; &amp;lt;/target&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Und das war es auch schon! &lt;/p&gt; &lt;p class="bodytext"&gt;Das Modul kann nun ganz normal im Update-Center publiziert werden. Es können weitere
      Sprachen hinzugefügt werden. Nur funktioniert es nicht, dass man mehrere Module mit unterschiedlichen Sprachen installieren kann. Dazu müsste man das Makro umprogrammieren und dort ein Lokalisierungskennzeichen (z.B. _deDE) hinzufügen: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;jar jarfile="${locale.dir}/@{dep}_${app.name}_deDE.jar" compress="${build.package.compress}"&gt;&lt;br /&gt; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;fileset
      dir="branding/@{module}/@{dep}.jar/"/&gt;&lt;br /&gt; &#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;/jar&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Vielleicht kann man sich dazu auch ein Symbol in den project.properties anlegen. Man darf nur die Sonderbehandlung von core.jar nicht vergessen! &lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt; &lt;p class="bodytext"&gt;&lt;a href="http://www.sepix.de/fileadmin/build.xml" class="download" title="Initiates file download"&gt;Hier noch mal das komplette
      Build.xml Script&lt;/a&gt;, wo alle Module der NetBeans-Plaform übersetzt werden. &lt;/p&gt; &lt;p class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160; Josch.&lt;/p&gt;</description>
      <pubDate>Thu, 07 Aug 2008 05:27:00 +0000</pubDate>
    </item>
    <item>
      <title>JNBB - Joschs NetBeans Blog: BeanDev: Access-Warnungen in Wrapper-Bibliotheken deaktiveren</title>
      <guid isPermaLink="false">http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_access_warnungen_in_wrapper_bibliotheken_deaktiveren/not_cached/index.html</guid>
      <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_access_warnungen_in_wrapper_bibliotheken_deaktiveren/not_cached/index.html</link>
      <description>&lt;p class="bodytext"&gt;Eingebundene Wrapper-Bibliotheken nutzen teilweise andere JAR-Bibliotheken, die man selbst im Wrapper nicht nutzt und damit erst gar nicht einbindet.&#160; &lt;/p&gt; &lt;p class="bodytext"&gt;Die NetBeans-Plattform erkennt aber diese Abhängigkeiten und die fehlende Zugriffsmöglichkeit der Bibliothek im Wrapper. &lt;/p&gt; &lt;p class="bodytext"&gt;Im Build-Log erhält man dann beispielsweise folgende Warnungen: &lt;/p&gt; &lt;pre&gt;Warning:
      com.ibm.media.parser.video.MpegParser cannot access com.ms.security.PermissionID&lt;br /&gt;Warning: com.ibm.media.parser.video.MpegParser cannot access com.ms.security.PolicyEngine&lt;br /&gt;Warning: com.ibm.media.protocol.CloneableSourceStreamAdapter$PushStreamSlave cannot access com.ms.security.PermissionID&lt;br /&gt;Warning: com.ibm.media.protocol.CloneableSourceStreamAdapter$PushStreamSlave cannot access com.ms.security.PolicyEngine&lt;/pre&gt; &lt;p class="bodytext"&gt;Wenn diese fehlenden
      Zugriffsmöglichkeiten bewusst akzeptiert werden sollen und man die Warnungen aus dem Log entfernt haben möchte, muss man die project.properties anpassen. &lt;/p&gt; &lt;p class="bodytext"&gt;Zuständig für das Deaktivieren der Warnungen ist die Eigenschaft module.jar.verifylinkageignores und erwartet einen &lt;a title="Wikipedia: Regulärer Ausdruck" href="http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck" target="_blank" class="external-link-new-window"&gt;Regulären Ausdruck&lt;/a&gt;. &lt;/p&gt;
      &lt;p class="bodytext"&gt;Beispiel (z.B. für das Java Media Framework): &lt;/p&gt; &lt;pre&gt;module.jar.verifylinkageignores=(com.(ibm|sun).media..*)|(javax.media.rtp.rtcp.SourceDescription)&lt;/pre&gt; &lt;p class="bodytext"&gt;Diese Eigenschaft wird übrigens vom Ant-Target "verify-class-linkage" im Build-Script verwendet. Der Task "verifyclasslinkage" nutzt den zugewiesenen Wert als ignore-Liste der Klassennamen. &lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt; &lt;p
      class="bodytext"&gt;&#160;&lt;/p&gt; &lt;p class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160; Josch.&lt;/p&gt;</description>
      <pubDate>Tue, 05 Aug 2008 06:44:00 +0000</pubDate>
    </item>
    <item>
      <title>JNBB - Joschs NetBeans Blog: BeanDev: Access-Warnungen in Wrapper-Bibliotheken deaktiveren</title>
      <guid isPermaLink="false">http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_access_warnungen_in_wrapper_bibliotheken_deaktiveren/index.html</guid>
      <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_access_warnungen_in_wrapper_bibliotheken_deaktiveren/index.html</link>
      <description>&lt;p class="bodytext"&gt;Eingebundene Wrapper-Bibliotheken nutzen teilweise andere JAR-Bibliotheken, die man selbst im Wrapper nicht nutzt und damit erst gar nicht einbindet.&#160; &lt;/p&gt; &lt;p class="bodytext"&gt;Die NetBeans-Plattform erkennt aber diese Abhängigkeiten und die fehlende Zugriffsmöglichkeit der Bibliothek im Wrapper. &lt;/p&gt; &lt;p class="bodytext"&gt;Im Build-Log erhält man dann beispielsweise folgende Warnungen: &lt;/p&gt; &lt;pre&gt;Warning:
      com.ibm.media.parser.video.MpegParser cannot access com.ms.security.PermissionID&lt;br /&gt;Warning: com.ibm.media.parser.video.MpegParser cannot access com.ms.security.PolicyEngine&lt;br /&gt;Warning: com.ibm.media.protocol.CloneableSourceStreamAdapter$PushStreamSlave cannot access com.ms.security.PermissionID&lt;br /&gt;Warning: com.ibm.media.protocol.CloneableSourceStreamAdapter$PushStreamSlave cannot access com.ms.security.PolicyEngine&lt;/pre&gt; &lt;p class="bodytext"&gt;Wenn diese fehlenden
      Zugriffsmöglichkeiten bewusst akzeptiert werden sollen und man die Warnungen aus dem Log entfernt haben möchte, muss man die project.properties anpassen. &lt;/p&gt; &lt;p class="bodytext"&gt;Zuständig für das Deaktivieren der Warnungen ist die Eigenschaft module.jar.verifylinkageignores und erwartet einen &lt;a title="Wikipedia: Regulärer Ausdruck" href="http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck" target="_blank" class="external-link-new-window"&gt;Regulären Ausdruck&lt;/a&gt;. &lt;/p&gt;
      &lt;p class="bodytext"&gt;Beispiel (z.B. für das Java Media Framework): &lt;/p&gt; &lt;pre&gt;module.jar.verifylinkageignores=(com.(ibm|sun).media..*)|(javax.media.rtp.rtcp.SourceDescription)&lt;/pre&gt; &lt;p class="bodytext"&gt;Diese Eigenschaft wird übrigens vom Ant-Target "verify-class-linkage" im Build-Script verwendet. Der Task "verifyclasslinkage" nutzt den zugewiesenen Wert als ignore-Liste der Klassennamen. &lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt; &lt;p
      class="bodytext"&gt;&#160;&lt;/p&gt; &lt;p class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160; Josch.&lt;/p&gt;</description>
      <pubDate>Tue, 05 Aug 2008 06:44:00 +0000</pubDate>
    </item>
    <item>
      <title>JNBB - Joschs NetBeans Blog: BeanDev: AutoUpdate Dateien automatisch kopieren</title>
      <guid isPermaLink="false">http://www.sepix.de/blogs/blogrittner/blog/archive////-1e9d96439e/not_cached/index.html</guid>
      <link>http://www.sepix.de/blogs/blogrittner/blog/archive////-1e9d96439e/not_cached/index.html</link>
      <description>&lt;p class="bodytext"&gt;Das Build System mit Ant ist so vielfältig zu konfigurieren, da klappt auch ein FTP-Upload der AutoUpdate-Dateien auf den eigenen Server. &lt;/p&gt; &lt;p class="bodytext"&gt;&lt;br /&gt;Zunächst muss man die &lt;a title="Commons Net Download Seite" href="http://commons.apache.org/downloads/download_net.cgi" target="_blank" class="external-link-new-window"&gt;Apache Commons Net&lt;/a&gt; in den Ant-Classpath hinzufügen. Das geht seit NetBeans 6.0 sehr leicht
      über den Options-Dialog. Die Binary-Versions von commons-net extrahieren und in den gewünschten Pfad kopieren. &lt;/p&gt; &lt;p class="bodytext"&gt;Nun in NetBeans den Options-Dialog öffnen, auf Miscellaneous wechseln und in der Ant-Registerzunge dem Classpath die JAR-Datei hinzufügen. &lt;/p&gt; &lt;p class="bodytext"&gt;&lt;img src="http://www.sepix.de/fileadmin/Options-Ant-Classpath.PNG" alt="" height="466" width="630" /&gt; &lt;/p&gt; &lt;p class="bodytext"&gt;Von nun an hat man die zusätzlichen
      Tasks, die in commons-net-x.x.x.jar definiert sind. Ein Task davon ist &lt;a title="Dokumentation zum ftp-TAsk von Ant" href="http://ant.apache.org/manual/OptionalTasks/ftp.html" target="_blank" class="external-link-new-window"&gt;ftp&lt;/a&gt;. &lt;/p&gt; &lt;p class="bodytext"&gt;Nun das Build-Script der gewünschten NetBeans Application Platform öffnen (findet sich unter Important Files) und folgendes Target hinzufügen: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160; &amp;lt;target name="distribute-dev"
      description="Distri to developers"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &amp;lt;tstamp/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &amp;lt;ftp&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; server="ftp.myserver.de"&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; userid="thebuilduser"&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; password="theuserpwd"&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
      remotedir="/updates/dev/myapp"&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; verbose="true"&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; passive="true"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;fileset dir="build/updates" casesensitive="yes"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;include name="**/*.nbm"/&gt;&lt;br
      /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;include name="**/updates.xml"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;/fileset&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &amp;lt;/ftp&gt;&lt;br /&gt;&#160;&#160;&#160; &amp;lt;/target&gt; &lt;/pre&gt; &lt;p class="bodytext"&gt;&lt;/p&gt;&lt;div class="indent"&gt;Da das Build-Script aber auch versioniert wird und es ggf. nicht erwünscht ist, dass irgendwo in
      einem Repository das Kennwort rumschwirrt, sollte man eine Konstante in den private properties dafür anlegen. Diese Eigenschaften findet man in der Files-Ansicht des Projektes unter nbproject/private/private.properties. Dort einfach folgende Zeile hinzufügen: &lt;p&gt;&lt;/p&gt; &lt;pre&gt;dev.ftp.password=myv3rys3cr3tpassw0rd&lt;/pre&gt; &lt;p class="bodytext"&gt;und das Target des Ant-Scriptes anpassen: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
      password="${dev.ftp.password}"&lt;/pre&gt; &lt;p class="bodytext"&gt;(Übrigens hilft hier das Autovervollständigen der NetBeans IDE) &lt;/p&gt; &lt;p class="bodytext"&gt;Jetzt muss man zunächst im Kontext-Menü der Application "Create NBMs" aufrufen, damit alle Dateien im build/updates Ordner erzeugt werden. &lt;/p&gt; &lt;p class="bodytext"&gt;Nun kann man mit der rechten Maustaste in der Projects-Ansicht auf das Build-Script klicken und Run Target -&gt; distribute-dev aufrufen. &lt;/p&gt; &lt;p
      class="bodytext"&gt;&lt;img src="http://www.sepix.de/fileadmin/RunTarget.PNG" alt="" height="565" width="532" /&gt; &lt;/p&gt; &lt;p class="bodytext"&gt;Wenn alle Daten passen, werden die Dateien auf den ftp-Server kopiert. &lt;/p&gt; &lt;p class="bodytext"&gt;Möchte man sich den Schritt mit dem Menüaufruf von "Create NBMs" sparen, trägt man in das&#160;Target einfach die Abhängigkeit zu dem nbms-Target ein: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160; &amp;lt;target name="distribute-dev" depends="nbms"
      description="Distri to developers"&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Somit erzeugt distribute-dev zunächst immer die aktuellen Updater-Dateien und kopiert sie dann auf den Server. &lt;/p&gt; &lt;p class="bodytext"&gt;Das war es auch schon und beste Grüße,&lt;br /&gt;&#160; Josch.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>Thu, 31 Jul 2008 09:17:00 +0000</pubDate>
    </item>
    <item>
      <title>JNBB - Joschs NetBeans Blog: BeanDev: AutoUpdate Dateien automatisch kopieren</title>
      <guid isPermaLink="false">http://www.sepix.de/blogs/blogrittner/blog/archive////-1e9d96439e/index.html</guid>
      <link>http://www.sepix.de/blogs/blogrittner/blog/archive////-1e9d96439e/index.html</link>
      <description>&lt;p class="bodytext"&gt;Das Build System mit Ant ist so vielfältig zu konfigurieren, da klappt auch ein FTP-Upload der AutoUpdate-Dateien auf den eigenen Server. &lt;/p&gt; &lt;p class="bodytext"&gt;&lt;br /&gt;Zunächst muss man die &lt;a title="Commons Net Download Seite" href="http://commons.apache.org/downloads/download_net.cgi" target="_blank" class="external-link-new-window"&gt;Apache Commons Net&lt;/a&gt; in den Ant-Classpath hinzufügen. Das geht seit NetBeans 6.0 sehr leicht
      über den Options-Dialog. Die Binary-Versions von commons-net extrahieren und in den gewünschten Pfad kopieren. &lt;/p&gt; &lt;p class="bodytext"&gt;Nun in NetBeans den Options-Dialog öffnen, auf Miscellaneous wechseln und in der Ant-Registerzunge dem Classpath die JAR-Datei hinzufügen. &lt;/p&gt; &lt;p class="bodytext"&gt;&lt;img src="http://www.sepix.de/fileadmin/Options-Ant-Classpath.PNG" alt="" height="466" width="630" /&gt; &lt;/p&gt; &lt;p class="bodytext"&gt;Von nun an hat man die zusätzlichen
      Tasks, die in commons-net-x.x.x.jar definiert sind. Ein Task davon ist &lt;a title="Dokumentation zum ftp-TAsk von Ant" href="http://ant.apache.org/manual/OptionalTasks/ftp.html" target="_blank" class="external-link-new-window"&gt;ftp&lt;/a&gt;. &lt;/p&gt; &lt;p class="bodytext"&gt;Nun das Build-Script der gewünschten NetBeans Application Platform öffnen (findet sich unter Important Files) und folgendes Target hinzufügen: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160; &amp;lt;target name="distribute-dev"
      description="Distri to developers"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &amp;lt;tstamp/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &amp;lt;ftp&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; server="ftp.myserver.de"&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; userid="thebuilduser"&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; password="theuserpwd"&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
      remotedir="/updates/dev/myapp"&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; verbose="true"&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; passive="true"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;fileset dir="build/updates" casesensitive="yes"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;include name="**/*.nbm"/&gt;&lt;br
      /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;include name="**/updates.xml"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;/fileset&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &amp;lt;/ftp&gt;&lt;br /&gt;&#160;&#160;&#160; &amp;lt;/target&gt; &lt;/pre&gt; &lt;p class="bodytext"&gt;&lt;/p&gt;&lt;div class="indent"&gt;Da das Build-Script aber auch versioniert wird und es ggf. nicht erwünscht ist, dass irgendwo in
      einem Repository das Kennwort rumschwirrt, sollte man eine Konstante in den private properties dafür anlegen. Diese Eigenschaften findet man in der Files-Ansicht des Projektes unter nbproject/private/private.properties. Dort einfach folgende Zeile hinzufügen: &lt;p&gt;&lt;/p&gt; &lt;pre&gt;dev.ftp.password=myv3rys3cr3tpassw0rd&lt;/pre&gt; &lt;p class="bodytext"&gt;und das Target des Ant-Scriptes anpassen: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
      password="${dev.ftp.password}"&lt;/pre&gt; &lt;p class="bodytext"&gt;(Übrigens hilft hier das Autovervollständigen der NetBeans IDE) &lt;/p&gt; &lt;p class="bodytext"&gt;Jetzt muss man zunächst im Kontext-Menü der Application "Create NBMs" aufrufen, damit alle Dateien im build/updates Ordner erzeugt werden. &lt;/p&gt; &lt;p class="bodytext"&gt;Nun kann man mit der rechten Maustaste in der Projects-Ansicht auf das Build-Script klicken und Run Target -&gt; distribute-dev aufrufen. &lt;/p&gt; &lt;p
      class="bodytext"&gt;&lt;img src="http://www.sepix.de/fileadmin/RunTarget.PNG" alt="" height="565" width="532" /&gt; &lt;/p&gt; &lt;p class="bodytext"&gt;Wenn alle Daten passen, werden die Dateien auf den ftp-Server kopiert. &lt;/p&gt; &lt;p class="bodytext"&gt;Möchte man sich den Schritt mit dem Menüaufruf von "Create NBMs" sparen, trägt man in das&#160;Target einfach die Abhängigkeit zu dem nbms-Target ein: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160; &amp;lt;target name="distribute-dev" depends="nbms"
      description="Distri to developers"&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Somit erzeugt distribute-dev zunächst immer die aktuellen Updater-Dateien und kopiert sie dann auf den Server. &lt;/p&gt; &lt;p class="bodytext"&gt;Das war es auch schon und beste Grüße,&lt;br /&gt;&#160; Josch.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>Thu, 31 Jul 2008 09:17:00 +0000</pubDate>
    </item>
    <item>
      <title>Seapegasus Blog: EJB-Artikel im JavaSpektrum</title>
      <guid isPermaLink="false">http://blogs.sun.com/seapegasus/entry/ejb_artikel_im_javaspektrum</guid>
      <link>http://blogs.sun.com/seapegasus/entry/ejb_artikel_im_javaspektrum</link>
      <description>&lt;p&gt; Auf ans Kiosk: NetBeans-Dream-Team-Mitglied Adam Bien hat einen weiteren berühmt-berüchtigten EJB 3-Artikel geschrieben, diesmal bekommt Ihr ihn im &lt;a href="http://www.sigs-datacom.de/sd/publications/js/2008/04/index.htm"&gt;JavaSpektrum-Magazin&lt;/a&gt; zu Gesicht.&lt;/p&gt; &lt;p&gt; Eine &lt;a href="http://www.sigs-datacom.de/sd/publications/pub_article_show.htm?&amp;amp;AID=2336&amp;amp;Table=sd_article"&gt;Zusammenfassung&lt;/a&gt; findet Ihr hier online; für den
      vollen Inhalt (inklusive NetBeans-Bildschirmphotos) kauft Ihr das Magazin — oder Ihr ladet für zwoenhalb Euro das PDF runter. &lt;/p&gt; &lt;p&gt;&amp;lt;WÄÄBUNG&gt;Unterstützt einen Entwickler, kauft ein PDF!&amp;lt;/WÄÄBUNG&gt; :-D (Adam, kriegst Du da was von?)&lt;/p&gt; &lt;p&gt; Dass ich so lange nicht geblogt habe, lag übrigens daran dass ich "kurz" in Island war. :) Und danach hat sich der &lt;a href="http://de.wikipedia.org/wiki/Dungeons_&amp;amp;_Dragons"&gt;D&amp;amp;D&lt;/a&gt;-Floh in
      mein Ohr gesetzt. Also, d.h. konkret, ich habe mich überreden lassen, es demnächst zumindest mal zu probieren. Ich hatte bisher erst einmal eine Uraltversion vom &lt;a href="http://de.wikipedia.org/wiki/Das_Schwarze_Auge"&gt;Schwarzen Auge&lt;/a&gt; gespielt (mein armer Typie befindet sich immer noch im Limbo in irgendeinem aventurischen Wald, umzingelt von Orks), und hab mir noch keine endgültige Meinung über modernere Editionen gebildet. Mal sehen! Jetzt erst mal eine suuupi-Hintergrundstory
      erfinden. Es muss etwas besseres geben als "ich bin Vollwaise, alle hassen mich, und ein Ork hat meine Hausaufgaben gefressen"...! ;-) &lt;/p&gt;</description>
      <pubDate>Wed, 23 Jul 2008 16:43:49 +0000</pubDate>
    </item>
    <item>
      <title>JNBB - Joschs NetBeans Blog: BeanDev: Vorbelegen von Optionseigenschaften des Autoupdater</title>
      <guid isPermaLink="false">http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_vorbelegen_von_optionseigenschaften_des_autoupdater/not_cached/index.html</guid>
      <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_vorbelegen_von_optionseigenschaften_des_autoupdater/not_cached/index.html</link>
      <description>&lt;p class="bodytext"&gt;Es ist nur eine Kleinigkeit, aber mit der Umstellung in NetBeans 6.0 von der &lt;a title="NetBeans Optios API (Deprecated)" href="http://bits.netbeans.org/dev/javadoc/org-openide-options/org/openide/options/package-summary.html" target="_blank" class="external-link-new-window"&gt;Options-API&lt;/a&gt; auf die &lt;a title="NetBeans preferences API" href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/doc-files/preferences.html"
      target="_blank" class="external-link-new-window"&gt;Preferences-API&lt;/a&gt; kann man relativ einfach auch Einstellungen fremder Module beeinflussen. &lt;/p&gt; &lt;p class="bodytext"&gt;So brauche ich für meine Plattform-Entwicklungen kürzere Prüfungsintervalle für das Autoupdate. Als Standard ist "Wöchentlich" vorgegeben. Sinnvoller für Anwendungen im Kundenbereich ist aber eine tägliche Prüfung auf Updates. &lt;/p&gt; &lt;p class="bodytext"&gt;Folgender 5-Zeiler im Module-Installer der restored()
      - Methode, löst das Problem, ohne ggf. vom Benutzer eingestellte Werte zu überschreiben &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160; final String AU = "/org/netbeans/modules/autoupdate";&lt;br /&gt;&#160;&#160;&#160; final Preferences root = NbPreferences.root();&lt;br /&gt;&#160;&#160;&#160; if ( root.node (AU).get ("period", null) == null)&#160; {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; root.node (AU).put ("period", "1");&lt;br /&gt;&#160;&#160;&#160; }&lt;/pre&gt; &lt;p class="bodytext"&gt;Dabei
      sind folgende Werte im Quelltext des Autoupdater definiert: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160; public static final int EVERY_STARTUP = 0;&lt;br /&gt;&#160;&#160;&#160; public static final int EVERY_DAY = 1;&lt;br /&gt;&#160;&#160;&#160; public static final int EVERY_WEEK = 2;&lt;br /&gt;&#160;&#160;&#160; public static final int EVERY_2WEEKS = 3;&lt;br /&gt;&#160;&#160;&#160; public static final int EVERY_MONTH = 4;&lt;br /&gt;&#160;&#160;&#160; public static final int NEVER = 5;&lt;/pre&gt;
      &lt;p class="bodytext"&gt;Wenn man schon auf NetBeans 6.1 entwickelt, gibt es noch eine zusätzliche Möglichkeit den Standardwert des Autoupdaters vorzugeben. Man kann das Intervall als System-Eigenschaft dem NetBeans-Launcher mitgeben. Entweder direkt auf der Kommandozeile oder in etc/app.conf (im harness-Ordner): &lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt; &lt;p class="bodytext"&gt;Täglich auf Updates testen: &lt;/p&gt; &lt;pre&gt;-J-Dplugin.manager.check.interval=EVERY_DAY &lt;/pre&gt;
      &lt;p class="bodytext"&gt;Die Konstanten sind (wie oben) EVERY_STARTUP, EVERY_DAY, EVERY_WEEK, EVERY_2WEEKS, EVERY_MONTH oder NEVER. Alternativ kann man auch die Minutenzahl angeben (was im Optionsdialog nicht funktioniert). Alle halbe Stunde auf Updates testen: &lt;/p&gt; &lt;pre&gt;-J-Dplugin.manager.check.interval=30 &lt;/pre&gt; &lt;p class="bodytext"&gt;Wenn man nicht nur auf Updates, sondern auch auf neue Plugins testen möchte, muss man folgende Option setzen (seit NetBeans 6.0): &lt;/p&gt;
      &lt;pre&gt;-J-Dplugin.manager.check.new.plugins=true &lt;/pre&gt; &lt;p class="bodytext"&gt;Dann erscheint der Balloon-Tooltip auch dann, wenn neue Plugins im Update-Center auftauchen, die noch nicht installiert wurden. Das lässt sich natürlich auch im Module-Installer festlegen (was aber nicht zuverlässig funktionieren muss, wenn das Intervall EVERY_STARTUP ist): &lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt; &lt;pre&gt;public void restored() {&lt;br /&gt;&#160; [...]&lt;br /&gt;&#160;
      System.getProperties().put ("plugin.manager.check.new.plugins", "true");&lt;br /&gt;}&lt;/pre&gt; &lt;p class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160; Josch.&lt;/p&gt;</description>
      <pubDate>Fri, 18 Jul 2008 07:05:00 +0000</pubDate>
    </item>
    <item>
      <title>JNBB - Joschs NetBeans Blog: BeanDev: Vorbelegen von Optionseigenschaften des Autoupdater</title>
      <guid isPermaLink="false">http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_vorbelegen_von_optionseigenschaften_des_autoupdater/index.html</guid>
      <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_vorbelegen_von_optionseigenschaften_des_autoupdater/index.html</link>
      <description>&lt;p class="bodytext"&gt;Es ist nur eine Kleinigkeit, aber mit der Umstellung in NetBeans 6.0 von der &lt;a title="NetBeans Optios API (Deprecated)" href="http://bits.netbeans.org/dev/javadoc/org-openide-options/org/openide/options/package-summary.html" target="_blank" class="external-link-new-window"&gt;Options-API&lt;/a&gt; auf die &lt;a title="NetBeans preferences API" href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/doc-files/preferences.html"
      target="_blank" class="external-link-new-window"&gt;Preferences-API&lt;/a&gt; kann man relativ einfach auch Einstellungen fremder Module beeinflussen. &lt;/p&gt; &lt;p class="bodytext"&gt;So brauche ich für meine Plattform-Entwicklungen kürzere Prüfungsintervalle für das Autoupdate. Als Standard ist "Wöchentlich" vorgegeben. Sinnvoller für Anwendungen im Kundenbereich ist aber eine tägliche Prüfung auf Updates. &lt;/p&gt; &lt;p class="bodytext"&gt;Folgender 5-Zeiler im Module-Installer der restored()
      - Methode, löst das Problem, ohne ggf. vom Benutzer eingestellte Werte zu überschreiben &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160; final String AU = "/org/netbeans/modules/autoupdate";&lt;br /&gt;&#160;&#160;&#160; final Preferences root = NbPreferences.root();&lt;br /&gt;&#160;&#160;&#160; if ( root.node (AU).get ("period", null) == null)&#160; {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; root.node (AU).put ("period", "1");&lt;br /&gt;&#160;&#160;&#160; }&lt;/pre&gt; &lt;p class="bodytext"&gt;Dabei
      sind folgende Werte im Quelltext des Autoupdater definiert: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160; public static final int EVERY_STARTUP = 0;&lt;br /&gt;&#160;&#160;&#160; public static final int EVERY_DAY = 1;&lt;br /&gt;&#160;&#160;&#160; public static final int EVERY_WEEK = 2;&lt;br /&gt;&#160;&#160;&#160; public static final int EVERY_2WEEKS = 3;&lt;br /&gt;&#160;&#160;&#160; public static final int EVERY_MONTH = 4;&lt;br /&gt;&#160;&#160;&#160; public static final int NEVER = 5;&lt;/pre&gt;
      &lt;p class="bodytext"&gt;Wenn man schon auf NetBeans 6.1 entwickelt, gibt es noch eine zusätzliche Möglichkeit den Standardwert des Autoupdaters vorzugeben. Man kann das Intervall als System-Eigenschaft dem NetBeans-Launcher mitgeben. Entweder direkt auf der Kommandozeile oder in etc/app.conf (im harness-Ordner): &lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt; &lt;p class="bodytext"&gt;Täglich auf Updates testen: &lt;/p&gt; &lt;pre&gt;-J-Dplugin.manager.check.interval=EVERY_DAY &lt;/pre&gt;
      &lt;p class="bodytext"&gt;Die Konstanten sind (wie oben) EVERY_STARTUP, EVERY_DAY, EVERY_WEEK, EVERY_2WEEKS, EVERY_MONTH oder NEVER. Alternativ kann man auch die Minutenzahl angeben (was im Optionsdialog nicht funktioniert). Alle halbe Stunde auf Updates testen: &lt;/p&gt; &lt;pre&gt;-J-Dplugin.manager.check.interval=30 &lt;/pre&gt; &lt;p class="bodytext"&gt;Wenn man nicht nur auf Updates, sondern auch auf neue Plugins testen möchte, muss man folgende Option setzen (seit NetBeans 6.0): &lt;/p&gt;
      &lt;pre&gt;-J-Dplugin.manager.check.new.plugins=true &lt;/pre&gt; &lt;p class="bodytext"&gt;Dann erscheint der Balloon-Tooltip auch dann, wenn neue Plugins im Update-Center auftauchen, die noch nicht installiert wurden. Das lässt sich natürlich auch im Module-Installer festlegen (was aber nicht zuverlässig funktionieren muss, wenn das Intervall EVERY_STARTUP ist): &lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt; &lt;pre&gt;public void restored() {&lt;br /&gt;&#160; [...]&lt;br /&gt;&#160;
      System.getProperties().put ("plugin.manager.check.new.plugins", "true");&lt;br /&gt;}&lt;/pre&gt; &lt;p class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160; Josch.&lt;/p&gt;</description>
      <pubDate>Fri, 18 Jul 2008 07:05:00 +0000</pubDate>
    </item>
    <item>
      <title>JNBB - Joschs NetBeans Blog: BeanDev: Neustart der NetBeans-Platform</title>
      <guid isPermaLink="false">http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_neustart_der_netbeans_platform/not_cached/index.html</guid>
      <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_neustart_der_netbeans_platform/not_cached/index.html</link>
      <description>&lt;p class="bodytext"&gt;Leider gibt es laut Mailing-Liste keine offizielle Möglichkeit die NetBeans-Plattform aus dem Programm heraus neu zu starten. &lt;/p&gt; &lt;p class="bodytext"&gt;Also muss man sich behelfen und die Sache "zu Fuß" durchziehen. &lt;/p&gt; &lt;p class="bodytext"&gt;Am besten erzeugt man sich mit dem Assistenten eine CallableSystemAction mit dem Namen "SystemRestartAction", setzt sie unter die Kategorie "System", und fügt sie als Global Menu Item im Menü "File"
      hinter den Menüeintrag "Exit" ein. &lt;/p&gt; &lt;p class="bodytext"&gt;Wenn man noch ein schönes Icon hat, kann man es noch im Assistenten hinterlegen, nur ein Tastenkürzel würde ich nicht vergeben. &lt;/p&gt; &lt;p class="bodytext"&gt;Der Assistent erzeugt nun eine Java-Klasse mit dem Namen (wie sollte es anders sein) SystemRestartAction. Nur die performAction-Methode muss noch implementiert werden: &lt;/p&gt; &lt;pre&gt;import java.io.File;&lt;br /&gt;import java.io.FileNotFoundException;&lt;br
      /&gt;import java.io.IOException;&lt;br /&gt;import org.openide.LifecycleManager;&lt;br /&gt;import org.openide.util.Exceptions;&lt;/pre&gt; &lt;pre&gt;&#160; [...]&lt;/pre&gt; &lt;pre&gt;&#160; public void performAction() {&lt;br /&gt;&#160;&#160;&#160; String systemName = NbBundle.getMessage(SystemRestartAction.class, "CTL_SystemFileName");&lt;br /&gt;&#160;&#160;&#160; String homePath = System.getProperty("netbeans.home", ".");&lt;br /&gt;&#160;&#160;&#160; File base = new
      File(homePath).getParentFile();&lt;br /&gt;&#160;&#160;&#160; File bin = new File(base, "bin");&lt;br /&gt;&#160;&#160;&#160; final File execution = new File(bin, systemName);&lt;br /&gt;&#160;&#160;&#160; if ( execution.exists() ) {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; public void run() {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; try {&lt;br
      /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; new ProcessBuilder(execution.getAbsolutePath()).start();&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } catch (IOException ex) {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Exceptions.printStackTrace(ex);&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;
      }));&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; LifecycleManager.getDefault().exit();&lt;br /&gt;&#160;&#160;&#160; } else {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; Exceptions.printStackTrace(new FileNotFoundException ("Can't find the launcher " + execution.getAbsolutePath()));&lt;br /&gt;&#160;&#160;&#160; }&lt;br /&gt;&#160; }&lt;/pre&gt; &lt;p class="bodytext"&gt;Der Bundle.properties-Wert "CTL_SystemFileName" muss den Namen der ausführbaren Launcher-Datei tragen.&#160;Unter Windows und für
      NetBeans wäre das netbeans.exe. Damit sieht man schon die wichtigste Einschränkung dieser Methode: sie ist abhängig von dem installierten Betriebssystem. Das zweite (nicht so gravierende) Problem ist, dass man&#160;wissen muss wie der Launcher heißt. &lt;/p&gt; &lt;p class="bodytext"&gt;Die OS-Abhängigkeit kann man mildern, wenn man per &lt;a title="API-Doc: org.openide.util.Utilities" href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/Utilities.html" target="_blank"
      class="external-link-new-window"&gt;org.openide.util.Utilities&lt;/a&gt; die Betriebssysteme abfragt. Die Methoden wären &lt;a title="API-Doc: isMac" href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/Utilities.html#isMac()" target="_blank" class="external-link-new-window"&gt;isMac()&lt;/a&gt;, &lt;a title="API-Doc: isWindows()" href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/Utilities.html#isWindows()" target="_blank"
      class="external-link-new-window"&gt;isWindows()&lt;/a&gt; und &lt;a title="API-Doc: isUnix" href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/Utilities.html#isUnix()" target="_blank" class="external-link-new-window"&gt;isUnix()&lt;/a&gt;. Wobei man isUnix und isMac zusammenfassen kann, da der Launcher für die beiden Systeme identisch ist. &lt;/p&gt; &lt;p class="bodytext"&gt;Damit könnte man folgende Abfrage realisieren: &lt;/p&gt; &lt;pre&gt; String systemName = &lt;br
      /&gt; NbBundle.getMessage (SystemRestartAction.class, &lt;br /&gt; Utilities.isWindows() &lt;br /&gt; ? "CTL_SystemFileName.Windows" &lt;br /&gt; : "CTL_SystemFileName.MacOrUnix");&lt;/pre&gt; &lt;p class="bodytext"&gt;In der Bundle.properties steht dann für die NetBeans-IDE: &lt;/p&gt; &lt;pre&gt;CTL_SystemFileName.Windows=netbeans.exe&lt;br /&gt;CTL_SystemFileName.MacOrUnix=netbeans&lt;/pre&gt; &lt;p class="bodytext"&gt;Für die eigene Plattform-Anwendung muss man dann natürlich den eigenen
      Applikationsnamen aus der "Standalone Application" nehmen. Das ist in den Projekt-Eigenschaften der Branding-Name im Abschnitt "Build". &lt;/p&gt; &lt;p class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160; Josch. &lt;/p&gt; &lt;pre&gt;&#160;&lt;/pre&gt;</description>
      <pubDate>Mon, 07 Jul 2008 14:54:00 +0000</pubDate>
    </item>
    <item>
      <title>JNBB - Joschs NetBeans Blog: BeanDev: Neustart der NetBeans-Platform</title>
      <guid isPermaLink="false">http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_neustart_der_netbeans_platform/index.html</guid>
      <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_neustart_der_netbeans_platform/index.html</link>
      <description>&lt;p class="bodytext"&gt;Leider gibt es laut Mailing-Liste keine offizielle Möglichkeit die NetBeans-Plattform aus dem Programm heraus neu zu starten. &lt;/p&gt; &lt;p class="bodytext"&gt;Also muss man sich behelfen und die Sache "zu Fuß" durchziehen. &lt;/p&gt; &lt;p class="bodytext"&gt;Am besten erzeugt man sich mit dem Assistenten eine CallableSystemAction mit dem Namen "SystemRestartAction", setzt sie unter die Kategorie "System", und fügt sie als Global Menu Item im Menü "File"
      hinter den Menüeintrag "Exit" ein. &lt;/p&gt; &lt;p class="bodytext"&gt;Wenn man noch ein schönes Icon hat, kann man es noch im Assistenten hinterlegen, nur ein Tastenkürzel würde ich nicht vergeben. &lt;/p&gt; &lt;p class="bodytext"&gt;Der Assistent erzeugt nun eine Java-Klasse mit dem Namen (wie sollte es anders sein) SystemRestartAction. Nur die performAction-Methode muss noch implementiert werden: &lt;/p&gt; &lt;pre&gt;import java.io.File;&lt;br /&gt;import java.io.FileNotFoundException;&lt;br
      /&gt;import java.io.IOException;&lt;br /&gt;import org.openide.LifecycleManager;&lt;br /&gt;import org.openide.util.Exceptions;&lt;/pre&gt; &lt;pre&gt;&#160; [...]&lt;/pre&gt; &lt;pre&gt;&#160; public void performAction() {&lt;br /&gt;&#160;&#160;&#160; String systemName = NbBundle.getMessage(SystemRestartAction.class, "CTL_SystemFileName");&lt;br /&gt;&#160;&#160;&#160; String homePath = System.getProperty("netbeans.home", ".");&lt;br /&gt;&#160;&#160;&#160; File base = new
      File(homePath).getParentFile();&lt;br /&gt;&#160;&#160;&#160; File bin = new File(base, "bin");&lt;br /&gt;&#160;&#160;&#160; final File execution = new File(bin, systemName);&lt;br /&gt;&#160;&#160;&#160; if ( execution.exists() ) {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; public void run() {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; try {&lt;br
      /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; new ProcessBuilder(execution.getAbsolutePath()).start();&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } catch (IOException ex) {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Exceptions.printStackTrace(ex);&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;
      }));&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; LifecycleManager.getDefault().exit();&lt;br /&gt;&#160;&#160;&#160; } else {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; Exceptions.printStackTrace(new FileNotFoundException ("Can't find the launcher " + execution.getAbsolutePath()));&lt;br /&gt;&#160;&#160;&#160; }&lt;br /&gt;&#160; }&lt;/pre&gt; &lt;p class="bodytext"&gt;Der Bundle.properties-Wert "CTL_SystemFileName" muss den Namen der ausführbaren Launcher-Datei tragen.&#160;Unter Windows und für
      NetBeans wäre das netbeans.exe. Damit sieht man schon die wichtigste Einschränkung dieser Methode: sie ist abhängig von dem installierten Betriebssystem. Das zweite (nicht so gravierende) Problem ist, dass man&#160;wissen muss wie der Launcher heißt. &lt;/p&gt; &lt;p class="bodytext"&gt;Die OS-Abhängigkeit kann man mildern, wenn man per &lt;a title="API-Doc: org.openide.util.Utilities" href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/Utilities.html" target="_blank"
      class="external-link-new-window"&gt;org.openide.util.Utilities&lt;/a&gt; die Betriebssysteme abfragt. Die Methoden wären &lt;a title="API-Doc: isMac" href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/Utilities.html#isMac()" target="_blank" class="external-link-new-window"&gt;isMac()&lt;/a&gt;, &lt;a title="API-Doc: isWindows()" href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/Utilities.html#isWindows()" target="_blank"
      class="external-link-new-window"&gt;isWindows()&lt;/a&gt; und &lt;a title="API-Doc: isUnix" href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/Utilities.html#isUnix()" target="_blank" class="external-link-new-window"&gt;isUnix()&lt;/a&gt;. Wobei man isUnix und isMac zusammenfassen kann, da der Launcher für die beiden Systeme identisch ist. &lt;/p&gt; &lt;p class="bodytext"&gt;Damit könnte man folgende Abfrage realisieren: &lt;/p&gt; &lt;pre&gt; String systemName = &lt;br
      /&gt; NbBundle.getMessage (SystemRestartAction.class, &lt;br /&gt; Utilities.isWindows() &lt;br /&gt; ? "CTL_SystemFileName.Windows" &lt;br /&gt; : "CTL_SystemFileName.MacOrUnix");&lt;/pre&gt; &lt;p class="bodytext"&gt;In der Bundle.properties steht dann für die NetBeans-IDE: &lt;/p&gt; &lt;pre&gt;CTL_SystemFileName.Windows=netbeans.exe&lt;br /&gt;CTL_SystemFileName.MacOrUnix=netbeans&lt;/pre&gt; &lt;p class="bodytext"&gt;Für die eigene Plattform-Anwendung muss man dann natürlich den eigenen
      Applikationsnamen aus der "Standalone Application" nehmen. Das ist in den Projekt-Eigenschaften der Branding-Name im Abschnitt "Build". &lt;/p&gt; &lt;p class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160; Josch. &lt;/p&gt; &lt;pre&gt;&#160;&lt;/pre&gt;</description>
      <pubDate>Mon, 07 Jul 2008 14:54:00 +0000</pubDate>
    </item>
    <item>
      <title>JNBB - Joschs NetBeans Blog: BeanDev: Branding - Shortcuts oder Keymap?</title>
      <guid isPermaLink="false">http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_branding_shortcuts_oder_keymap/not_cached/index.html</guid>
      <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_branding_shortcuts_oder_keymap/not_cached/index.html</link>
      <description>&lt;p class="bodytext"&gt;Der deklarative Ansatz, die NetBeans-Plattform zu konfigurieren ist sehr praktisch, hat aber auch so seine Tücken. Der Vorteil ist unbestreitbar. Ohne die compilierten Class-Dateien anfassen zu müssen, kann man in XML- und Bundle-Dateien alle "Branding"-Arbeiten durchführen. Allerdings gibt es inzwischen recht verstreute Einrichtungsmöglichkeiten und sind teilweise auch als historisch zu bezeichnen. &lt;/p&gt; &lt;p class="bodytext"&gt;Ein Bereich sind die
      Tastenkürzel, die man Aktionen der NetBeans-Oberfläche zuweisen kann. Ein populärer Bereich ist, in der layer.xml, der Shortcuts-Folder. &lt;/p&gt; &lt;p class="bodytext"&gt;Zunächst benötigt man natürlich eine Action-Klasse, die selbst im Actions-Abschnitt deklariert sein sollte: &lt;/p&gt; &lt;pre&gt;&amp;lt;filesystem&gt;&lt;br /&gt;&#160;&#160;&#160; &amp;lt;folder name="Actions"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;folder name="Window"&gt;&lt;br /&gt;&#160; &#160;
      &#160; &#160; &#160; &#160; &amp;lt;file name="de-sepix-demo-QueryAction.instance"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &#160; &amp;lt;/folder&gt;&lt;br /&gt;&#160;&#160;&#160; &amp;lt;/folder&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Nun kann man im Shortcuts-Folder ein Tastenkürzel zuweisen: &lt;/p&gt; &lt;pre&gt;&#160; &#160; &amp;lt;folder name="Shortcuts"&gt;&lt;br /&gt;&#160; &#160; &#160; &#160; &amp;lt;file name="CS-Q.instance­"&gt;&lt;br /&gt;&#160; &#160; &#160; &#160; &#160;
      &#160; &amp;lt;attr name="instanceClass­"&lt;br /&gt;&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; stringvalue="de.sepix.demo.QueryAction"/&gt;&lt;br /&gt;&#160; &#160; &#160; &#160; &amp;lt;/file&gt;&lt;br /&gt;&#160; &#160; &amp;lt;/folder&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Somit ist Strg+Umschalt+Q der Aktion "QueryAction" zugewiesen. Die eingentümliche Syntax für das Tastenkürzel wird in &lt;a title="Utilities.stringToKey"
      href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/Utilities.html#stringToKey%28java.lang.String%29" target="_blank" class="external-link-new-window"&gt;Utilities.stringToKey&lt;/a&gt; beschrieben. &lt;/p&gt; &lt;p class="bodytext"&gt;Allerdings hat dieses Verfahren einige Nachteile. Das Tastenkürzel ist global einmalig zugewiesen (kann&#160;also nicht Tastatur-Profilen zugewiesen werden) und wird für den Anwender nicht sichtbar im Menü angezeigt.&#160; &lt;/p&gt; &lt;p
      class="bodytext"&gt;Wenn man nämlich die QueryAction (hier z.B.) im&#160;Window-Menü einfügt: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160; &amp;lt;folder name="Menu"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;folder name="Window"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;file name="QueryAction.shadow"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;attr
      name="originalFile" &lt;br /&gt;&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; stringvalue=&lt;br /&gt;&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; "Actions/Window/de-sepix-demo-QueryAction.instance"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;/file&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;erscheint zwar der Menüeintrag, aber ohne die Tastenkürzel-Information, dass der Anwender die Eintrag
      auch per Strg+Umschalt+Q aufrufen kann. &lt;/p&gt; &lt;p class="bodytext"&gt;Eine schönere Methode ist es, dem Anwender die Tastenkürzel über Keymaps zur Verfügung zu stellen. Damit kann der Nutzer die Tastenkürzel bequem im Options-Dialog verwalten und sieht diese auch immer in den Menüs zugewiesen: &lt;/p&gt; &lt;pre&gt;&#160; &#160; &amp;lt;folder name="Keymaps"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;folder name="Sepix"&gt;&lt;br
      /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;file name="CS-Q.shadow"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;attr name="originalFile" &lt;br /&gt; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160; stringvalue="Actions/Window/de-sepix-demo-QueryAction.instance"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
      &amp;lt;/file&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;&#160; &#160; &#160; &#160; &#160;&#160; &lt;br /&gt;Nun erscheint automatisch im Options-Dialog zusätzlich zur NetBeans-Keymap auch die Sepix-Keymap. &lt;/p&gt; &lt;p class="bodytext"&gt;Aber der Anwender muss erst explizit die Keymap "Sepix" auswählen. Aber auch das kann man vorgeben: &lt;/p&gt; &lt;pre&gt;&#160; &#160; &amp;lt;folder name="Keymaps"&gt;&lt;br /&gt; &amp;lt;attr name="currentKeymap" stringvalue="Sepix"/&gt;&lt;br
      /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;folder name="Sepix"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;file name="CS-Q.shadow"&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Mit dem Attribut "currentKeymap" wird die Standard-Keymap vorbelegt. &lt;/p&gt; &lt;p class="bodytext"&gt;Will man beim Brandig die NetBeans-Keymap vor dem Anwender verstecken, nutzt man dafür das Standard-Verfahren: &lt;/p&gt; &lt;pre&gt;&#160; &#160; &amp;lt;folder
      name="Keymaps"&gt;&lt;br /&gt; &amp;lt;folder name="NetBeans_hidden"/&gt;&lt;br /&gt; &amp;lt;attr name="currentKeymap" stringvalue="Sepix"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;folder name="Sepix"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;file name="CS-Q.shadow"&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Mit diesem Verfahren kann man für den Anwender bequem zu verwaltende Tastaturkürzel einrichten. &lt;/p&gt; &lt;p
      class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160; Josch. &lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt;</description>
      <pubDate>Wed, 02 Jul 2008 07:23:00 +0000</pubDate>
    </item>
    <item>
      <title>JNBB - Joschs NetBeans Blog: BeanDev: Branding - Shortcuts oder Keymap?</title>
      <guid isPermaLink="false">http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_branding_shortcuts_oder_keymap/index.html</guid>
      <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_branding_shortcuts_oder_keymap/index.html</link>
      <description>&lt;p class="bodytext"&gt;Der deklarative Ansatz, die NetBeans-Plattform zu konfigurieren ist sehr praktisch, hat aber auch so seine Tücken. Der Vorteil ist unbestreitbar. Ohne die compilierten Class-Dateien anfassen zu müssen, kann man in XML- und Bundle-Dateien alle "Branding"-Arbeiten durchführen. Allerdings gibt es inzwischen recht verstreute Einrichtungsmöglichkeiten und sind teilweise auch als historisch zu bezeichnen. &lt;/p&gt; &lt;p class="bodytext"&gt;Ein Bereich sind die
      Tastenkürzel, die man Aktionen der NetBeans-Oberfläche zuweisen kann. Ein populärer Bereich ist, in der layer.xml, der Shortcuts-Folder. &lt;/p&gt; &lt;p class="bodytext"&gt;Zunächst benötigt man natürlich eine Action-Klasse, die selbst im Actions-Abschnitt deklariert sein sollte: &lt;/p&gt; &lt;pre&gt;&amp;lt;filesystem&gt;&lt;br /&gt;&#160;&#160;&#160; &amp;lt;folder name="Actions"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;folder name="Window"&gt;&lt;br /&gt;&#160; &#160;
      &#160; &#160; &#160; &#160; &amp;lt;file name="de-sepix-demo-QueryAction.instance"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &#160; &amp;lt;/folder&gt;&lt;br /&gt;&#160;&#160;&#160; &amp;lt;/folder&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Nun kann man im Shortcuts-Folder ein Tastenkürzel zuweisen: &lt;/p&gt; &lt;pre&gt;&#160; &#160; &amp;lt;folder name="Shortcuts"&gt;&lt;br /&gt;&#160; &#160; &#160; &#160; &amp;lt;file name="CS-Q.instance­"&gt;&lt;br /&gt;&#160; &#160; &#160; &#160; &#160;
      &#160; &amp;lt;attr name="instanceClass­"&lt;br /&gt;&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; stringvalue="de.sepix.demo.QueryAction"/&gt;&lt;br /&gt;&#160; &#160; &#160; &#160; &amp;lt;/file&gt;&lt;br /&gt;&#160; &#160; &amp;lt;/folder&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Somit ist Strg+Umschalt+Q der Aktion "QueryAction" zugewiesen. Die eingentümliche Syntax für das Tastenkürzel wird in &lt;a title="Utilities.stringToKey"
      href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/Utilities.html#stringToKey%28java.lang.String%29" target="_blank" class="external-link-new-window"&gt;Utilities.stringToKey&lt;/a&gt; beschrieben. &lt;/p&gt; &lt;p class="bodytext"&gt;Allerdings hat dieses Verfahren einige Nachteile. Das Tastenkürzel ist global einmalig zugewiesen (kann&#160;also nicht Tastatur-Profilen zugewiesen werden) und wird für den Anwender nicht sichtbar im Menü angezeigt.&#160; &lt;/p&gt; &lt;p
      class="bodytext"&gt;Wenn man nämlich die QueryAction (hier z.B.) im&#160;Window-Menü einfügt: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160; &amp;lt;folder name="Menu"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;folder name="Window"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;file name="QueryAction.shadow"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;attr
      name="originalFile" &lt;br /&gt;&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; stringvalue=&lt;br /&gt;&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; "Actions/Window/de-sepix-demo-QueryAction.instance"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;/file&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;erscheint zwar der Menüeintrag, aber ohne die Tastenkürzel-Information, dass der Anwender die Eintrag
      auch per Strg+Umschalt+Q aufrufen kann. &lt;/p&gt; &lt;p class="bodytext"&gt;Eine schönere Methode ist es, dem Anwender die Tastenkürzel über Keymaps zur Verfügung zu stellen. Damit kann der Nutzer die Tastenkürzel bequem im Options-Dialog verwalten und sieht diese auch immer in den Menüs zugewiesen: &lt;/p&gt; &lt;pre&gt;&#160; &#160; &amp;lt;folder name="Keymaps"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;folder name="Sepix"&gt;&lt;br
      /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;file name="CS-Q.shadow"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;attr name="originalFile" &lt;br /&gt; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160; stringvalue="Actions/Window/de-sepix-demo-QueryAction.instance"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
      &amp;lt;/file&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;&#160; &#160; &#160; &#160; &#160;&#160; &lt;br /&gt;Nun erscheint automatisch im Options-Dialog zusätzlich zur NetBeans-Keymap auch die Sepix-Keymap. &lt;/p&gt; &lt;p class="bodytext"&gt;Aber der Anwender muss erst explizit die Keymap "Sepix" auswählen. Aber auch das kann man vorgeben: &lt;/p&gt; &lt;pre&gt;&#160; &#160; &amp;lt;folder name="Keymaps"&gt;&lt;br /&gt; &amp;lt;attr name="currentKeymap" stringvalue="Sepix"/&gt;&lt;br
      /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;folder name="Sepix"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;file name="CS-Q.shadow"&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Mit dem Attribut "currentKeymap" wird die Standard-Keymap vorbelegt. &lt;/p&gt; &lt;p class="bodytext"&gt;Will man beim Brandig die NetBeans-Keymap vor dem Anwender verstecken, nutzt man dafür das Standard-Verfahren: &lt;/p&gt; &lt;pre&gt;&#160; &#160; &amp;lt;folder
      name="Keymaps"&gt;&lt;br /&gt; &amp;lt;folder name="NetBeans_hidden"/&gt;&lt;br /&gt; &amp;lt;attr name="currentKeymap" stringvalue="Sepix"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;folder name="Sepix"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;file name="CS-Q.shadow"&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Mit diesem Verfahren kann man für den Anwender bequem zu verwaltende Tastaturkürzel einrichten. &lt;/p&gt; &lt;p
      class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160; Josch. &lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt;</description>
      <pubDate>Wed, 02 Jul 2008 07:23:00 +0000</pubDate>
    </item>
    <item>
      <title>JNBB - Joschs NetBeans Blog: BeanDev: NodeAction und Selection Management</title>
      <guid isPermaLink="false">http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_nodeaction_und_selection_management/not_cached/index.html</guid>
      <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_nodeaction_und_selection_management/not_cached/index.html</link>
      <description>&lt;p class="bodytext"&gt;Eine nette Klasse, um Nodes mit Aktionen zu versehen ist die NodeAction-Klasse. Und soweit man sich an die Standard-Tutorials hält, wird man erstmal keine Probleme haben - insbesondere wenn sich alles in einem View innerhalb TopComponent läuft. &lt;/p&gt; &lt;p class="bodytext"&gt;NodeAction funktioniert aber nur, wenn das zugeordnete Modell des ExplorerManager mit dem Selection Management der NetBeans Plattform verknüpft ist. Dabei ist es letztendlich
      irrelevant, ob z.B. ein BeanTreeView-Eintrag visuell markiert ist. Wenn der ExplorerManager von seiner Umwelt abgeschnitten ist, klappt es nicht mit einer NodeAction. &lt;/p&gt; &lt;p class="bodytext"&gt;Sehr schnell bekommt man das mit, wenn man ein ExplorerManager und zugehöriges View in einer schlichten Panel-Komponente hat. Zwar funktioniert alles erstmal wie erwartet, sogar NodeActions die per &lt;/p&gt; &lt;pre&gt;&#160; @Override&lt;br /&gt;&#160; public Action[] getActions(boolean context)
      {&lt;br /&gt;&#160; &#160; return new Action[] {myNodeAction}&lt;br /&gt;&#160; }&lt;br /&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;an einen Knoten gebunden werden, zeigen sich im Popup, sind aktiv und werden sogar ausgeführt. &lt;/p&gt; &lt;p class="bodytext"&gt;Leider stellt man dann im Debugger fest, dass das übergebene Node-Array in der performAction-Methode immer leer ist. &lt;/p&gt; &lt;pre&gt;&#160; &#160; @Override&lt;br /&gt;&#160;&#160;&#160; protected void performAction(Node[] nodes)
      {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; for (Node node : nodes) {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if ( node.canDestroy() ) {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Node parent = node.getParentNode();&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; parent.getChildren().remove(new Node[]{node});&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; }&lt;br /&gt;&#160;&#160;&#160;
      }&lt;/pre&gt; &lt;p class="bodytext"&gt;Obige performAction-Methode würde nie etwas ausführen. &lt;/p&gt; &lt;p class="bodytext"&gt;Wie bekommt man aber nun NodeAction dazu, zu erkennen, welche Knoten im ExplorerManager ausgewählt wurden? &lt;/p&gt; &lt;p class="bodytext"&gt;Hier eine Möglichkeit: &lt;/p&gt; &lt;p class="bodytext"&gt;Das Panel sollte das Interface Lookup.Provider implementieren und, ähnlich wie in den Tutorials zu TopComponents, ein Lookup (generiert aus einem ExplorerManager)
      zurückgeben: &lt;/p&gt; &lt;pre&gt;public class MyTestPanel extends JPanel &lt;br /&gt;&#160; &#160; &#160; &#160; &#160; implements ExplorerManager.Provider, Loopup.Provider {&lt;br /&gt;&#160; private ExplorerManager myNodeModel = new ExplorerManager();&lt;br /&gt;&#160; private BeanTreeView tree = new BeanTreeView();&lt;br /&gt;&#160; private Lookup lookup;&lt;br /&gt;&#160; public MyTestPanel () {&lt;br /&gt;&#160; &#160; initComponents();&lt;br /&gt;&#160; &#160; myNodeModel = new
      ExplorerManager();&lt;br /&gt;&#160; &#160; lookup = ExplorerUtils.createLookup(explorerManager, new ActionMap());&lt;br /&gt;&#160; &#160; myNodeModel .setRootContext(new MyRootNode());&lt;br /&gt;&#160; }&lt;br /&gt;&lt;br /&gt;&#160; public ExplorerManager getExplorerManager() {&lt;br /&gt;&#160;&#160;&#160; return myNodeModel;&lt;br /&gt;&#160; }&lt;br /&gt;&lt;br /&gt;&#160; public Lookup getLookup() {&lt;br /&gt;&#160;&#160;&#160; return lookup;&lt;br /&gt;&#160; }&lt;br /&gt;&#160; [...]&lt;br
      /&gt;}&lt;/pre&gt; &lt;p class="bodytext"&gt;Das BeanTreeView benötigt das Interface ExplorerManager.Provider, ansonsten hat das View kein Model. Die Implementation von Lookup.Provider nutzen wir nun in der TopComponent, in der wir unser TestPanel einfügen: &lt;/p&gt; &lt;pre&gt;public class TestTopComponent extends TopComponent {&lt;br /&gt;&#160; TestPanel tp = new TestPanel();&lt;br /&gt;&#160;&#160;public TestTopComponent() {&lt;br /&gt;&#160; &#160; add (tp);&lt;br /&gt;&#160; &#160;
      associateLookup(tp.getLookup()));&lt;br /&gt;&#160; } &lt;br /&gt;}&lt;/pre&gt; &lt;p class="bodytext"&gt;Das war es auch schon, der Rest läuft automatisch. Die Methode associateLookup reicht das erzeugte Lookup aus unserem Panel durch die getLookup-Methode von TestTopComponent heraus (getLookup ist schon in TopComponent implementiert).&#160; &lt;/p&gt; &lt;p class="bodytext"&gt;Es wird aber die Regel sein, dass TopComponents eigene Lookups benötigen oder gar mehrere Panels mit Lookups nutzen. Dabei
      hilft aber ProxyLookup: &lt;/p&gt; &lt;pre&gt;public class TestTopComponent extends TopComponent {&lt;br /&gt; TestPanel tp = new TestPanel();&lt;br /&gt;&#160; InstanceContent content = new InstanceContent();&lt;br /&gt;&#160; public TestTopComponent() {&lt;br /&gt;&#160; &#160; add (tp);&lt;br /&gt;&#160; &#160; associateLookup(&lt;br /&gt;&#160; &#160; &#160; new ProxyLookup (&lt;br /&gt;&#160; &#160; &#160; &#160; new AbstractLookup (instanceContent), &lt;br /&gt;&#160; &#160; &#160; &#160;
      tp.getLookup())&lt;br /&gt;&#160; &#160; );&lt;br /&gt;&#160; } &lt;br /&gt;}&lt;/pre&gt; &lt;p class="bodytext"&gt;Jetzt kann man selber in content seine Objekte speichern, die man global zur Verfügung stellen will und verliert nicht die Verbindung&#160;zu den selektierten Nodes in TestPanel. &lt;/p&gt; &lt;p class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160; Josch.&lt;br /&gt;&lt;/p&gt;</description>
      <pubDate>Fri, 27 Jun 2008 06:05:00 +0000</pubDate>
    </item>
    <item>
      <title>JNBB - Joschs NetBeans Blog: BeanDev: NodeAction und Selection Management</title>
      <guid isPermaLink="false">http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_nodeaction_und_selection_management/index.html</guid>
      <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_nodeaction_und_selection_management/index.html</link>
      <description>&lt;p class="bodytext"&gt;Eine nette Klasse, um Nodes mit Aktionen zu versehen ist die NodeAction-Klasse. Und soweit man sich an die Standard-Tutorials hält, wird man erstmal keine Probleme haben - insbesondere wenn sich alles in einem View innerhalb TopComponent läuft. &lt;/p&gt; &lt;p class="bodytext"&gt;NodeAction funktioniert aber nur, wenn das zugeordnete Modell des ExplorerManager mit dem Selection Management der NetBeans Plattform verknüpft ist. Dabei ist es letztendlich
      irrelevant, ob z.B. ein BeanTreeView-Eintrag visuell markiert ist. Wenn der ExplorerManager von seiner Umwelt abgeschnitten ist, klappt es nicht mit einer NodeAction. &lt;/p&gt; &lt;p class="bodytext"&gt;Sehr schnell bekommt man das mit, wenn man ein ExplorerManager und zugehöriges View in einer schlichten Panel-Komponente hat. Zwar funktioniert alles erstmal wie erwartet, sogar NodeActions die per &lt;/p&gt; &lt;pre&gt;&#160; @Override&lt;br /&gt;&#160; public Action[] getActions(boolean context)
      {&lt;br /&gt;&#160; &#160; return new Action[] {myNodeAction}&lt;br /&gt;&#160; }&lt;br /&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;an einen Knoten gebunden werden, zeigen sich im Popup, sind aktiv und werden sogar ausgeführt. &lt;/p&gt; &lt;p class="bodytext"&gt;Leider stellt man dann im Debugger fest, dass das übergebene Node-Array in der performAction-Methode immer leer ist. &lt;/p&gt; &lt;pre&gt;&#160; &#160; @Override&lt;br /&gt;&#160;&#160;&#160; protected void performAction(Node[] nodes)
      {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; for (Node node : nodes) {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if ( node.canDestroy() ) {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Node parent = node.getParentNode();&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; parent.getChildren().remove(new Node[]{node});&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; }&lt;br /&gt;&#160;&#160;&#160;
      }&lt;/pre&gt; &lt;p class="bodytext"&gt;Obige performAction-Methode würde nie etwas ausführen. &lt;/p&gt; &lt;p class="bodytext"&gt;Wie bekommt man aber nun NodeAction dazu, zu erkennen, welche Knoten im ExplorerManager ausgewählt wurden? &lt;/p&gt; &lt;p class="bodytext"&gt;Hier eine Möglichkeit: &lt;/p&gt; &lt;p class="bodytext"&gt;Das Panel sollte das Interface Lookup.Provider implementieren und, ähnlich wie in den Tutorials zu TopComponents, ein Lookup (generiert aus einem ExplorerManager)
      zurückgeben: &lt;/p&gt; &lt;pre&gt;public class MyTestPanel extends JPanel &lt;br /&gt;&#160; &#160; &#160; &#160; &#160; implements ExplorerManager.Provider, Loopup.Provider {&lt;br /&gt;&#160; private ExplorerManager myNodeModel = new ExplorerManager();&lt;br /&gt;&#160; private BeanTreeView tree = new BeanTreeView();&lt;br /&gt;&#160; private Lookup lookup;&lt;br /&gt;&#160; public MyTestPanel () {&lt;br /&gt;&#160; &#160; initComponents();&lt;br /&gt;&#160; &#160; myNodeModel = new
      ExplorerManager();&lt;br /&gt;&#160; &#160; lookup = ExplorerUtils.createLookup(explorerManager, new ActionMap());&lt;br /&gt;&#160; &#160; myNodeModel .setRootContext(new MyRootNode());&lt;br /&gt;&#160; }&lt;br /&gt;&lt;br /&gt;&#160; public ExplorerManager getExplorerManager() {&lt;br /&gt;&#160;&#160;&#160; return myNodeModel;&lt;br /&gt;&#160; }&lt;br /&gt;&lt;br /&gt;&#160; public Lookup getLookup() {&lt;br /&gt;&#160;&#160;&#160; return lookup;&lt;br /&gt;&#160; }&lt;br /&gt;&#160; [...]&lt;br
      /&gt;}&lt;/pre&gt; &lt;p class="bodytext"&gt;Das BeanTreeView benötigt das Interface ExplorerManager.Provider, ansonsten hat das View kein Model. Die Implementation von Lookup.Provider nutzen wir nun in der TopComponent, in der wir unser TestPanel einfügen: &lt;/p&gt; &lt;pre&gt;public class TestTopComponent extends TopComponent {&lt;br /&gt;&#160; TestPanel tp = new TestPanel();&lt;br /&gt;&#160;&#160;public TestTopComponent() {&lt;br /&gt;&#160; &#160; add (tp);&lt;br /&gt;&#160; &#160;
      associateLookup(tp.getLookup()));&lt;br /&gt;&#160; } &lt;br /&gt;}&lt;/pre&gt; &lt;p class="bodytext"&gt;Das war es auch schon, der Rest läuft automatisch. Die Methode associateLookup reicht das erzeugte Lookup aus unserem Panel durch die getLookup-Methode von TestTopComponent heraus (getLookup ist schon in TopComponent implementiert).&#160; &lt;/p&gt; &lt;p class="bodytext"&gt;Es wird aber die Regel sein, dass TopComponents eigene Lookups benötigen oder gar mehrere Panels mit Lookups nutzen. Dabei
      hilft aber ProxyLookup: &lt;/p&gt; &lt;pre&gt;public class TestTopComponent extends TopComponent {&lt;br /&gt; TestPanel tp = new TestPanel();&lt;br /&gt;&#160; InstanceContent content = new InstanceContent();&lt;br /&gt;&#160; public TestTopComponent() {&lt;br /&gt;&#160; &#160; add (tp);&lt;br /&gt;&#160; &#160; associateLookup(&lt;br /&gt;&#160; &#160; &#160; new ProxyLookup (&lt;br /&gt;&#160; &#160; &#160; &#160; new AbstractLookup (instanceContent), &lt;br /&gt;&#160; &#160; &#160; &#160;
      tp.getLookup())&lt;br /&gt;&#160; &#160; );&lt;br /&gt;&#160; } &lt;br /&gt;}&lt;/pre&gt; &lt;p class="bodytext"&gt;Jetzt kann man selber in content seine Objekte speichern, die man global zur Verfügung stellen will und verliert nicht die Verbindung&#160;zu den selektierten Nodes in TestPanel. &lt;/p&gt; &lt;p class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160; Josch.&lt;br /&gt;&lt;/p&gt;</description>
      <pubDate>Fri, 27 Jun 2008 06:05:00 +0000</pubDate>
    </item>
    <item>
      <title>JNBB - Joschs NetBeans Blog: BeanDev: Minimaler Einsatz für Drag and Drop von Nodes</title>
      <guid isPermaLink="false">http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_minimaler_einsatz_fuer_drag_and_drop_von_nodes/not_cached/index.html</guid>
      <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_minimaler_einsatz_fuer_drag_and_drop_von_nodes/not_cached/index.html</link>
      <description>&lt;p class="bodytext"&gt;Es funktioniert fast überall in den aktuellen Versionen der NetBeans IDE: Man kann in den Baumansichten die Elemente anklicken und mit gehaltener linker Maustaste an eine andere Position verschieben. &lt;/p&gt; &lt;p class="bodytext"&gt;Wenn man das auch für die eigenen BeanTreeView-Komponenten haben will, muss man ein paar Methoden implementieren bzw. überschreiben, damit das funktioniert. &lt;/p&gt; &lt;p class="bodytext"&gt;In diesem "Kochrezept" habe ich ein
      sehr einfaches Modell gewählt, nur einen Root-Node mit einer einfachen Hierachie. Der Root-Node kann sogar ausgeblendet werden. &lt;/p&gt; &lt;p class="bodytext"&gt;Man erzeugt&#160;ein JPanel oder TopComponent und implementiert&#160; ExplorerManager.Provider. Die Methode getExplorerManager liefert einen Standard-ExplorerManager: &lt;/p&gt; &lt;pre&gt;public class Test extends ToComponent &lt;br /&gt; implements ExplorerManager.Provider {&lt;br /&gt;&#160; private ExplorerManager em = new
      ExplorerManager();&lt;br /&gt;&#160; public Test() {&lt;br /&gt;&#160; &#160; super();&lt;br /&gt;&#160; &#160; initComponenents();&lt;br /&gt;&#160; &#160; getExplorerManager().setRootContextNode (new RootNode());&lt;br /&gt;&#160; }&lt;br /&gt;&lt;br /&gt;&#160; public ExplorerManager getExplorerManager() {&lt;br /&gt;&#160; &#160; return em;&lt;br /&gt;&#160; }&lt;br /&gt;&lt;br /&gt;&#160; // ...&lt;br /&gt;}&lt;/pre&gt; &lt;p class="bodytext"&gt;In initComponents() fügt man dieser Komponente
      z.B. einem BeanTreeView hinzu, damit man überhaupt etwas von diesem Beispiel hat.&lt;br /&gt;&lt;br /&gt;Nun benötigen wir die Klasse RootNode, die von AbstractNode abgeleitet wird und ein spezielles Children-Object an AbstractNode weiterreicht.&#160;Dies ist die erste Vorraussetzung, damit die untergeordneten Nodes überhaupt eine benutzerdefinierte Reihenfolge erhalten: &lt;/p&gt; &lt;pre&gt;public class RootNode extends AbstractNode {&lt;br /&gt;&#160; public RootNode() {&lt;br
      /&gt;&#160;&#160;&#160; super (new RootChildren());&lt;br /&gt;&#160; }&lt;br /&gt;}&lt;/pre&gt; &lt;p class="bodytext"&gt;Zwar ist RootNode noch nicht fertig, aber werfen wir mal einen Blick auf RootChildren: &lt;/p&gt; &lt;pre&gt;public class RootChildren extends Index.ArrayChildren{&lt;br /&gt;&#160; public RootChildren() {&lt;br /&gt;&#160;&#160;&#160; super();&lt;br /&gt;&#160; }&lt;br /&gt;}&lt;/pre&gt; &lt;p class="bodytext"&gt;Natürlich hätte oben in RootNode auch ein super (new
      Index.ArrayChildren()); gereicht (zumal RootChildren schon fertig ist), aber wenn man das für eigene Projekte erweitern will, ist es besser man hat eine größere Kontrolle über das Children-Modell. &lt;/p&gt; &lt;p class="bodytext"&gt;Index.ArrayChildren implementiert alle Verwaltungsaufgaben, um Positionen von Knoten zu managen. Das Drag and Drop UI der Views benötigen diese Implementation, um die Knoten anhand von Anwenderaktionen anzuordnen. &lt;/p&gt; &lt;p class="bodytext"&gt;Bis jetzt wurde also
      erst die Wurzel des Baumes definiert, und wie die untergeordneten Knoten im Container (Index.ArrayChildren) dieser RootNode gehalten werden. &lt;/p&gt; &lt;p class="bodytext"&gt;Jetzt also zu den ChildNodes: &lt;/p&gt; &lt;pre&gt;public class ChildNode extends AbstractNode {&lt;br /&gt;&#160; private InstanceContent content;&lt;br /&gt;&lt;br /&gt;&#160; public ChildNode (NodeData data) {&lt;br /&gt;&#160;&#160;&#160; this (data, new InstanceContent());&lt;br /&gt;&#160; }&lt;br /&gt;&#160; &lt;br
      /&gt;&#160; public ChildNode (NodeData data, InstanceContent content) {&lt;br /&gt;&#160;&#160;&#160; super (Children.LEAF, new AbstractLookup (content));&lt;br /&gt;&#160;&#160;&#160; this.content = content;&lt;br /&gt;&#160;&#160;&#160; content.add(data);&lt;br /&gt;&#160; }&lt;br /&gt;&lt;br /&gt;&#160; public NodeData getData() {&lt;br /&gt;&#160;&#160;&#160; return getLookup().lookup(NodeData.class);&lt;br /&gt;&#160; }&lt;br /&gt;}&lt;/pre&gt; &lt;p class="bodytext"&gt;Die obigen Konstruktoren
      entsprechen meinem Lieblingsaufbau von Nodes, die nur im Arbeitsspeicher gehalten werden. Das ist keine Vorraussetzung, um die Knoten per Drag and Drop zu verschieben. &lt;/p&gt; &lt;p class="bodytext"&gt;Allerdings muss nun noch folgende Methode ChildNode hinzugefügt werden: &lt;/p&gt; &lt;pre&gt;&#160; @Override&lt;br /&gt;&#160; public boolean canCut() {&lt;br /&gt;&#160;&#160;&#160; return true;&lt;br /&gt;&#160; }&lt;/pre&gt; &lt;p class="bodytext"&gt;Wenn ChildNode bei canCut immer false
      zurückgibt (und das ist in AbstractNode so festgelegt), funktioniert schon der erste Drag-Schritt nicht. In NetBeans wird Drag and Drop im Prinzip als Cut and Paste abgebildet. &lt;/p&gt; &lt;p class="bodytext"&gt;Damit wir später auch die Nodes unterscheiden können, implementieren wir getName() neu: &lt;/p&gt; &lt;pre&gt;&#160; @Override&lt;br /&gt;&#160; public String getName() {&lt;br /&gt;&#160;&#160;&#160; return getData().getName();&lt;br /&gt;&#160; }&lt;/pre&gt; &lt;p class="bodytext"&gt;Um
      die Sache lauffähig zu machen, brauchen wir noch NodeData: &lt;/p&gt; &lt;pre&gt;public class NodeData {&lt;br /&gt;&#160; private String name;&lt;br /&gt;&#160; public NodeData (String name) {&lt;br /&gt;&#160; &#160; this.name = name;&lt;br /&gt;&#160; }&lt;br /&gt;&lt;br /&gt;&#160; public String getName() {&lt;br /&gt;&#160; &#160; return this.name;&lt;br /&gt;&#160; }&lt;br /&gt;}&lt;/pre&gt; &lt;p class="bodytext"&gt;Jetzt können wir endlich unsere&#160;Knoten im Constructor von der Klasse Test
      anlegen: &lt;/p&gt; &lt;pre&gt;&#160; public Test() {&lt;br /&gt;&#160; &#160; super();&lt;br /&gt;&#160; &#160; initComponenents();&lt;br /&gt;&#160; &#160; Node root = new RootNode(); &lt;br /&gt;&#160; &#160; getExplorerManager().setRootContextNode (root);&lt;br /&gt;&#160;&#160; &lt;br /&gt;&#160; &#160; root.getChildren().add (new Node[] {&lt;br /&gt;&#160; &#160; &#160; new ChildNode (new NodeData ("Erster Knoten")),&lt;br /&gt;&#160; &#160; &#160; new ChildNode (new NodeData ("Zweiter
      Knoten")),&lt;br /&gt; &#160; &#160; &#160; new ChildNode (new NodeData ("Dritter Knoten")),&lt;br /&gt; &#160; &#160; &#160; new ChildNode (new NodeData ("Letzter!!")),&lt;br /&gt; &#160; &#160; });&lt;br /&gt;&#160; }&lt;/pre&gt; &lt;p class="bodytext"&gt;Zwar wird es nicht gern gesehen die add()-Methode zu verwenden, im Falle von Index.Children und diesem Test ist es aber durchaus legitim. &lt;/p&gt; &lt;p class="bodytext"&gt;Wenn man nun daraus ein fertiges Beispielprogramm gebastelt hat, wird
      man feststellen, dass das UI schon grundsätzlich reagiert. Man kann die Knoten per DnD ziehen und dabei zuschauen, wie das BeanTreeView am Zielort eine passende "Einfügemarke" anzeigt.&#160; &lt;/p&gt; &lt;p class="bodytext"&gt;Tja, aber das Fallenlassen funktioniert noch nicht. Der Mauszeiger straft uns auch mit einem Verbotszeichen. &lt;/p&gt; &lt;p class="bodytext"&gt;Damit das Drag and Drop schlussendlich wirklich funktioniert, muss man dem BeanTreeView über das Cookie-Set des übergeordneten
      Knotens den Children-Container bekanntgeben. In diesem Fall ist der übergeordnete Knoten natürlich unsere RootNode-Klasse. Dort fügen wir folgende Methode noch ein: &lt;/p&gt; &lt;pre&gt;&#160; @Override&lt;br /&gt;&#160; public Cookie getCookie (Class clazz) {&lt;br /&gt;&#160;&#160;&#160; Children ch = getChildren();&lt;br /&gt;&lt;br /&gt;&#160;&#160;&#160; if (clazz.isInstance(ch)) {&lt;br /&gt;&#160; &#160; &#160; // hier den Children-Container bekannt machen:&lt;br
      /&gt;&#160;&#160;&#160;&#160;&#160; return (Cookie) ch;&lt;br /&gt;&#160;&#160;&#160; }&lt;br /&gt;&#160;&#160;&#160; return super.getCookie(clazz);&lt;br /&gt;&#160; }&lt;/pre&gt; &lt;p class="bodytext"&gt;Das hätte AbstractNode auch selber machen können... &lt;/p&gt; &lt;p class="bodytext"&gt;Jetzt funktioniert es endlich auch mit dem Drop-Teil von Drag and Drop. &lt;/p&gt; &lt;p class="bodytext"&gt;Hier nochmal die Zusammenfassung: &lt;/p&gt; &lt;p class="bodytext"&gt;Der Children-Container muss
      ein Index-ArrayChildren sein, damit benutzerdefinierte Positionen festgelegt werden können. Ansonsten wären die Nodes nur nach festen Kriterien sortiert. &lt;/p&gt; &lt;p class="bodytext"&gt;Damit der Drag-Teil überhaupt startet, muss in den Nodes canCut überschrieben werden und true zurückgeben. &lt;/p&gt; &lt;p class="bodytext"&gt;Und für den Drop-Teil muss das View (hier BeanTreeView) auf den Children-Container zugreifen können, um anhand des Interfaces überhaupt ermitteln zu können, dass Nodes
      angeordnet werden können. &lt;/p&gt; &lt;p class="bodytext"&gt;Das war es auch schon. Viel Spaß mit dem Kochrezept und dem Ergebnis eines modernen UIs. &lt;/p&gt; &lt;p class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160; Josch. &lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt;</description>
      <pubDate>Thu, 26 Jun 2008 08:45:00 +0000</pubDate>
    </item>
    <item>
      <title>JNBB - Joschs NetBeans Blog: BeanDev: Minimaler Einsatz für Drag and Drop von Nodes</title>
      <guid isPermaLink="false">http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_minimaler_einsatz_fuer_drag_and_drop_von_nodes/index.html</guid>
      <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_minimaler_einsatz_fuer_drag_and_drop_von_nodes/index.html</link>
      <description>&lt;p class="bodytext"&gt;Es funktioniert fast überall in den aktuellen Versionen der NetBeans IDE: Man kann in den Baumansichten die Elemente anklicken und mit gehaltener linker Maustaste an eine andere Position verschieben. &lt;/p&gt; &lt;p class="bodytext"&gt;Wenn man das auch für die eigenen BeanTreeView-Komponenten haben will, muss man ein paar Methoden implementieren bzw. überschreiben, damit das funktioniert. &lt;/p&gt; &lt;p class="bodytext"&gt;In diesem "Kochrezept" habe ich ein
      sehr einfaches Modell gewählt, nur einen Root-Node mit einer einfachen Hierachie. Der Root-Node kann sogar ausgeblendet werden. &lt;/p&gt; &lt;p class="bodytext"&gt;Man erzeugt&#160;ein JPanel oder TopComponent und implementiert&#160; ExplorerManager.Provider. Die Methode getExplorerManager liefert einen Standard-ExplorerManager: &lt;/p&gt; &lt;pre&gt;public class Test extends ToComponent &lt;br /&gt; implements ExplorerManager.Provider {&lt;br /&gt;&#160; private ExplorerManager em = new
      ExplorerManager();&lt;br /&gt;&#160; public Test() {&lt;br /&gt;&#160; &#160; super();&lt;br /&gt;&#160; &#160; initComponenents();&lt;br /&gt;&#160; &#160; getExplorerManager().setRootContextNode (new RootNode());&lt;br /&gt;&#160; }&lt;br /&gt;&lt;br /&gt;&#160; public ExplorerManager getExplorerManager() {&lt;br /&gt;&#160; &#160; return em;&lt;br /&gt;&#160; }&lt;br /&gt;&lt;br /&gt;&#160; // ...&lt;br /&gt;}&lt;/pre&gt; &lt;p class="bodytext"&gt;In initComponents() fügt man dieser Komponente
      z.B. einem BeanTreeView hinzu, damit man überhaupt etwas von diesem Beispiel hat.&lt;br /&gt;&lt;br /&gt;Nun benötigen wir die Klasse RootNode, die von AbstractNode abgeleitet wird und ein spezielles Children-Object an AbstractNode weiterreicht.&#160;Dies ist die erste Vorraussetzung, damit die untergeordneten Nodes überhaupt eine benutzerdefinierte Reihenfolge erhalten: &lt;/p&gt; &lt;pre&gt;public class RootNode extends AbstractNode {&lt;br /&gt;&#160; public RootNode() {&lt;br
      /&gt;&#160;&#160;&#160; super (new RootChildren());&lt;br /&gt;&#160; }&lt;br /&gt;}&lt;/pre&gt; &lt;p class="bodytext"&gt;Zwar ist RootNode noch nicht fertig, aber werfen wir mal einen Blick auf RootChildren: &lt;/p&gt; &lt;pre&gt;public class RootChildren extends Index.ArrayChildren{&lt;br /&gt;&#160; public RootChildren() {&lt;br /&gt;&#160;&#160;&#160; super();&lt;br /&gt;&#160; }&lt;br /&gt;}&lt;/pre&gt; &lt;p class="bodytext"&gt;Natürlich hätte oben in RootNode auch ein super (new
      Index.ArrayChildren()); gereicht (zumal RootChildren schon fertig ist), aber wenn man das für eigene Projekte erweitern will, ist es besser man hat eine größere Kontrolle über das Children-Modell. &lt;/p&gt; &lt;p class="bodytext"&gt;Index.ArrayChildren implementiert alle Verwaltungsaufgaben, um Positionen von Knoten zu managen. Das Drag and Drop UI der Views benötigen diese Implementation, um die Knoten anhand von Anwenderaktionen anzuordnen. &lt;/p&gt; &lt;p class="bodytext"&gt;Bis jetzt wurde also
      erst die Wurzel des Baumes definiert, und wie die untergeordneten Knoten im Container (Index.ArrayChildren) dieser RootNode gehalten werden. &lt;/p&gt; &lt;p class="bodytext"&gt;Jetzt also zu den ChildNodes: &lt;/p&gt; &lt;pre&gt;public class ChildNode extends AbstractNode {&lt;br /&gt;&#160; private InstanceContent content;&lt;br /&gt;&lt;br /&gt;&#160; public ChildNode (NodeData data) {&lt;br /&gt;&#160;&#160;&#160; this (data, new InstanceContent());&lt;br /&gt;&#160; }&lt;br /&gt;&#160; &lt;br
      /&gt;&#160; public ChildNode (NodeData data, InstanceContent content) {&lt;br /&gt;&#160;&#160;&#160; super (Children.LEAF, new AbstractLookup (content));&lt;br /&gt;&#160;&#160;&#160; this.content = content;&lt;br /&gt;&#160;&#160;&#160; content.add(data);&lt;br /&gt;&#160; }&lt;br /&gt;&lt;br /&gt;&#160; public NodeData getData() {&lt;br /&gt;&#160;&#160;&#160; return getLookup().lookup(NodeData.class);&lt;br /&gt;&#160; }&lt;br /&gt;}&lt;/pre&gt; &lt;p class="bodytext"&gt;Die obigen Konstruktoren
      entsprechen meinem Lieblingsaufbau von Nodes, die nur im Arbeitsspeicher gehalten werden. Das ist keine Vorraussetzung, um die Knoten per Drag and Drop zu verschieben. &lt;/p&gt; &lt;p class="bodytext"&gt;Allerdings muss nun noch folgende Methode ChildNode hinzugefügt werden: &lt;/p&gt; &lt;pre&gt;&#160; @Override&lt;br /&gt;&#160; public boolean canCut() {&lt;br /&gt;&#160;&#160;&#160; return true;&lt;br /&gt;&#160; }&lt;/pre&gt; &lt;p class="bodytext"&gt;Wenn ChildNode bei canCut immer false
      zurückgibt (und das ist in AbstractNode so festgelegt), funktioniert schon der erste Drag-Schritt nicht. In NetBeans wird Drag and Drop im Prinzip als Cut and Paste abgebildet. &lt;/p&gt; &lt;p class="bodytext"&gt;Damit wir später auch die Nodes unterscheiden können, implementieren wir getName() neu: &lt;/p&gt; &lt;pre&gt;&#160; @Override&lt;br /&gt;&#160; public String getName() {&lt;br /&gt;&#160;&#160;&#160; return getData().getName();&lt;br /&gt;&#160; }&lt;/pre&gt; &lt;p class="bodytext"&gt;Um
      die Sache lauffähig zu machen, brauchen wir noch NodeData: &lt;/p&gt; &lt;pre&gt;public class NodeData {&lt;br /&gt;&#160; private String name;&lt;br /&gt;&#160; public NodeData (String name) {&lt;br /&gt;&#160; &#160; this.name = name;&lt;br /&gt;&#160; }&lt;br /&gt;&lt;br /&gt;&#160; public String getName() {&lt;br /&gt;&#160; &#160; return this.name;&lt;br /&gt;&#160; }&lt;br /&gt;}&lt;/pre&gt; &lt;p class="bodytext"&gt;Jetzt können wir endlich unsere&#160;Knoten im Constructor von der Klasse Test
      anlegen: &lt;/p&gt; &lt;pre&gt;&#160; public Test() {&lt;br /&gt;&#160; &#160; super();&lt;br /&gt;&#160; &#160; initComponenents();&lt;br /&gt;&#160; &#160; Node root = new RootNode(); &lt;br /&gt;&#160; &#160; getExplorerManager().setRootContextNode (root);&lt;br /&gt;&#160;&#160; &lt;br /&gt;&#160; &#160; root.getChildren().add (new Node[] {&lt;br /&gt;&#160; &#160; &#160; new ChildNode (new NodeData ("Erster Knoten")),&lt;br /&gt;&#160; &#160; &#160; new ChildNode (new NodeData ("Zweiter
      Knoten")),&lt;br /&gt; &#160; &#160; &#160; new ChildNode (new NodeData ("Dritter Knoten")),&lt;br /&gt; &#160; &#160; &#160; new ChildNode (new NodeData ("Letzter!!")),&lt;br /&gt; &#160; &#160; });&lt;br /&gt;&#160; }&lt;/pre&gt; &lt;p class="bodytext"&gt;Zwar wird es nicht gern gesehen die add()-Methode zu verwenden, im Falle von Index.Children und diesem Test ist es aber durchaus legitim. &lt;/p&gt; &lt;p class="bodytext"&gt;Wenn man nun daraus ein fertiges Beispielprogramm gebastelt hat, wird
      man feststellen, dass das UI schon grundsätzlich reagiert. Man kann die Knoten per DnD ziehen und dabei zuschauen, wie das BeanTreeView am Zielort eine passende "Einfügemarke" anzeigt.&#160; &lt;/p&gt; &lt;p class="bodytext"&gt;Tja, aber das Fallenlassen funktioniert noch nicht. Der Mauszeiger straft uns auch mit einem Verbotszeichen. &lt;/p&gt; &lt;p class="bodytext"&gt;Damit das Drag and Drop schlussendlich wirklich funktioniert, muss man dem BeanTreeView über das Cookie-Set des übergeordneten
      Knotens den Children-Container bekanntgeben. In diesem Fall ist der übergeordnete Knoten natürlich unsere RootNode-Klasse. Dort fügen wir folgende Methode noch ein: &lt;/p&gt; &lt;pre&gt;&#160; @Override&lt;br /&gt;&#160; public Cookie getCookie (Class clazz) {&lt;br /&gt;&#160;&#160;&#160; Children ch = getChildren();&lt;br /&gt;&lt;br /&gt;&#160;&#160;&#160; if (clazz.isInstance(ch)) {&lt;br /&gt;&#160; &#160; &#160; // hier den Children-Container bekannt machen:&lt;br
      /&gt;&#160;&#160;&#160;&#160;&#160; return (Cookie) ch;&lt;br /&gt;&#160;&#160;&#160; }&lt;br /&gt;&#160;&#160;&#160; return super.getCookie(clazz);&lt;br /&gt;&#160; }&lt;/pre&gt; &lt;p class="bodytext"&gt;Das hätte AbstractNode auch selber machen können... &lt;/p&gt; &lt;p class="bodytext"&gt;Jetzt funktioniert es endlich auch mit dem Drop-Teil von Drag and Drop. &lt;/p&gt; &lt;p class="bodytext"&gt;Hier nochmal die Zusammenfassung: &lt;/p&gt; &lt;p class="bodytext"&gt;Der Children-Container muss
      ein Index-ArrayChildren sein, damit benutzerdefinierte Positionen festgelegt werden können. Ansonsten wären die Nodes nur nach festen Kriterien sortiert. &lt;/p&gt; &lt;p class="bodytext"&gt;Damit der Drag-Teil überhaupt startet, muss in den Nodes canCut überschrieben werden und true zurückgeben. &lt;/p&gt; &lt;p class="bodytext"&gt;Und für den Drop-Teil muss das View (hier BeanTreeView) auf den Children-Container zugreifen können, um anhand des Interfaces überhaupt ermitteln zu können, dass Nodes
      angeordnet werden können. &lt;/p&gt; &lt;p class="bodytext"&gt;Das war es auch schon. Viel Spaß mit dem Kochrezept und dem Ergebnis eines modernen UIs. &lt;/p&gt; &lt;p class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160; Josch. &lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt;</description>
      <pubDate>Thu, 26 Jun 2008 08:45:00 +0000</pubDate>
    </item>
    <item>
      <title>JNBB - Joschs NetBeans Blog: BeanDev: Notfall-Branding - NB 6.1 Plattform zu 90% auf Deutsch</title>
      <guid isPermaLink="false">http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_notfall_branding_nb_61_plattform_zu_90_auf_deutsch/not_cached/index.html</guid>
      <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_notfall_branding_nb_61_plattform_zu_90_auf_deutsch/not_cached/index.html</link>
      <description>&lt;p class="bodytext"&gt;Wenn man mit NetBeans 6.1 bereits entwickelt, ist es leider recht unschön, dass man keine lokalisierte Version zur Verfügung hat. &lt;/p&gt; &lt;p class="bodytext"&gt;Für einen Prototypen benötigte ich aber unbedingt eine, größtenteils, in das Deutsche übersetzte Plattform.&#160; &lt;/p&gt; &lt;p class="bodytext"&gt;Was man auf keinen Fall machen darf, ist das Localization Kit für NetBeans 6.0x zu installieren. Es werden dann die Module der plattform7
      installiert, was für RichClient Anwendungen der build-Tod ist. Da muss man erstmal wieder kräftig von Hand aufräumen. &lt;/p&gt; &lt;p class="bodytext"&gt;Ich habe mir also das platform7-de.nbm geschnappt, entpackt, alle jarFiles in&#160; Ordner gewandelt und alle Bundle_de.properties in Bundle.properties umbenannt. &lt;/p&gt; &lt;p class="bodytext"&gt;Wenn man nun diese 41 lokalisierten Bundle-Ordner in das branding/modules - Verzeichnis kopiert hat man zumindest eine leidlich gute Übersetzung 90%
      aller plattformspezifischen Texte. Was nicht übersetzt ist, sind neue Labels der 6.1'er Version und die paar Texte, die schon bei 6.0.1 und 6.0 durchs Raster gefallen waren. &lt;/p&gt; &lt;p class="bodytext"&gt;Die Dateien muss man im File-Explorer (nicht Projects) unter branding einfügen. &lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt; &lt;p class="bodytext"&gt;Hier das Archiv &lt;a href="http://www.sepix.de/fileadmin/modules.zip" target="_blank" title="Opens external link in current
      window"&gt;modules.zip&lt;/a&gt; mit den Bundle.properties. &lt;/p&gt; &lt;p class="bodytext"&gt;Ich muss aber darauf hinweisen, dass das nix für eine produktive Anwendung ist! &lt;/p&gt; &lt;p class="bodytext"&gt;Für meinen Prototypen hat es gereicht. :-) &lt;/p&gt; &lt;p class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160; Josch.&lt;br /&gt; &lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt;</description>
      <pubDate>Fri, 20 Jun 2008 13:47:00 +0000</pubDate>
    </item>
    <item>
      <title>JNBB - Joschs NetBeans Blog: BeanDev: Notfall-Branding - NB 6.1 Plattform zu 90% auf Deutsch</title>
      <guid isPermaLink="false">http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_notfall_branding_nb_61_plattform_zu_90_auf_deutsch/index.html</guid>
      <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_notfall_branding_nb_61_plattform_zu_90_auf_deutsch/index.html</link>
      <description>&lt;p class="bodytext"&gt;Wenn man mit NetBeans 6.1 bereits entwickelt, ist es leider recht unschön, dass man keine lokalisierte Version zur Verfügung hat. &lt;/p&gt; &lt;p class="bodytext"&gt;Für einen Prototypen benötigte ich aber unbedingt eine, größtenteils, in das Deutsche übersetzte Plattform.&#160; &lt;/p&gt; &lt;p class="bodytext"&gt;Was man auf keinen Fall machen darf, ist das Localization Kit für NetBeans 6.0x zu installieren. Es werden dann die Module der plattform7
      installiert, was für RichClient Anwendungen der build-Tod ist. Da muss man erstmal wieder kräftig von Hand aufräumen. &lt;/p&gt; &lt;p class="bodytext"&gt;Ich habe mir also das platform7-de.nbm geschnappt, entpackt, alle jarFiles in&#160; Ordner gewandelt und alle Bundle_de.properties in Bundle.properties umbenannt. &lt;/p&gt; &lt;p class="bodytext"&gt;Wenn man nun diese 41 lokalisierten Bundle-Ordner in das branding/modules - Verzeichnis kopiert hat man zumindest eine leidlich gute Übersetzung 90%
      aller plattformspezifischen Texte. Was nicht übersetzt ist, sind neue Labels der 6.1'er Version und die paar Texte, die schon bei 6.0.1 und 6.0 durchs Raster gefallen waren. &lt;/p&gt; &lt;p class="bodytext"&gt;Die Dateien muss man im File-Explorer (nicht Projects) unter branding einfügen. &lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt; &lt;p class="bodytext"&gt;Hier das Archiv &lt;a href="http://www.sepix.de/fileadmin/modules.zip" target="_blank" title="Opens external link in current
      window"&gt;modules.zip&lt;/a&gt; mit den Bundle.properties. &lt;/p&gt; &lt;p class="bodytext"&gt;Ich muss aber darauf hinweisen, dass das nix für eine produktive Anwendung ist! &lt;/p&gt; &lt;p class="bodytext"&gt;Für meinen Prototypen hat es gereicht. :-) &lt;/p&gt; &lt;p class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160; Josch.&lt;br /&gt; &lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt;</description>
      <pubDate>Fri, 20 Jun 2008 13:47:00 +0000</pubDate>
    </item>
    <item>
      <title>JNBB - Joschs NetBeans Blog: BeanDev: TopComponent und Paletten (wie ich sie zusammen brachte)</title>
      <guid isPermaLink="false">http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_topcomponent_und_paletten_wie_ich_sie_zusammen_brachte/not_cached/index.html</guid>
      <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_topcomponent_und_paletten_wie_ich_sie_zusammen_brachte/not_cached/index.html</link>
      <description>&lt;p class="bodytext"&gt;Seit sechs Monaten beschäftige ich mich damit, meine alten Projekte soweit umzubauen, dass diese relativ einfach in die NetBeans Plattform integriert werden können. Dieses Refactoring hat eigentlich nichts mit NB zu tun, es geht nur darum eine vernünftige Modularisierung zu erreichen. &lt;/p&gt; &lt;p class="bodytext"&gt;In den letzten drei Monaten habe ich schon verstärkt neue Projekte ausschließlich auf der NetBeans 6.0 (und nun 6.1) Plattform implementiert.
      Immer wieder stoße ich dabei auf Probleme, bei denen mir kein Buch, kein Tutorial und kein Wiki helfen will oder kann. &lt;/p&gt; &lt;p class="bodytext"&gt;Insbesondere die Tutorials, mit ihrem Anspruch sehr einfach aufgebaut sein zu wollen, schicken immer wieder auf den Irrweg und hinterlassen manchmal einen verstörten Programmierer mit verzweifeltem Gesichtsausdruck, ausgerauften Haaren und der letztendlichen Erkenntnis: So einfach ist das nun auch wieder nicht. &lt;/p&gt; &lt;p
      class="bodytext"&gt;Dazu gehören auch Paletten und ihre (nahezu mystische) Fähigkeit, sich automatisch einzublenden, wenn man ein TopComponent-Fenster öffnet. &lt;/p&gt; &lt;p class="bodytext"&gt;Jeder NB-Entwickler kennt die netten Helferlein, die z.B. beim Öffnen des Formeditors sich zusätzlich einblenden. So was wollte ich auch in meiner Anwendung haben. Es geht um eine Palette, die Funktionseinheiten für einen Query-Builder liefern soll. Die Palette hat mehrere Kategorien, aus denen ein Anwender
      unterschiedlichste Abfrage-Attribute zusammenklicken kann, die letztendlich nur vorprogrammierte SQL-Anweisungen sind. &lt;/p&gt; &lt;p class="bodytext"&gt;Diese Abfrage-Attribute kann der Anwender in einem Query-Builder-Fenster (BeanTreeView in einem TopComponent mit ExplorerManger) nach gutdünken zusammenfügen. So weit so gut. Das Ergebnis der Klickorgie kann der geneigte Anwender dann in einem extra TopComponent-Fenster betrachten. &lt;/p&gt; &lt;p class="bodytext"&gt;Folgende Aufteilung hatte ich
      mir vorgestellt. Der Query-Builder mit seinem BeanTreeView ist links angedockt. Die Palette dockt rechts an und spätestens bei der "Abfrage ausführen"-Aktion soll sich das Ergebnis-Fenster im Editor-Bereich öffnen und die ermittelten Datensätze anzeigen. &lt;/p&gt; &lt;p class="bodytext"&gt;Wie man so etwas (größtenteils) deklarativ erledigt erklären vielfältige "Window"-Tutorials. &lt;a title="Docking the Anagram Game"
      href="http://platform.netbeans.org/tutorials/nbm-windowsapi.html#embed-and-display" target="_blank" class="external-link-new-window"&gt;Hier z.B. ein Tutorial&lt;/a&gt;. &lt;/p&gt; &lt;p class="bodytext"&gt;Wie man eine Palette programmiert und wie diese automatisch zu einem TopComponent geöffnet wird, findet man in diesem &lt;a title="NetBeans Palette API Tutorial" href="http://platform.netbeans.org/tutorials/nbm-palette-api3.htm" target="_blank"
      class="external-link-new-window"&gt;Tutorial&lt;/a&gt;. &lt;/p&gt; &lt;p class="bodytext"&gt;Nun ja, einfach zu verstehen, wenn man erstmal dahinter gestiegen ist, wie das mit dem Layer.xml und Lookup-Registrierungen funktioniert. Dann geht das tatsächlich leicht von der Hand. &lt;/p&gt; &lt;p class="bodytext"&gt;... nur, dass es bei mir nicht funktioniert hat. &lt;/p&gt; &lt;p class="bodytext"&gt;Jedes mal, wenn ich den Query-Builder geöffnet hatte, zeigte sich nicht die zugeordnete Palette. Nach
      stundenlangem Debuggen konnte ich auch definitiv ausschließen, dass mir versteckte Exceptions oder falsche Lookup-Registrierungen Steine in den Weg werfen. Es war einfach alles so programmiert, wie es die Autoren der Tutorials vorgemacht haben. &lt;/p&gt; &lt;p class="bodytext"&gt;Nach einer Mütze voll Schlaf holte ich mir die Beispielprogramme von der netbeans.org Seite (die höhnisch lächelnd meine Inkompetenz deutlich machten in dem sie natürlich funktionierten) und verglich diese mit meinem
      Quelltext. Nur 10 Minuten (und durch einen glücklichen Zufall oder Eingebung?) später hatte ich einen kleinen Unterschied festgestellt. Die TopComponents der Beispiele, die eine Palette zum Anzeigen animieren sollen wurden immer im Mode "editor" deklariert. D.h. die TopComponents erschienen im Center-Bereich der Anwendung und wurden&#160;nicht an der linken Seite angedockt. Und das war das Problem. &lt;/p&gt; &lt;p class="bodytext"&gt;Man merke sich folgendes: &lt;/p&gt; &lt;p style="font-weight:
      bold;" class="bodytext"&gt;Die automatische deklarative Aktivierung einer Palette zu einem TopComponent funktioniert nur dann, wenn das TopComponent in der *.wstcref-Datei als Mode "editor" registriert wurde.&lt;/p&gt; &lt;p class="bodytext"&gt;Danke. Das hätte man ja auch mal erwähnen können. &lt;/p&gt; &lt;p class="bodytext"&gt;Da die Anwendung erstmal fertig werden musste, habe ich das Design ein wenig geändert&#160;und meinen Query-Builder tatsächlich im "editor"-Bereich angezeigt. Und nun
      klappte es auch mit der Nachbarin "Palette". &lt;/p&gt; &lt;p class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160; Josch.&lt;/p&gt;</description>
      <pubDate>Sun, 08 Jun 2008 07:57:00 +0000</pubDate>
    </item>
    <item>
      <title>Bernhard's Weblog: NetBeans 6.1 Beta</title>
      <guid isPermaLink="false">http://www.jroller.com/berni/entry/netbeans_6_1_beta</guid>
      <link>http://www.jroller.com/berni/entry/netbeans_6_1_beta</link>
      <description>&lt;h2&gt;Introduction&lt;/h2&gt; &lt;p&gt; Netbeans 6.1 Beta is out, I have downloaded it, and I have given it a try. Especially the slow startup of the official Netbeans 6.0 disturbs me, so I was hoping this newer version starts more quickly. &lt;/p&gt; &lt;h2&gt;Faaast&lt;/h2&gt; &lt;p&gt; The startup time is now really faster. I really like that. Since I have installed Netbeans 6.1 Beta, I have never touched Netbeans 6.0 again. Now I'm really pleased. &lt;/p&gt; &lt;h2&gt;Debugging
      Local Variables&lt;/h2&gt; &lt;p&gt; Beside the startup speed I enjoyed another improvement. When I debug a program, now I can change variables of any wrapper classes, like Integer, Double, etc. In previous versions only the equivalent built-in types were modifiable, but not their wrapper-classes. &lt;/p&gt; &lt;p&gt; Thus now you are able to modify in the "Local Variable" window the vars like i1, d1, and l1. &lt;/p&gt; &lt;img src="http://www.jroller.com/berni/resource/netbeans-6.1-beta.gif"
      alt="Debug Window" /&gt; &lt;p&gt; In the version Netbeans 6.0 you have seen a dialog box, notifying "Can't assign primitive value to object". &lt;/p&gt; &lt;p&gt; You can check the &lt;a href="http://www.netbeans.org/issues/show_bug.cgi?id=125267"&gt;Issue 125267&lt;/a&gt;. As you might notice I reported the issue, and it was fixed. Kudos to responsivness of the nb team member mentlicher! &lt;/p&gt; &lt;p&gt; I was very surprised that the netbeans team fixed this issue: &lt;/p&gt; &lt;ul&gt;
      &lt;li&gt;very fast &lt;/li&gt;&lt;li&gt;very uncomplicated &lt;/li&gt;&lt;/ul&gt; &lt;p&gt; So if you have an issue, contact the mailing-lists, or enter an issue. It's really worth! &lt;/p&gt; &lt;h2&gt;Groovy And Grails&lt;/h2&gt; &lt;p&gt; I' m using grails in two projects successfully. So I'm very pleased about the new groovy and grails plugin. Although there are still some rough edges, I enjoy the syntax highlightning for the groovy, and gsp files. &lt;/p&gt; &lt;p&gt; You might want to give it
      a try, see the &lt;a href="http://docs.co