Möglichst "guter" Einstieg gesucht

Ich will mit einem Testprojekt gerne einmal in Java FX reinschnuppern, um nicht den Anschluss zu verlieren. Seit einigen Jahren schon programmiere ich unsere Oberflächen mit Swing (dank UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); sieht es auch recht vernünftig aus).

Mein Eclipse ist offenbar schon modern genug, Java FX mitzubringen, zumindest kann ich über File > New > Project Java FX Project auswählen, dort gibt es zwei Varianten:

a) Java FX Library Project
b) Java FX Project

Da stellt sich mir die Frage, was unterscheidet diese? Auch wenn vermutlich b) für ein neues, eigenständiges Projekt richtig sein wird.

Mit etwas suchen habe ich hier im Forum folgende Links gefunden:

[ul]
[li] Client Technologies: Java Platform, Standard Edition (Java SE) 8 Release 8
[/li][li] Getting Started with JavaFX: About This Tutorial | JavaFX 2 Tutorials and Documentation
[/li][li] JavaFX 8 Tutorial | code.makery.ch
[/li][/ul]

Eine eigene Suche lieferte:

[ul]
[li] http://carl-zeiss-gymnasium.de/fachbereiche/mathematik-und-naturwissenschaften/informatik/materialien/programmieren-mit-javafx/Anleitung_JavaFXProjekt.pdf
[/li][li] www.soziotech.org/howto-erste-schritte-mit-javafx-2-0/
[/li][li] … google listet da sehr viel auf
[/li][/ul]

Aber ich habe auch Warnungen der Form

im Ohr. Genau sowas würde ich natürlich gar nicht erst lernen wollen. Also übertragen sowas wie extends JFrame oder solche Dinge.

Gibt es hierzu (weitere) Empfehlungen? Deutsch wäre schön, englisch geht aber auch. Bücher wären natürlich prinzipiell auch möglich.

Ich habe zu Swing inzwischen eine ganze Toolbox (in einem eigenen Projekt) mit verschiedensten Dingen, die ich immer wieder brauche. Bei Java FXfange ich natürlich bei Null an. Aber ich wüsste gern vorher, ob bestimmte Dinge auch damit gehen, wie

  • Zeichnen auf „JPanels“ inkl. Reaktion auf Maus, …
  • Sich selbstzeichnende Buttons mit Symbolen (findet in void paintComponent(Graphics graphics) statt).
  • Eine GlasPane, die alles abdeckt und dabei einen Text und eine Stoppuhr anzeigen kann.
  • Menüs mit Anzeige der Tastenkombinationen.
  • Abfangen von bestimmten Tasten in Dialogen und Reaktion darauf.
  • Dialoge zum Öffnen / Öffnen von Verzeichnissen / Vorgabe von Dateiendungen / Speichern ,… wird es ja wohl hoffentlich eh schon geben.
  • Fortschrittsbalken

Also zu Tutorials kann ich dir leider wenig sagen (ich hab vieles per learing by doing gemacht).
Aber zu deinen Fragen der Möglichkeit (nicht deine Reihenfolge):

  • Fortschrittsbalken oder auch ProgressIndicator

  • Zeichnen hab ich persönlich nicht direkt gemacht (weiß auch nicht wie es damit aussieht) aber für sowas kannst du direkt Klassen für verschiedene Formen z.B. Rectangle die man auf ein Parent “klatschen” kannst. Diese Formen haben auch direkt Methoden um Handler für Events anzufügen.

  • Selbstzeichnende Buttons: Weiß jetzt nicht ob es dir eventuell reichen würde einfach ein “Bild” zu nehmen aber es sollte auch gehen (von der API her jedenfalls) ein Parent zu basteln mit den sachen drauf “gezeichnet” und das als Grafik zu nehmen setGraphic. Eigene Komponenten machen kann (ich hab dafür mal was iwo gelesen) relativ Aufwendig sein aber kann dazu nichts genaues sagen.

  • Die Sache mit dem extends JFrame sollte, wenn du mit einer FXML Datei arbeitest nicht der Fall sein, weil es so keinen Grund dafür gibt bzw man eher nicht in die Versuchung kommt. (Ich hab schon ewig nichtmehr ohne FXML was gemacht was JavaFx angeht)

  • Menüs gehen auch soweit wie eigentlich in Swing (auch mit anzeige der Kürzel, wie diese sich genau Verhalten hab ich grad nicht im Gedächtnis) allerdings musst du darauf achten das eine MenuBar eine eigene Komponente ist und nicht automatisch oben angefügt wird. Heißt man kann mehrere Menüs an verschiedenen Stellen haben

  • Dialoge gibts auch für Dateien und Ordnerl. Seit ich glaube 1.8 u40 gibt es auch eine eigene Dialog API (davor gabs das nicht und man konnte auf ControlsFX zurückgreifen. Btw eine sehr umfangreiche Bibliothek für JavaFX Gui’s.)

-Glaspane bin ich mir jetzt nicht sicher wie du das meinst/dir vorstellst aber es wird sicher einen Weg dafür geben

Was für dich vllt. noch interessant ist vom Wechsel von Swing auf JavaFX sind die Layout Sachen. In JavaFX gibt es keine direkten Layoutmanager mehr sondern Panes, die das Layout vorgeben. Diese können aber wie gewohnt geschachtelt werden. Z.b. statt dem BorderLayout gibt es das BorderPane

Ich hoffe ich konnte dir ein wenig Helfen und falls du Fragen hast versuch ich gerne sie zu beantworten

Edit: Eine, wie ich finde, recht nette Sache ist, dass eigentlich alles was mit der Gui zu tun hat ein Node ist und man dadurch Sachen wie Animationen auf alles anwenden können sollte

MfG
Clayn

P.S. Frag mich nichts zu Eclipse^^

Migration von Swing nach JavaFX am Beispiel twitter4j-swing-sample. Wichtige Erkenntnis: Beides ist in einer Anwendung vereinbar via JFXPanel(FX in Swing) und SwingNode(Swing in FX)

afterburner.fx ist ein minimalistisches Framework und gute Orientierung zur Strukturierung größerer Anwendungen.

Afterburner.fx The Opinionated JavaFX Productivity Igniter

hansolo - Gerrit Grunwald programmiert Uhren in JavaFX. Möchte man etwas über das Zeichnen erfahren, dann ist das eine gute Anlaufstelle für Inspiration und Source-code.

Harmonic Code

Wichtige Erkenntnis meinerseits ist, dass viele, viel zu viel im SceneBuilder machen, dass besser mit CSS bewerkstelligt wird. Setzen der Größe im SceneBuilder zum Beispiel.

Inzwischen kann man vielerorts von Java 8 ausgehen, so dass JavaFX bereits vorhanden ist. Das einfachste ist also sicherstellen das Java 8 verwendet wird und es damit auch jedes beliebige Java 8 Projekt tut (z.B. Maven-Projekt), bei dem FXML-Dateien im Build vorhanden sind.

Properties und Bindings ist ein sehr wichtiger Punkt, der einen großen Fortschritt von Swing zu JavaFX bedeutet.

Ich nutze das für Buttons, die etwa Pfeile, Kreuze oder derartiges darstellen und bei denen das Symbol sich abhängig von der Größe des Buttons anpasst. Durch das Zeichnen ist das leicht möglich, ein Bild hätte nicht den gleichen Effekt.

Zur Verdeutlichung eine der Zeichenmethoden aus einem dieser Buttons:

     * Zeichnet das Symbol in horizontaler Anordnung.
     *
     *    1                   7--8
     *  6   .                 |  |
     *    .   .               |  |
     *       .   .            |  |
     *         .    .         |  |
     *           5     2      |  |
     *        .    .          |  |
     *      .   .             |  |
     *    .  .                |  |
     *  4   .                 |  |
     *    3                  10--9
     */
    @Override
    protected void paintHorizontalSymbol() {
        int delta = 6;  // Abstand von den Buttonkanten.
        int off = 4;    // Breite rechts.
        int xOff = 3;   // Abstand zwischen er linken oberen Delta-Ecke und Punkt 1.
        int yOff = 3;   // Abstand zwischen er linken oberen Delta-Ecke und Punkt 6.
        int middleOff = 7;   // Abstand zwischen Punkt 5 und Punkt 2
        int left = delta;
        int right = getWidth() - delta - 1;
        int upper = delta;
        int lower = getHeight() - delta - 1;
        int hightCenter = getHeight() / 2;

        int[] xpoints = {
                left + xOff,                 //  1
                right - off,                 //  2
                left + xOff,                 //  3
                left,                        //  4
                right - off - middleOff,     //  5
                left,                        //  6
        };
        int[] ypoints = {
                upper,          //  1
                hightCenter,    //  2
                lower,          //  3
                lower - yOff,   //  4
                hightCenter,    //  5
                upper + yOff,   //  6
        };

        Polygon polygon = new Polygon(xpoints, ypoints, xpoints.length);
        graphics2.fillPolygon(polygon);
        int[] xpointsBar = {
                right - off, //  7
                right,       //  8
                right,       //  9
                right - off, // 10
        };
        int[] ypointsBar = {
                upper,       //  7
                upper,       //  8
                lower,       //  9
                lower,       // 10
        };
        Polygon polygonBar = new Polygon(xpointsBar, ypointsBar, xpointsBar.length);
        graphics2.fillPolygon(polygonBar);
    }

*** Edit ***

Die setzt man über

        rootPane.setGlassPane(glassPane);```

Ich verwende dafür eine angepasste Variante von: [Disabled Glass Pane « Java Tips Weblog](http://tips4java.wordpress.com/2008/11/07/disabled-glass-pane/)

Zeichnen geht mit Canvas.

Working with Canvas | JavaFX 2 Tutorials and Documentation

Sollte die meisten Fragen dazu klären.

[QUOTE=ionutbaiu]Zeichnen geht mit Canvas.

Working with Canvas | JavaFX 2 Tutorials and Documentation

Sollte die meisten Fragen dazu klären.[/QUOTE]

Das kannte ich beispielsweise noch nicht.
Damit sollte dann jedenfalls das mit den Buttons möglich sein was du möchtest (du musst halt schauen wie du an breite und höhe etc. kommst) indem du ein Canvas machst und das dem Button als Graphics gibst

Danke, das schaue ich mir mal an. Auch der Tipp, mit einem ganz normalen Projekt zu arbeiten, scheint mir gut.

Könntes auch mal Blick zu NetBeans werfen.

https://netbeans.org/kb/trails/matisse.html?utm_source=netbeans&utm_campaign=welcomepage