# Problem beim JavaFX installieren



## 123Guy (26. Aug 2020)

*Hi liebe Community,
seit ein paar Monaten bringe ich mir das Programmieren in Java bei. Dazu benutze ich Eclipse.
Da ich mir für meine Programme nun auch eine grafische Overfläche basteln möchte, versuche ich JavaFX zu installieren.

Ich benutze das Java SE 14.0.2 unter Windows 10 x64 und die Eclipse IDE 2020-06 (Eclipse IDE for Java Developers).

Prinzipiell sollte ich ja nun in Eclipse über "Help" -> "Install new Software" das JavaFX Paket einbinden können.
Dazu unter "Work with" -> "2020-06 - http://download.eclipse.org/releases/2020-06" auswählen und nach "e(fx)clipse" suchen...




Anschließend sollte nun die Datei auswählbar sein, ist sie bei mir aber nicht!
Bei mir kommt folgendes:

Prinzipiell vielleicht nicht schlimm wenn es halt anders heißt dachte ich mir...

Wenn ich das installiere habe ich aber offensichtlich nicht das richtige Paket installiert, denn ein JavaFXProjekt kann ich damit nicht öffnen:




Mein nächter Gedanke war einfach den Link aus dem ersten Bild manuel hinzuzufügen und die e(fx)clipse IDE von Oxygen zu installieren.
Gefunden habe ich diese auch sofort aber schon bei der installation scheint etwas nicht zu passen, was ja vielleicht auch logisch ist wenn ich eigentlich garnicht eclipse oxygen habe:



naja nichts desto trotz, eclipse wirft das zuvor installierte runter und pakt die javaFX version von oxygen drauf!

Hurra, unter "new Project" ist tatsächlich "JavaFX" auswählbar also erstelle ich ein neues "JavaFX Project".
Das Projekt wird erstellt und ist mit Quelltest gefüllt wie es sein sollte nur meckert der Kompiler von oben bis unten.



Habe ich irgendwelche Bibliotheken vergessen? Ist die e(fx)clipse für oxygen nicht mit eclipse 2020-06 kompatibel?
Habe auch versucht eclipse oxygen runterzuladen und es damit zu versuchen, leider das gleich problem...

Im Videotutorial dazu hat es geklappt ohne zusätzliche Bibliotheken einzubinden, nur mit dem Quelltext den sich eclipse selber zusammenbastelt und auf Ausführen sollte im normalfall ein leeres fenster erscheinen!*


----------



## kneitzel (26. Aug 2020)

Das  *e(fx)clipse* dürfte nur eine Integration von JavaFX (openJFX) in Eclipse sein. Du benötigst aber auch noch das JavaFX selbst und musst dann die Modulpfade bereit stellen.

https://openjfx.io/openjfx-docs/ erläutert die Möglichlkeiten / Optionen sehr gut wie ich meine. Ich selbst würde eigentlich immer dazu raten, den Build über Gradle oder Maven zu machen und sich so einiges an Konfiguration und Installation zu ersparen. Aber das sollte jeder für sich entscheiden.

Für dich wäre der Teil "JavaFX and Eclipse" interessant und wichtig. Es erläutert auch die Installation + Eintragen der Pfade, was ich oben als erstes erwähnt habe.


----------



## 123Guy (26. Aug 2020)

*"JavaFX is included with the standard JDK and JRE bundles "*
damit dürfte das JavaFX herunterladen und Pfade eintragen doch eigentlich entfallen und der Zugriff müsste direkt über eclipse gewährleistet sein...
und das ist es ja auch nachdem ich die Adresszeile händisch geändert habe und auf der Seit von oxygen runtergeladen habe...

ich kann nur mit den fehlermeldungen noch nichts anfangen, versuche ich troz fehler das programm auszuführen kommt z.B diese fehlermeldung:
*Error: Unable to initialize main class application.Main
Caused by: java.lang.NoClassDefFoundError: Stage*


----------



## kneitzel (26. Aug 2020)

Ich weiß nicht, wo du diese Aussage gefunden hast, aber das galt nur bis JDK 8. Und das erklärt auch die Probleme: Da JavaFX nicht installiert ist, kann er die Klassen nicht finden. Stage ist eine JavaFX Klasse und die Fehlermeldung besagt schlicht: Klasse nicht gefunden.


----------



## mrBrown (26. Aug 2020)

JustNobody hat gesagt.:


> Ich weiß nicht, wo du diese Aussage gefunden hast, aber das galt nur bis JDK 8.


Eigentlich galt und gilt das nur für bestimmte Distributionen, „Standard“ war das nie. Gibt ja immer noch einige, die’s enthalten.


----------



## Einsal (31. Aug 2020)

https://openjfx.io/openjfx-docs/ erläutert die Möglichlkeiten / Optionen sehr gut wie ich meine. Ich selbst würde eigentlich immer dazu raten, den Build über Gradle oder Maven zu machen und sich so einiges an Konfiguration und Installation zu ersparen. Aber das sollte jeder für sich entscheiden.




Dieser Link hat mir sehr geholfen, auch wenn ich lange dafür gebraucht habe das es funktioniert. Danke @JustNobody


----------



## Einsal (1. Sep 2020)

Noch eine Frage. Wo kann ich den Scene Builder herunterladen? Eine Anleitung habe ich bereits im Internet gefunden, aber der Link führt mich auf die Oracle Seite. Um ihn da herunter zu laden benötige ich jedoch einen Firmen ACC, den ich nicht besitze. 
Will aber auch nicht von irgend einer Seite herunterladen.


----------



## kneitzel (1. Sep 2020)

Das Tool wurde Open Source und Gluon bietet ihn in aktuellen Versionen an und entwickelt ihn weiter.









						Products - Gluon
					

Overview Gluon develops Java-based solutions. We are laser-focused on realizing the dream of ‘write once, run anywhere’ Java for a new generation of mobile devices. Our Gluon Mobile library can massively improve time-to-market for applications, by providing APIs for modern ‘material design’ user...




					gluonhq.com


----------



## Einsal (1. Sep 2020)

Danke für die schnelle Antwort. Das Herunterladen hat Funktioniert und das einbinden auch. Leider kann ich meine Datei aus Eclipse nicht mit den Scene Builder öffnen. Der Fehler der kommt:
scene builder open operation has failed. Make sure that the choose file is a valid FXML document.
Ich habe mich an ein Tutorial von Youtube gehalten, was erklärt wie JavaFx funktioniert.
Habt ihr vielleicht eine Lösung für mein Problem, bzw einen Hinweis wo ich den Fehler gemacht habe?


----------



## kneitzel (1. Sep 2020)

Wie sieht denn die fxml Datei aus? Wie heißt diese und was ist der Inhalt?

Du kannst ansonsten den Scene Builder auch direkt starten und eine neue Datei erstellen und dann schauen, ob das Speichern / laden generell klappt. Eclipse selbst nutze ich nicht, daher kann ich da zur Einbindung nicht viel sagen...


----------



## Einsal (1. Sep 2020)

```
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.AnchorPane?>

<AnchorPane xmlns:fx="http://javafx.com/fxml/1">
    <!-- TODO Add Nodes -->
</AnchorPane>
```

Das ist das Automatisch generierte von Eclipse. In dem Tutorial öffnet er sie in Eclipse einfach mit Rechtsklick und Open with scene builder.
Dabei öffnet er sich.

Dateien nur mit den Scene Builder speichern und laden funktioniert.


----------



## Einsal (1. Sep 2020)

Habe jetzt den Fehler mehr oder weniger gefunden. Habe einfach ein neues FXML in Eclipse erstellt und das alte gelöscht. Nun funktioniert es 
Danke Für die Hilfe, ohne @JustNobody wäre ich nicht so weit gekommen


----------



## Einsal (1. Sep 2020)

Jetzt öffnet sich mein Fenster nicht und es kommt kein Fehler.
Ich poste mal hier den Code, vielleicht kann mir wieder jmd helfen.

*Die MAIN*


```
package application;
    
import java.io.IOException;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.BorderPane;


public class Main extends Application {
    
    private Stage primaryStage;

    @Override
    public void start(Stage primaryStage) {
        this.primaryStage = primaryStage;
        
        
    }
    
    public void mainWindow() {
        
        try {
            FXMLLoader loader = new FXMLLoader(Main.class.getResource("MainWindow.fxml"));
            AnchorPane pane = loader.load();
            
            primaryStage.setMinHeight(400.00);
            primaryStage.setMinWidth(400.00);
            
            MainWindowController mainWindowController = loader.getController();
            mainWindowController.setMain(this);
            
            Scene scene = new Scene(pane);
            
            primaryStage.setScene(scene);
            primaryStage.show();
            
        } catch (IOException e) {
            
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        launch(args);
    }
}
```

*Der MainWindowController*


```
package application;

import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;

public class MainWindowController {
    
    // Views
    
    private Label label;
    private TextField field;
    

    
    public Main main;
    
    public void setMain(Main main) {
        this.main = main;
        
        
    }
    
    @FXML
    public void handlestartB() {
        
    }
    
    @FXML
    public void handleladenB() {
        
    }
    
    @FXML
    public void handleschliesenB() {
        
        
    }
    
}
```

*Das MainWindow.fxml*


```
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>


<AnchorPane prefHeight="400.0" prefWidth="500.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/11.0.1" fx:controller="application.MainWindowController">
   <children>
      <VBox alignment="CENTER" layoutY="100.0" spacing="20.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
         <children>
            <Label fx:id="label" text="Label" />
            <HBox alignment="CENTER">
               <children>
                  <TextField fx:id="field" alignment="CENTER" prefHeight="26.0" prefWidth="335.0" />
               </children>
            </HBox>
            <VBox alignment="TOP_CENTER" spacing="20.0">
               <children>
                  <Button fx:id="startB" mnemonicParsing="false" text="START" />
                  <Button fx:id="ladenB" mnemonicParsing="false" text="LADEN" />
                  <Button fx:id="schliesenB" mnemonicParsing="false" text="SCHLIESEN" />
               </children>
            </VBox>
         </children>
      </VBox>
   </children>
</AnchorPane>
```


----------



## mrBrown (1. Sep 2020)

Welche Methoden werden denn so aufgerufen im Laufe des Programms und in welcher davon soll das Fenster angezeigt werden? =)


----------



## Einsal (1. Sep 2020)

Danke für die schnelle Antwort.
Eigentlich verfolge ich momentan nur ein Tutorial auf Youtube, wo erklärt wied wie FX funktioniert. Ist leider schon etwas älter und in diesen war JavaFX und der SceneBuilder bereits vorhanden. Leider musste ich über einige Umwege das alles erst in Eclipse irgendwie einbinden.
Das hat mich schon einige Zeit und nerven gekostet 😅
Jetzt klappt alles soweit nur beim Ausführen (Run) öffnet sich kein Fenster, aber bei den Tutorial klappt das. Habe jetzt mehrfach nochmal alle Schritte nachvollzogen die in dem Video erklärt wurden und ich habe  es identisch, dennoch öffnet sich das Fenster nicht.
Ich vermute es könnte daran liegen das ich den Scene Builder und FX nachträglich erst einfügen musste und das Ausführen nur wie in diesem Artikel beschrieben Funktioniert

*3. Fügen Sie VM-Argumente hinzu*
Um das Problem zu Run -> Run Configurations...  -> Java Applicationbeheben , klicken Sie auf , erstellen Sie eine neue Startkonfiguration für Ihr Projekt mit dem Namen "hellofx" und fügen Sie die folgenden VM-Argumente hinzu:


Windows

--module-path "\path\to\javafx-sdk-14\lib" --add-modules javafx.controls,javafx.fxml


Ich hoffe ich habe mich verständlich ausgedrückt 😅


----------



## sascha-sphw (1. Sep 2020)

Schau mal ob das in dem Tutorial nicht so aussieht.

```
@Override
public void start(Stage primaryStage) {
    this.primaryStage = primaryStage;
    
    mainWindow();
}
```


----------



## Einsal (1. Sep 2020)

ist Identisch mit dem Video. Was vermutest du was da falsch sein könnte?


----------



## kneitzel (1. Sep 2020)

Einsal hat gesagt.:


> ist Identisch mit dem Video. Was vermutest du was da falsch sein könnte?



Dann schau es Dir mal in Deiner Klasse an 

Oder in anderen Worten: Ein Teil (Aufruf mainWindow()) fehlt bisher bei Dir. Daher passiert nichts.

Edit: Aussage, was fehlt, konkretisiert.


----------



## Einsal (1. Sep 2020)

Es funktioniert. Ich Blödmann. Tausendmal das Video angeschaut und verglichen und jedes mal übersehen. Manchmal sieht man den Wald vor lauter Bäumen nicht 😣
Danke sehr


----------



## kneitzel (1. Sep 2020)

Ja, das ist leider normal. Gibt das Video nicht auch einen Link zu den Sourcen auf GitHub oder so? Dann ersparst Du Dir das Abtippen und damit auch so Fehler. (Sowas kann immer sehr deprimierend sein und hält einen natürlich lange auf ...)


----------



## Einsal (1. Sep 2020)

Das gibt es bestimmt, aber (so doof das auch klingt) Ich möchte abtippen um zu lernen und Fehler machen weil auch daraus (vielleicht sogar am besten daraus) lerne ich es  😅 
Ich habe schon ein Haufen Fehler gemacht und die meisten habe ich (wenn auch nach langen suchen und viel Zeit investieren) gefunden und werde sie nicht wiederholen.


----------

