einfaches Fenster öffnen scheitert

OZAN86

Mitglied
Hallo schönen Abend bei mir scheitert es schon an einem einfachen Fenster, obwohl ich alle libraries eingebunden habe.

könntet ihr mal schauen was ich anders machen kann damit es läuft?!

danke schon mal!!
Java:
package youtube.fx;

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Label;

public class Youtubefx extends Application {

    public static void main(String[] args) {
        launch(args);

    }

    @Override
    public void start(Stage stage) throws Exception {
        Label hello = new Label ("hello JavaFX");
        Scene scene = new Scene(hello, 300, 300);
        stage.setScene(scene);
        stage.show();
        
    }

}

Java:
module youtubeFX {
    requires java.desktop;
    requires javafx.controls;
    requires javafx.graphics;
    requires javafx.base;
    
    opens youtube.fx to javafx.base, javafx.controls, javafx.graphics;
}
 
rechtsklick neues JavaProjekt
unbedingt mit module info erzeugen
dann rechtsklick auf das fertige projekt -> configure -> add maven nature

dann schaust du in die erzeugte datei die "pom.xml" heißt und fügst das da ein


Java:

XML:
<properties>
<java.version>17</java.version>
<javafx.version>${java.version}</javafx.version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.openjfx/javafx-controls -->
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>${javafx.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.openjfx/javafx-graphics -->
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-graphics</artifactId>
<version>${javafx.version}</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-base</artifactId>
<version>${javafx.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.openjfx/javafx-web -->
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-web</artifactId>
<version>${javafx.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.openjfx/javafx-fxml -->
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>${javafx.version}</version>
</dependency>
</dependencies>
ungefähr ist die stelle da ->

Java:
Code:
           <project>
// das generierte zeug ...

// hier einfügen in der zeile zwischen der letzten generierten zeile und bevor project schließ tag
</project>

dann auf module info klicken
und diese zeile einfügen

requires javafx.graphics;

die requires sachen werden dir später dann eh vorgeschlagen von eclipse ... efxclipse kannst du in der pfeife rauchen
deine main klasse die du dir erstellst, musst du als "exports DEINEMAINKLASSE;" ... halt da den klassennamen einsetzen
 
das ganze ist der bessere weg ein javafx projekt anzulegen.. buildpath zu nutzen ist zum kotzen und nicht modern und schwer
 
Generell ein paar Bemerkungen von meiner Seite:

1. Es gibt eine super Dokumentation: Getting Started auf openjfx.io: https://openjfx.io/openjfx-docs/ - Wenn, dann sollte man dem folgen. Dort findet man neben den generellen Grundlagen auch Informationen, wie ein Projekt einzurichten ist.

2. Ich würde generell empfehlen, auf Maven oder Gradle zu setzen und keine reinen Eclipse Projekte zu machen. Die vielen diversen Gründe dafür werde ich hier nicht erneut im Detail erläutern.

3. Dieses "opens" in der module-info.java
das gehört da gar nicht rein ( ich weis nicht was das to macht )
ist eine Aussage, die ich nicht nachvollziehen kann. Keine Ahnung, was es macht, aber es gehört da nicht rein?
Mit opens wird der Namespace des Modules für deep reflection geöffnet. Dies ist für gewisse Zugriffe per Reflection notwwendig. Ein Beispiel ist der FXMLLoader, der den Controller erzeugt und auswertet. Daher ist so eine opens Anweisung spätestens dann notwendig, wenn per FXMLLoader eine fxml mit eingetragenem Controller geladen wird. (Ich gebe aber in der Regel generell frei und nicht nur für spezifische Module. Also jedes exports bekommt bei mir sogar ein opens.
 
Gut zu wissen danke noch eine Frage in dem Sample im GitHub ide eclipse auswähle erscheint eine Auswahl mit modular und non modular ist das wichtig für mich? Wenn ich rein schauen sehen beide identisch aus!?
 
Da ist der Unterschied, ob man eine module-info.java Datei hat oder nicht. Das ist das Modulsystem von Java, das eingeführt wurde mit Java 9. Ohne diese Datei hast Du ein "unnamed Modul", für das es paar spezielle Regeln gibt. Wenn Du auch mit fxml Dateien arbeiten willst, dann kann es Sinn machen, mit module-info.java Datei zu arbeiten, auch wenn Du dann explizit andere Module einbinden musst. (Darüber wäre das Öffnen Deines Moduls für andere Module einfach möglich).
 
hier mein pom
Code:
project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>FXtest</groupId>
  <artifactId>FXtest</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <release>15</release>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <properties>
<java.version>17</java.version>
<javafx.version>${java.version}</javafx.version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.openjfx/javafx-controls -->
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>${javafx.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.openjfx/javafx-graphics -->
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-graphics</artifactId>
<version>${javafx.version}</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-base</artifactId>
<version>${javafx.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.openjfx/javafx-web -->
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-web</artifactId>
<version>${javafx.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.openjfx/javafx-fxml -->
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>${javafx.version}</version>
</dependency>
</dependencies>
</project>
 
wenn eclipse nicht an der pom nörgelt und die pakete in deinem "maven dependencies" ordner im projekt liegen ( an dem erstmal selber nicht rum wurschteln ) hast du nur das exports noch verbeutelt
 
Das fehlerhafte exports wurde von @yfons123 richtig erkannt und aufgezeigt. Da werden namespaces angegeben und der Namespace ist bei Dir fxtests.

Was mir im Augenblick etwas auffällt (Was für den Start der Applikation aus der IDE aber vermutlich uninteressant ist):

a) Maven hat ein Grundsatz: "Convention over configuration". Es gibt also sehr viele "Conventions", also Abkommen, wie etwas gemacht werden sollte. Dadurch verringert sich die Konfiguration, die benötigt wird. Und das bringt den großen Vorteil, dass man Konfigurationsteile meist sehr gut kopieren und sehr einfach anpassen kann. Da sollte man nicht von abweichen, so es nicht notwendig ist.
Bei Dir ist mir das <sourceDirectory>src</sourceDirectory> diesbezüglich aufgefallen. Das sollte weg und statt dessen solltest DU Deinen Code in src/main/java/ verschieben.
Problematisch kann es werden, wenn Du dann später auch noch fxml Dateien oder andere Ressourcen hinzufügen willst. Die müssen bei Dir weiterhin unter src/main/resources. Das kann man auch umsetzen auf src aber dann müsste man auch noch ein Exclude für alle *.java Dateien machen. (Eclipse kann für Eclipse Projekte eine POM erstellen - da hat man sowas dann. Aber das ist alles andere als gut und ich würde jedem am Anfang raten, sich an die Abkommen zu halten.

b) Du hast kein default Encoding gesetzt. Das gibt zumindest Warnungen und kann auch zu Problemen führen. Es ist anzuraten, immer das Encoding der Dateien zu setzen. In den Properties wäre dies ein Eintrag wie <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

c) Bei JavaFX mit Java >8 gibt es einige Änderungen, die wichtig sind. Über eine bist Du schon gestolpert: Module. Die andere ist, dass die runnable Jar eigentlich durch ein JLink (und ab 14 erweitert um JPackage) ersetzt wurde. Es wird dabei ein Verzeichnis erzeugt, das alles enthält, das man zur Ausführung braucht. Das kann bei JavaFX mit dem openjfx Plugin erfolgen. Das hast Du aber noch nicht eingebunden.

Du hast als Entwicklungsumgebung zwar Eclipse im Einsatz aber Dein Projekt ist ein Maven Projekt. Daher solltest Du in der genannten Dokumentation rein der Maven Dokumentation folgen und da findest Du dann auch, wie das Plugin eingebunden werden soll. Eclipse sollte dann rein mit dem Maven Projekt arbeiten, d.h. Du musst da keinerlei separaten Dinge einbinden. Das Maven Projekt alleine reicht voll und ganz. Der Start des Programmes läuft dann z.B. auch über ein maven Befehl: mvn javafx:run

An der stelle nur ein kleiner Hinweis: Wenn Du irgendwann einmal Abhängigkeiten nutzen willst, die ohne Modulbeschreibung daher kommen, dann hat dieser Ansatz leider Grenzen. Da wird das openjfx Plugin ersetzt durch andere Plugins, aber das bringt einiges an Komplexität mit, so dass ich das an dieser Stelle erst einmal ignorieren würde. Da sollte es nur der Hinweis sein, dass dann meist auf das moditect Plugin zurückgegriffen wird. Da würde Dir - sollte da jemals der Bedarf aufkommen - dir jemand hier im Forum eine POM zu bauen können.

Das einfach nur als ein paar kleine Anmerkungen von meiner Seite.
 

Zurück
Oben