Lookup und Swing-Tricks: Wie ich Events zu Lookup-Changes bekomme

Ich melde mich mal mit einer Kleinigkeit zurück.

Der Kunde wünscht sich bei der Auswahl von Nodes auch die Modifier der Tastatur zu ermitteln. Üblicherweise ist das gar nicht möglich, wenn man nur mit Lookup-Listener auf Results arbeitet (was ja die Regel sein sollte).

Da Swing ja singlethreaded ist und die meisten Lookup-Benachrichtigungen sich auch daran halten (außer man erzwingt Mutlithreading – was böse ist), kann man einfach über das AWT das aktuelle Event ermitteln:

AWTEvent currentEvent = EventQueue.getCurrentEvent();

Da AWTEvent recht schmalbrüstig ist, müssen wir es noch casten. Beispiel:

if ( currentEvent instanceof InputEvent ) {
  mods = ((InputEvent)currentEvent).getModifiers();
}

Ist kein aktuelles Event vorhanden, wird null zurückgegeben, was mit instanceof ohne NPE abgefangen wird. Dann erhalten wir aber auch keine Modifier.

Veröffentlicht unter Java, NetBeans Plattform | Verschlagwortet mit , , | Hinterlasse einen Kommentar

JavaFX 2 Multiplatform in einer NetBeans Platform App

Da auch JavaFX 2 mit einem eigenen Native-Loader kommt, haben wir in einer NetBeans Platform wieder das Problem, die DLL/SO/… Bibliotheken an die richtige Stelle zu bekommen.

Man kann natürlich den Anwender JavaFX installieren und bin-Pfade einrichten lassen. Aber bequemer ist es natürlich, wenn sich die Platform Application darum kümmert.

Hier eine extrem simple (und nicht für alle Plattformen gültige) Lösung.

Es wird davon ausgegangen, dass sich die javafx-2.0.jar in dem Ordner cluster/modules/ext/somename befindet. Cluster ist der suite-Name. Der Pfad modules/ext ist Standard für externe Bibliotheken und somename ist (ggf.) ein Codename-Base-Name der externen Bibliothek oder “lib” (das ist JavaFX aber egal). Ich habe z.B. com.oracle verwendet (die aus der Gruppen-ID meiner Maven-Artifakte kommt).

Will ich nun (nur) Windows in 32bit und 64bit unterstützen, lege ich in dem ext-Order noch bin und darunter amd63 und x86 an. Also: cluster/modules/ext/bin/amd64 und cluster/modules/ext/bin/x86. Der Native Loader von JavaFX sucht immer (von der javafx-2.0.jar) in ../bin. Ich muss also nun die DLL’s kopieren.

Hier ein Beispiel meiner Dateistrukturen:

Da JavaFX fast mit Java7 verheiratet ist, werde ich auch nur mit Java7-nio den Weg beschreiten:

public class Installer extends ModuleInstall {

  @Override
  public void restored() {
    Class c = Installer.class;
    URL u = c.getProtectionDomain().getCodeSource().getLocation();
    String path = u.getPath();
    if ( path.startsWith("file:/") && path.endsWith(".jar!/")) {
      path = path.substring(6);
      path = path.substring(0, path.length()-2);
      int pos = path.lastIndexOf("/");
      if ( pos >= 0 ) {
        path = path.substring(0, pos);
        FileSystem fs = FileSystems.getDefault();
        Path dest = fs.getPath(path, "ext", "bin");
        Path source = fs.getPath(path, "ext", "bin", System.getProperty("os.arch"));
        try {
          for (Path toCopy : Files.newDirectoryStream(source)) {
            Path destFile = fs.getPath(dest.toString(), toCopy.getFileName().toString());
            Files.copy(toCopy, destFile, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.COPY_ATTRIBUTES);
          }
        } catch (IOException ex) {
          Exceptions.printStackTrace(ex);
        }
      }
    }
  }
}

Am aufwendigsten ist die Ermittlung des Modulpfades per URL u = c.getProtectionDomain().getCodeSource().getLocation(); mit dem Extrahieren des eigentlichen Pfades (man sieht, WebStart wird nicht unterstützt). Den Path “source” ermittle ich ausschließlich über os.arch. Das ist natürlich nicht wirklich nützlich für Plattformen wie Linux. Wer weitere Plattformen unterstützen will, sollte noch zusätzliche Systemparameter ermitteln und weitere Unterordner anlegen. Ich würde aber explizit die Methoden aus org.openide.util.Utilities (isMac, isUnix, isWindows) verwenden. Die System Properties sind da zu geschwätzig.

Nehmen wir an, es würde alles fehl schlagen (weil wir Bibliotheken nicht mitliefern), dann sollte man noch eine eigene Hilfsklasse basteln, die den erfolgreichen (oder nicht erfolgreichen) Kopiervorgang an andere Module liefern kann (z.B. JavaFXHelper.isJavaFXAvailable()). Wenn man das nämlich nicht abprüft und doch JavaFX verwendet, sind die Abstürze so hart, dass häufig nicht mal das Hauptfenster angezeigt wird. Im Log findet ihr dann Fehler wie: java.lang.UnsatisfiedLinkError: Can’t load library: …

Was allerdings schön ist: mehr ist nicht zu machen. Man muss nicht (wie in einem alten Artikel von mir beschrieben) eine Startup-Klasse der Platform unterschieben, um JavaFX zu nutzen.

Einen Mini-WebBrowser fügt man so in eine TopComponent ein:

    final JFXPanel fxPanel = new JFXPanel();

    add(fxPanel);
   
    Platform.runLater(new Runnable() {

      @Override
      public void run() {
        Group group = new Group();
        Scene scene = new Scene(group);
        fxPanel.setScene(scene);
       
        view = new WebView();
        view.setMinSize(1024, 768);
        view.setPrefSize(1024, 768);
        group.getChildren().add (view);
      }
    });

view ist eine Feldvariable der TopComponent. Mit der Methode:

  public void browseTo (final String url) {
    Platform.runLater(new Runnable() {
      @Override
      public void run() {
        view.getEngine().load(url);
      }
    });
  }

kann man eine Webseite öffnen (http:// muss aber am Anfang der URL stehen).

Viel Spaß mit JavaFX in der NetBeans Platform.

Veröffentlicht unter JavaFX, NetBeans Plattform | 4 Kommentare

NetBeans Release 7.1.1 ist da

Seit kurzer Zeit ist ein neues Release von NetBeans fertig und kann hier heruntergeladen werden.

Die Version 7.1.1 bring kleinere Neuerungen:

  • Java ME SDK 3.0.5 Unterstützung
  • Bundle GlassFish 3.1.2 Update
  • JavaFX 2.0.3 SDK Unterstützung
  • Maven 3.0.4 Upgrade

Dazu wurden 123 Fehler berichtigt, die noch in 7.1 waren oder bis 7.1.1 entdeckt wurden. Hier eine Liste der P1 Fehler:

All [71cat] ArrayIndexOutOfBoundsException: -72
All Closing editor clone not handled correctly;
editor TC out of sync with disk file
All [regression] Use of FindUsages modifies all
documents with references
Wind Applications not using OSGi don’t start on NbP 7.1
Linu Can’t deploy to remote GlassFish 3.1.1 server
Wind Mercurial gives getaddrinfo failed
Wind Insufficient CSS parser error recovery
All [71cat] Scanning projects never ends
All Add friend dependency for Java ME
Wind Find Occurences (Alt+F7) tries wrongly to modify the file
Mac Evaluate org.openide.awt
.ActionsTest.testTooltipsContainAccelerator
failure on Mac
All ScriptingCreateFromTemplateTest
.testCreateFromTemplateEncodingProperty failure
Wind ME 3.0.5 emulator never starts on Win 7 64bit
All Failing test org.netbeans.modules.apisupport.project.
NbModuleProviderImplTest.testGetDependencyVersion
Wind Failing tests in release71_fixes branch
Wind REST sample cannot be deployed to GlassFish 3.1.2.
Veröffentlicht unter NetBeans IDE | Verschlagwortet mit , | Hinterlasse einen Kommentar

Die wichtigsten Tastatur-Tricks in der NetBeans IDE

Es gibt ein paar kleine Tricks, um mit der IDE etwas schneller arbeiten zu können. Die folgende Liste ist bei weitem nicht vollständig, sondern beschreibt nur die Shortcuts, die ich gerne nutze (auch die Verwendung von einigen Assistenten).

Zwischenablage / Clipboard

Mehr durch Zufall bekommt man mit, dass Strg+C / Ctrl-C die komplette Zeile in die Zwischenablage kopiert, wenn man kein Zeichen selektiert. Das ist sehr praktisch, weil man sich die Tastenkürzel für das Markieren einer kompletten Zeile ersparen kann.

Strg-V / Ctrl-V fügt die Zwischenablage ein. Aber mit der Umschalt/Shift Taste wird der importierte Quelltext noch zugleich formatiert. Umschalt+Strg+V ist damit meine häufigst verwendete Tastaturkombination.

Löschen

Strg+E löscht eine komplette Zeile, ohne sie markieren zu müssen.

Auskommentieren

Schnell muss mal eine Zeile raus aus den Programmablauf, löschen will man sie aber nicht. Toggle Comment [Strg+Umschalt+C] hilft hier, um selektierte Zeilen schnell auszukommentieren oder die Kommentare wieder zu entfernen.

Zeilen bewegen / duplizieren

Mit den Pfeil/Cursor Tasten und Alt+Umschalt / Alt-Shift, kann man die aktuelle Zeile oder die markierten Zeilen nach oben oder unten verschieben, bzw. ein- oder ausrücken.

Sehr praktisch ist auch das Kopieren der aktuellen Zeile (oder der markierten Zeilen). Pfeil / Cursor auf und ab mit Strg+Umschalt / Ctrl+Shift erzeugt eine Kopie über oder unter dem Original. Dabei wird die Zwischenablage / Clipboard nicht verändert.

So kann man z.B. relativ schnell Felder in Klassen duplizieren, um dann nur den Namen zu ändern.

Actions für “Java-Zeile beenden”

Das sind Shortcut-Actions, die auf deutschen Tastaturen nicht funktionieren. Bevor man diese Funktionen nutzen kann, muss man diese in den Options neu zuweisen. Dazu geht man in die Optionen (Tools -> Options), dort auf die Keymap. Im Suchfeld gibt man “Complete Line” ein. Man bekommt zwei Editor Actions die auf Ctrl+SEMICOLON und Ctrl+Shift+SEMICOLON hören. Die eine Action (Complete Line) wird auf ALT+COMMA geändert, die andere (Complete Line and Create New Line) auf Ctrl-Alt-COMMA.

Complete Line in NetBeansJetzt kann man mitten im Bearbeiten der Zeile die Shortcuts eingeben. Die IDE fügt dann ein ; an das Ende der Zeile an und fügt (auf Wunsch) eine neue Zeile ein.

Rechteckige Selektion im Editor

Die Texteditoren haben neuerdings zu der klassischen Zeichen/Zeilen-Selektion nun eine rechteckige Selektion. Die kann man mit Strg+Umschalt+R aktivieren und deaktivieren. Man kann dann mit der Maus oder Umschalt+Pfeiltaste einen rechteckigen Bereich markieren. Das Besondere ist nicht das Kopieren des Bereiches, sondern die Eingabe von neuen Daten in den Bereich. Jede Zeile aus dem rechteckigen bereich erhält die neue Eingabe. Somit kann man z.B. sehr schnell einen Bereich von public Feldern in private ändern.

public int a;
public String b;
public double c;

Rectangular Selection ManipulationNun mit Strg+Umschalt+R den Selektionsmodus auf Rechteckig ändern und alle drei public’s selektieren. Dann einfach private eingeben. Alle drei Felddeklarationen haben nun private als Modifier. Es ist zu empfehlen die Selektion nach solchen Operationen wieder zurückzusetzen.

Alles hybsch machen

Mit Strg+Umschalt+F wird der selektierte Bereich (oder alles, wenn keine Markierung existiert) neu durchformatiert.

Quelltextvervollständigung / Codecompletion

Import Statements aufräumen und ergänzen

Die Tastenkombination Strg+Umschalt+I wirft ungenutzte Imports raus, löst *-Imports auf und fügt fehlende Imports hinzu. Wenn Klassennamen doppelt existieren, dann muss man die passenden Klassen in einem Dialog bestätigen. Man braucht die Kombination seltener, seit dem Strg+V und Strg+Umschalt+V automatisch die Imports mit übertragen. Aber manchmal braucht man es doch noch.

Methoden überschreiben

Man kann den Alt-Einf / Alt-Insert Assistenten verwenden, oder direkt den Namen der zu überschreibenden Methode eingeben und dann Strg+Leertaste / Ctrl-SPACE drücken (natürlich im Body der Klasse). Es wird dann vorgeschlagen, eine Methode aus der Liste zum Überschreiben auszuwählen. Mit Enter bestätigen, erzeugt die Methode mit dem super-Aufruf der überschriebenen Methode.

Variablenzuweisungen von der IDE

Ma sollte möglichst nicht mit einer VAriablenzuweisung beginnen, sondern erst den Methodenaufruf  schreibe. Beispiel:

getDimension();

Man bleibt mit dem Eingabecursor hinter den Semikolon. Die IDE wird schon jetzt eine gelbe Lanpe (Hint) bei der Zeilennummer einblenden. Nicht mit der Maus anklicken (dauert zu lange), einfach Alt+Enter. Es erscheint idR. nur ein Hinweis: Einen Rückgabewert einer neuen Variable zuordnen. Einfach mit Enter bestätigen und die IDE erzeugt:

Dimension dimension = getDimension();

Dazu den passenden Import. Außerdem ist der Variablenname dimension markiert, so dass man ihn ggf. überschreiben kann.

POJOs erzeugen

Ein sehr einfacher Weg, um Plain Old Java Objects zu erzeugen, ist wieder per Assistent. Erstmal eine Klasse anlegen. Im Body der Klasse nur Alt+Einfügen / Alt+Insert tippen.

In der Auswahlbox “Add Property” auswählen. Der Assistent erlaubt nun neben den Namen und Typ auch weitere nützliche Optionen zu aktivieren. Insbesondere “Bound” erleichtert viel Arbeit, weil damit das PropertyChangeSupport für die set’er Methoden erzeugt wird.

Nie wieder muss man diesen Boilerplate Code schreiben:

/**
 * Set the value of name
 *
 * @param name new value of name
 */
public void setName(String name) {
   String oldName = this.name;
   this.name = name;
   propertyChangeSupport.firePropertyChange(PROP_NAME, oldName, name);
}

Nun kann man mit den Klassen erstmal arbeiten. Wenn man später die Architektur etwas aufmöbeln will, kann man aus der Klasse ein Interface extrahieren (Im Kontextmenü: Refactor -> Extract Interface).

Navigation

Hyperlinks für Klassen, Methoden und Felder

Hyperlink Navigation in NetBeansStrg-Taste / CTRL  halten und mit dem Mauszeiger über einen Namen (Methode, Feld, Klassenname) gehen. Es erscheint ein Hyperlink. Ein Klick darauf und man springt zur Deklaration (öffnet dabei ggf. einen neuen Editor).

Aktuelle Editor-Datei im Projektfenster markieren

Wenn man keine sofortige Synchronisation aktiviert hat (View -> Synchronize Editor with Views), dann stimmt die markierte Datei im Projektfenster nicht mit der aktuell bearbeiteten Datei im Editor überein. Strg+Umschalt+1 markiert die Datei im Projektfenster (und öffnet ggf. das zugehörige Projekt). Das ist dann besonders nützlich, wenn man in eine Klasse per Strg+Mausklick (wie ein Browser-Hyperlink) über Methodennamen gesprungen ist oder der Debugger die Quelltexte geöffnet hatte.

Klasse suchen

Strg+O (Goto Type) ist ein Suchdialog für Klassennamen. In dem Dialog den Suchbegriff eingeben, Doppelklick auf eines der Ergebnisse öffnet die Datei. Strg-Umschalt-1 zeigt die Datei dann in der Projekts-Struktur.

Zu Zeilennummer springen

Strg+G (Goto Linenumber) öffnet einen Dialog, um eine Zeilennummer einzugeben. Dorthin springt dann der Eingabecursor. Wer Exceptions per Mail zugeschickt bekommt, wird das Feature lieben.

Alle Implementationen eines Interfaces

Vor der Deklarationszeile eines Interfaces, abstrakter Klassen und überschriebener Klassen erscheint in der Zeilennummer ein kleines (i). Klickt man darauf, wird eine Liste aller bekannten Implementationen angezeigt. Per Klick kann man in die einzelnen Implementationen springen. Das ist nützlich, wenn man Interface erweitert (neue Methoden-Signaturen) und damit die Kassen angepasst werden müssen.

Editor maximieren

Eigentlich ist der Editor immer zu klein, zumindest geht es mir so. Der Doppelklick auf die Registerzunge zum Maximieren des Editors ist nett aber umständlich. Das Tastenkürzel Maximize Windows [Strg+ESC] ist da schneller. Entgegen des Namens setzt [Strg+ESC] die vergrößerte Registerzunge auch wieder zurück.

Generelle Probleme mit Tastenkürzel

Wer Ubuntu verwendet, wird mit allen Tastenkürzeln unglücklich werden, die mit Alt+Umschalt / Alt+Shift eingeleitet werden. Das klappt unter Ubuntu nicht, da Alt+Umschalt schon vom System belegt ist. Man muss diese Kürzel unter Tools -> Options -> Keymap ändern.

Nutzer deutscher Tastenlayouts kämpfen mit den Shortcuts, deren Keycodes sowieso per Umschalt / Shift zu erreichen sind (Komma, Semikolon, Stern) oder per AltGr (geschweifte und Eckige Klammern). Da muss man meistens die Zugriffs-Kürzel der Actions ebenfalls unter Tools -> Options -> Keymap anpassen.

Veröffentlicht unter NetBeans IDE | 1 Kommentar

BeanDev: New DZone Refcard for NetBeans 7.0 Platform

Hi!

The new updated Refcard #80 by Heiko Böck, Anton Epple, Miloš Šilhánek, Andreas Stefik, Geertjan Wielenga, and Tom Wheeler for the brand new NetBeans 7 Platform is published.

You can find many informations about the NetBeans Platform, a getting started intro, main features, NetBeans Platform modules,  NetBeans Platform APIs, reusable GUI components and  more.

In this Refcard, you are introduced to the key concerns of the NetBeans Platform so that you can save years of work when developing robust and extensible applications.

Six pages packed with many informations, download this Refcard #80 now!

Veröffentlicht unter NetBeans, NetBeans Plattform | Verschlagwortet mit , , , , | 1 Kommentar

IDEDev: Bundle-Key Hyperlinks im Editor Quelltext

Moin!

Bin gerade mit 1001 Sachen beschäftigt und habe mein Blog etwas vernachlässigt. Aber einen kleinen Tipp habe ich gerade zur Hand. In einem älteren Blogeintrag erwähnte ich die Fähigkeit, dass NetBeans in den 7′er Dev-Builds Bundle Einträge in ein Code-Fold bringen kann. Es wird dann der Wert des Standard-Bundle angezeigt.

Es gibt aber noch ein nettes Feature. Man kann mit der Strg-Taste + Mausklick nun auch direkt zur Bundle-Datei zum Schlüssel springen. Es funktioniert genau so, wie man auch zu Klassen, Methoden und Variablen-Deklarationen springen kann.

Mit dem Klick wird die Bundle-Datei geöffnet und der Cursor auf den Schlüssel gesetzt. Wenn man nun die Tastenkombination Strg+1 drückt, wird diese Bundle Datei auch im Project Explorer selektiert (soweit man nicht sowieso eine automatische Selektion aktiviert hat).

Beste Grüße!

Veröffentlicht unter NetBeans IDE | Verschlagwortet mit , , | 1 Kommentar

JavaFXDev: Screen capture tool with 200 lines and 500ms startup time

Hi!

Here is my next test with the JavaFX 2.0 ea release. I’ve created a 200-liner to capture parts from the desktop. The “Snipper” detects mouse dragging and two different key strokes (Escape and the letter ‘A’). The captured picture is automatically stored in the user.home/snapshot path.

Before I start to explain the code, I show a small picture about the different scene graph nodes:

At the bottom is the Desktop (I use only the primary screen, but it’s possible to detect all additional screens). The stage is created by the JavaFX Launcher class. I modify the stage to a transparent style and fullscreen mode. The scene (embedded in the stage) captures the mouse events (button pressed, released and dragging). The scene itself has a transparent fill color and contains one group with three different nodes. In the KeyPane-Node I capture the key events. The node is focusable and transparent to mouse events (any mouse event sinks down to the scene). GlassPane is a node with a Shape created by the screen bounds with a rectangular hole. This hole is calculated by the mouse gestures from the user. At last I’ve a visual representation for the user interaction: a red rectangular lasso node.

Weiterlesen

Veröffentlicht unter JavaFX | Verschlagwortet mit , , | 13 Kommentare

JavaFXDev: NetBeans Platform with JavaFX 2.0ea

Hi!

Alan O’Leary shows in his blog a WebView integration in Swing. It is a not good documented feature, how to integrate JavaFX 2.0 controls into a swing application. But an integration is a main goal for the JavaFX 2.0 release.

As an enthusiastic NetBeans Platform/RCP developer and JavaFX partner, I work since two days to marriage JavaFX 2.0 and a NetBeans Platform Application. And yes, it works :-)

I’ve created a maven based platform application with a special starter Main.class. I need to launch the JavaFX toolkit system before any other module bootstrapping. The solution here is based on the early access release through the JavaFX partner program. This “best practice” may change significantly between now and the final version. However, I’ll show only a concept, not compilable code.

The solution behind the bootstrapping a NetBeans Platform is based on a FAQ by Tom Wheeler. My Main.class is a JavaFX Application class – I need this Application instance to get rid of from invoke exceptions. The created Stage object by the Launcher can be ignored.

public class Main extends Application{

  private static final String NB_MAIN_CLASS = "org.netbeans.core.startup.Main";

  public static void main(String[] args) throws Exception {
    // do whatever you need here (e.g. show a custom login form)
    System.out.println("Launch Java FX");
    long ms = System.currentTimeMillis();

    Launcher.launch(Main.class, args); // This is the main start up for JavaFX 2.0

    System.out.println("Launched Java FX in " + (System.currentTimeMillis() - ms) + "ms");

    // once you're done with that, hand control back to NetBeans
    ClassLoader classloader = Thread.currentThread().getContextClassLoader();
    Class mainClass = Class.forName(NB_MAIN_CLASS, true, classloader);

    Object mainObject = mainClass.newInstance();
    Method mainMethod = mainClass.getDeclaredMethod("main", new Class[]{String[].class});
    mainMethod.invoke(mainObject, (Object) args);
  }

  @Override
  public void start(Stage stage) {
    // Nothing to do, forget the stage....
  }
}

The Main class is in a standard Java archive. This JAR file and all the JavaFX files must be in the platform/core folder.

At runtime all the core-Libs are available to the whole NetBeans Platform modules (and plugins). For the compiler I need a special dependency to the runtime:

<dependency>
 <groupId>sun.javafx</groupId>
 <artifactId>tools</artifactId>
 <version>2.0.0</version>
 <scope>system</scope>
 <systemPath>${basedir}/../../corelauncher/mainlauncher/src/main/lib/jfxrt.jar</systemPath>
</dependency>

The system path depends on your project structure.

Now I can access all the JavaFX classes in a NetBeans module.

Please note, any scene construction needs to be build up in the JavaFX event queue thread. This is not the EventDispatcher-Thread from Swing!

My favorite call to jump in the JavaFX event thread is: Toolkit.getDefault().defer (Runnable) javafx.application.Platform.runLater (Runnable). But the Toolkit class is in a com.* package. IMHO in the future we get an official way to do this.

The creation of a WebView component is pretty similar to the sample from Alan. But I don’t need a stage object:

    Platform.runLater(new Runnable() {

      @Override
      public void run() {
        group = new Group();
        Scene scene = new Scene(group);

        browser = new WebView(new WebEngine());
        browser.getEngine().addChangeListener(PropertyReference.WILDCARD, new ChangeListener() {

          @Override
          public void handle(Bean paramBean, PropertyReference paramPropertyReference) {
            if ("title".equals(paramPropertyReference.getName())) {
              EventQueue.invokeLater(new Runnable() {
                // Jump to Swing EventDispatcher...
                @Override
                public void run() {
                  BrowserTopComponent.this.setDisplayName(browser.getEngine().getTitle());
                }
              });
            }
            if ("url".equals(paramPropertyReference.getName())) {
              EventQueue.invokeLater(new Runnable() {
                // Jump to Swing EventDispatcher...
                @Override
                public void run() {
                  String url = browser.getEngine().getUrl();
                  tfUrl.setText(url);
                  addHistory(url);
                }
              });
            }
          }
        });

        group.getChildren().add(browser);
        group.setScaleX(0.8d);
        group.setScaleY(0.8d);
        Reflection r = new Reflection();
        r.setTopOffset(8);
        group.setEffect(r);

        scene.setFill(javafx.scene.paint.Color.BLACK);
        browser.setWidth(panel.getWidth());
        browser.setHeight(panel.getHeight());

        panel.setScene(scene);
      }
    });

    panel.addComponentListener(new ComponentAdapter() {
      @Override
      public void componentResized(ComponentEvent e) {
        Platform.runLater (new Runnable() {
          // Jump from Swing-EventDispatcher to the JavaFX Thread:
          @Override
          public void run() {
            browser.setWidth(panel.getWidth());
            browser.setHeight(panel.getHeight());
          }
        });
      }
    });

I’ve added some useful listeners. Please aware the switches between different threads (Swing and JavaFX).

The result is a beautiful NetBeans Platform application with an embedded JavaFX 2.0 WebView:

PS.: I like the Twitter message from Dean Riverson: “Ok, I call a moratorium on rotating and reflecting WebView…” (origin).  -

I have to write 100 times:

I’ll never rotate and reflect WebView again, I’ll never rotate and reflect WebView again,I’ll never rotate and reflect WebView again,I’ll never rotate and reflect WebView again,I’ll never rotate and reflect WebView again,I’ll never rotate and reflect WebView again,I’ll never rotate and reflect WebView again,I’ll never rotate and reflect WebView again,I’ll never rotate and reflect WebView again,I’ll never rotate and reflect WebView again, …
Veröffentlicht unter JavaFX, Maven, NetBeans Plattform | Verschlagwortet mit , , | 15 Kommentare

Training: Lingen/Ems – FH Osnabrück – NetBeans Platform Certified Training

Moin!

Letzten Donnerstag und Freitag war es mal wieder soweit, ein sehr intensives und hoffentlich für die Teilnehmer spannendes Training ist zu Ende gegangen.

In zwei Tagen haben wir (Geertjan und ich) mehr als 20 Teilnehmern, an der Fachhochschule Osnabrück Lingen/Ems, die NetBeans Plattform in einem Trainings-Kurs nahe gebracht. Es hat uns besonders gefreut, dass alle Anwesenden bis 18:00 am Freitag durchgehalten haben. Und nein, die Tür war nicht abgeschlossen ;) Weiterlesen

Veröffentlicht unter NetBeans Certified Platform Training | Verschlagwortet mit , , | Hinterlasse einen Kommentar

IDEDev: NetBeans 7 Beta2 und spezielles zu Git und JUnit

Moin!

Gestern kündigte ich ja die Beta2 zur NetBeans 7.0 IDE an. Zwei Dinge hatte ich da unterschlagen, die hier noch einer besonderen Erwähnung bedürfen.

Git

In der Beta2 kann man nun (ohne Plugin) git als Versionierungssystem nutzen. Der Git Plan im Wiki gibt schon einen recht guten Überblick, was funktioniert und worauf man noch warten muss.

Folgende Features sollten funktionieren:

Bis zum Finale ist noch einiges zu tun, gerade für das Distributing steht noch was aus (Repository Clone, Pull, Push, Fetch), die Vervollständigung der Branching und Merging Tools (Merge from Branch, Export uncommited changes (Local changes), Apply Patch) sowie Search history of files und eine Blame Integration.

JUnit

Trotz der verwirrenden und unterschiedlichen, teils negativen, Meldungen wird JUnit natürlich weiter von NetBeans unterstützt. Allerdings muss JUnit in Zukunft extra aus dem Plugin-Center geladen werden. Fest integriert ist nur ein Bridge-Modul zu JUnit. Unabhängig zu rechtlichen Vorgaben hat das in Zukunft vielleicht sogar Vorteile, wenn es um die Integration von anderen Unit-Tools geht (z.B durch eine einheitliche API).

Ich hoffe, dass heute der Download nicht so überlastet ist wie gestern. Viel Spaß mit NetBeans 7.

Beste Grüße,
Josch.

Veröffentlicht unter NetBeans, NetBeans IDE | Verschlagwortet mit , , | Hinterlasse einen Kommentar