# java.fxml.load.exception und keine automatische Aktualliseriung der Mainausgabe



## Steiner2023 (13. Jun 2017)

Hallo ihr Lieben,

1) Wie kann ich auf Eclipse einstellen, dass ich die Main abspielen möchte, die gerade ausgewählt ist? Ich muss immer extra bei run configurations den Projekte- und Klassenpfad neu per Hand eingeben.

2) Ich glaube bei meiner Main habe ich irgendwas falsch, sodass sich das Programm immer wieder als normales Fenster öffnet, ohne dass die fxml Datei berücksichtigt wird, aber ich sehe einfach nicht was.

3) Wenn ich folgenden Code compilen möchte kommt die Fehlermeldung

javafx.fxml.LoadException: 
/C:/Users/GT72VR/Desktop/Java/Workspace/Calculator/bin/application/MasterMain.fxml
 at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
 at javafx.fxml.FXMLLoader.importClass(FXMLLoader.java:2848)
 at javafx.fxml.FXMLLoader.processImport(FXMLLoader.java:2692)
 at javafx.fxml.FXMLLoader.processProcessingInstruction(FXMLLoader.java:2661)
 at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2517)
 at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
 at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409)
 at application.Main.start(Main.java:16)
 at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
 at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
 at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
 at java.security.AccessController.doPrivileged(Native Method)
 at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
 at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
 at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
 at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
 at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: com.gluonhq.charm.glisten.control.TextField
 at java.net.URLClassLoader.findClass(Unknown Source)
 at java.lang.ClassLoader.loadClass(Unknown Source)
 at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
 at java.lang.ClassLoader.loadClass(Unknown Source)
 at javafx.fxml.FXMLLoader.loadTypeForPackage(FXMLLoader.java:2916)
 at javafx.fxml.FXMLLoader.loadType(FXMLLoader.java:2905)
 at javafx.fxml.FXMLLoader.importClass(FXMLLoader.java:2846)
 ... 15 more

Code:

Main

package application;

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

public class Main extends Application {
 @Override
 public void start(Stage primaryStage) {
  try {
   FXMLLoader loader = new FXMLLoader(getClass().getResource("MasterMain.fxml"));
   Parent root = loader.load();



   Scene scene = new Scene(root, 800, 600);
   scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
   primaryStage.setScene(scene);
   primaryStage.show();
  } catch(Exception e) {
   e.printStackTrace();
  }
 }

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

Controller:

package application;

import java.io.File;
import java.io.InputStream;
import java.util.List;
import javafx.beans.property.ReadOnlyIntegerWrapper;
import javafx.beans.property.ReadOnlyLongWrapper;
import javafx.beans.property.ReadOnlyStringWrapper;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.control.Accordion;
import javafx.scene.control.Button;
import javafx.scene.control.ListView;
import javafx.scene.control.Slider;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.TitledPane;
import javafx.scene.control.ToggleButton;
import javafx.scene.image.Image;
import javafx.scene.input.DragEvent;
import javafx.scene.input.Dragboard;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.TransferMode;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.stage.DirectoryChooser;
import javafx.stage.Stage;
import javafx.util.Callback;
public class Controller {
    @FXML
    private TextField textfieldResult;
    @FXML
    private Button plusButton;
}

FXML
<?xml version="1.0" encoding="UTF-8"?>
<?import com.gluonhq.charm.glisten.control.TextField?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>

<VBox xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.111" fx:controller="application.Controller">
   <children>
      <Label text="Result" />
      <TextField fx:id="textfieldResult" />
      <Button fx:id="plusButton" mnemonicParsing="false" text="+" />
   </children>
</VBox>


----------



## dzim (14. Jun 2017)

Bitte nutze das nächste mal die Code-Tags *[ code ] [ /code ]* (ohne Leezeichen, oder im Header des Eingabefensters unter _Einfügen... > Code_). Dann lässt es sich besser Lesen.
Schauen wir uns mal die Fehlermeldung an:


Steiner2023 hat gesagt.:


> javafx.fxml.LoadException:
> /C:/Users/GT72VR/Desktop/Java/Workspace/Calculator/bin/application/MasterMain.fxml
> at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
> at javafx.fxml.FXMLLoader.importClass(FXMLLoader.java:2848)
> ...


Speziell der untere Block

```
Caused by: java.lang.ClassNotFoundException: com.gluonhq.charm.glisten.control.TextField
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at javafx.fxml.FXMLLoader.loadTypeForPackage(FXMLLoader.java:2916)
at javafx.fxml.FXMLLoader.loadType(FXMLLoader.java:2905)
at javafx.fxml.FXMLLoader.importClass(FXMLLoader.java:2846)
... 15 more
```
Es konnte also die Klasse _com.gluonhq.charm.glisten.control.TextField_ nicht gefunden werden.
Zum Einen wird also bei der Ausführung dein Classpath diese Klasse nicht enthalten.
Zum Anderen wird es aber nicht funktionieren, denn du definierst im FXML "_com.gluonhq.charm.glisten.control.TextField_", verwendest im Controller aber die Standartklasse "_javafx.scene.control.TextField_" (schau dir mal die Imports an...)

Dass du ein Problem beim Starten hast, verstehe ich nicht: Rechtsklick im Project Explorer (also im Tree, wo du deine Klassenstruktur siehst) auf deine Main-Klasse > Run As > Java Application. Dadurch sollte eine Run Config erstellt werden, die du dann immer wiederverwenden kannst.


----------



## Steiner2023 (15. Jun 2017)

Okay danke hat mir geholfen


----------



## dzim (16. Jun 2017)

Was genau hat am Ende geholfen?


----------



## Steiner2023 (16. Jun 2017)

Beim Scene Builder gibt es zwei versch. TextField und das eine funktioniert mit dem javafx.scene.control.TextField, das andere nicht (weißt du vielleicht warum?). Und ich wusste nicht, dass man Rechtsklick - Run As - Java Application machen sollte, ich habe immer in der Menübar auf den Button geklickt.


----------



## dzim (16. Jun 2017)

Der SceneBuilder wurde ursprünglich von Oracle gebaut, dann aber "aufgegeben", bzw. der Community übergeben. Dessen hat sich die Firma Gluon angenommen, die auch den ursprünglich von Oracle begonnen Port von JavaFX auf Android (und dank RoboVM auch auf iOS - auch wenn Microsoft, die Xamarin gekauft haben, welche widerum vorher RoboVM gekauft haben, letztere am Ende haben "sterben" lassen und somit Gluon auf Forks setzen muss) weiterentwickeln.
Da Gluon ein eigenes Framework für die GUI-Entwicklung auf mobilen Platformen bereitstellt, hat sie die darin enthaltenen Komponenten per default in SceneBuilder aufgenommen. Blöderweise kollidieren die Klassennamen, jedoch nicht die Pakete - das ist aber etwas im Java-Umfeld, mit dem man ab und an mal konfrontiert wird...


----------

