# JAVAFX auf Raspberry Pi



## MF (9. Feb 2014)

Hallo,

ich möchte JavaFX auf dem Raspberry Pi zum Laufen bekommen - ich "hänge" jetzt fest.
In einem Oracle Video (und auch in anderen Blogs) steht, daß unbedingt

"-Djavafx.platform=egifb"

als Paramter gesetzt sein muß - sonst läuft JavaFX nicht. Offenbar ist es so selbstveständlich und jeder (außer mir!) weiß, wo dieser Paramter gesetzt werden muß. Im Java Code selbst ja wohl nicht. Ein UNIX Kommando ist es auch nicht und wohl auch kein Paramter für "java -jar .... " ?!
Wo setze ich das ?

Ich bekomme diese Fehlermeldung:


```
pi@raspberrypi ~/java $ sudo java -jar play.jar
Exception in thread "AWT-EventQueue-0" java.awt.HeadlessException:
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
        at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:207)
        at java.awt.Window.<init>(Window.java:535)
        at java.awt.Frame.<init>(Frame.java:420)
        at javax.swing.JFrame.<init>(JFrame.java:224)
        at com.javafx.main.Main$1.run(Main.java:816)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733)
        at java.awt.EventQueue.access$200(EventQueue.java:103)
        at java.awt.EventQueue$3.run(EventQueue.java:694)
        at java.awt.EventQueue$3.run(EventQueue.java:692)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:703)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
pi@raspberrypi ~/java $
```

Ich habe noch ein anderes grundlegendes Verständnisproblem:
Die Rasperry Pi "NOOBS" Debian Distribution kommt bereits mit Java 7  (build 1.7.0_40-b43
7) installiert - aber nicht mit JAVA 8 (early access). Mir ist nicht klar, ob JAVA 8 jetzt zwingend erfoderlich ist (ich dachte es ist erfoderlich, wundere mich aber daß die VM dies nicht direkt bemängelt s.o). Ich habe JAVA 8 auf dem Raspberry entpackt - wie stelle ich nun von 7 auf 8 um?
Und ... soweit ich weiß ist das NOOBS Debian mittlerweile OK für JAVAFX (Stichwort Linux Built: Software floating point). Oder ist das mein Fehler ?

Bin für jeden Hinweis (gerne auch aktuelle vollständige gute Anleitungen im Netz) dankbar.

Danke im vorraus & viele Grüße


----------



## turtle (10. Feb 2014)

Zum Raspberry kann ich nichts sagen, aber zur Fehlermeldung:



> No X11 DISPLAY variable was set, but this program performed an operation which requires it.



Du hast wahrscheinlich das Programm von der Kommandozeile ausgeführt, ohne eine grafische Oberfläche, nämlich X11.

Dies Modus bezeichnet man als headless, da Linux davon ausgeht, das keine vollwertige X11-Oberfläche läuft. 

Dieses ist sehr häufig der Fall, da ein Linux-Server in einem 19"-Rack steckt und überhaupt keine Konsole hat und wenn dann  nur eine textbasierte.

Du kannst versuchen X11 zu starten. 

```
startx
```


----------



## dzim (10. Feb 2014)

Doch, es ist ein Start-Parameter:
[c]java -Djavafx.platform=egifb -jar ...[/c]
Praktisch betrachtet setzt du damit eine System-Property, die du im Code z.B. über [c]System.getProperty("name");[/c]  abrufen kannst.
Ich weiss nicht , ob es geht, aber _theoretisch_ könntest du 
	
	
	
	





```
System.setProperty("javafx.platform", "egifb");
```
 auch in deiner Main-Klasse in deiner main-Methode einfügen *bevor* du da drin die launch-Methode aufrufst. Ob das wirklich klappt... Keine Ahnung, dass musst du mal probieren. Ich hab keinen RasPi.


----------



## MF (12. Feb 2014)

Hallo,

vielen Dank für die Antworten. Java FX auf der Himbeere schreibt - so wie ich es verstanden habe - direkt in den Grafikspeicher - d.h. die grafische Oberfläche muß nicht vorher gestartet werden. Habe X11 mal gestartet - und es funktioniert weiterhin noch nicht. Aber ich hatte mich schon gefragt wie man X11 überhaupt startet (wusste ich nämlich nicht) - jetzt weiss ich es.
Habe die Parameter jetzt beim Starten der VM mitangegeben - vielen Dank für den Hinweis. Ist laut Oracle Grundvorraussetung, daß es überhaupt läuft. Bin jetzt auf alle Fälle weiter ! Läuft zwar immer noch nicht - aber jetzt weiß ich, das es nicht daran liegt.

Werde wohl am WE Debian neu aufsetzen.

Nochmal Danke & viele Grüße


----------



## MF (15. Feb 2014)

Java 8 (z.Z noch als early access) muß auf dem Raspi installiert sein :

```
pi@raspberrypi ~/java $ java -version
java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b128)
Java HotSpot(TM) Client VM (build 25.0-b69, mixed mode)
```
Dann läuft es.


----------



## Schmetterhand (13. Aug 2015)

Falls du etwas mit 3D-Graphik machst, mußt du unbedingt beim Aufruf deines JFX-Programmes den Schalter "-Dcom.sun.javafx.experimental.embedded.3d=true" übergeben, sonst läuft keine 3D-Graphik auf der eingeschränkten OpenGL-ES-2.0-Hardware des Raspberry Pi.
Ansonsten kannst du zusätzlich noch den Schalter "-Dprism.verbose=true" übergeben, dann gibt Java noch verschiedene Zusatzinformationen zu deiner (Graphik-)Hardware, ob V-Sync aktiviert ist, etc. aus.

Versuche auf jeden Fall mal, dein Programm aus einer Kommandozeile im X11 zu starten, d.h., wenn du angemeldet bist.


----------



## Tom299 (14. Aug 2015)

Ich hatte auf meinem Pi2 bis jetzt nur Kodi, um auf TV Streams zu sehen (vornehmlich Amazon Prime Instant Video). Da ich mir aber einen Fire TV Stick zugelegt habe, liegt der Pi2 wieder unbenutzt im Wohnzimmer. Wollte aber demnächst mal https://ubuntu-mate.org/raspberry-pi/ installieren, und dann auch JavaFX darauf testen. Ob ich dann diesen o.g. Parameter brauche, werde ich sehen. Aber Danke schon mal für die Info


----------

