JavaFX javafx.fxml.LoadException bei einem Taschenrechner

Hallo, ich bin gerade dabei eine typische Studiumsaufgabe zu lösen: einen Taschenrechner mit JavaFX erstellen. Der soll erstmal nur die Grundrechenarten haben.
Hab mitthilfe einiger Tutorials nun einen Code, der allerdings nicht funktioniert. Laut Tutorials sollte es funktionieren, ich versteh nicht wo der Fehler liegt...
Die Fehlermeldung ist folgende:
javafx.fxml.LoadException:
/C:/Users/Laser/eclipse-workspace/Calculator/bin/application/ui.fxml:15

at javafx.fxml/javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2625)
at javafx.fxml/javafx.fxml.FXMLLoader.access$700(FXMLLoader.java:105)
at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:930)
at javafx.fxml/javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:980)
at javafx.fxml/javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:227)
at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:752)
at javafx.fxml/javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2722)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2552)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2466)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3237)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3194)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3163)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3136)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3113)
at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:3106)
at Calculator/application.Main.start(Main.java:16)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.ClassNotFoundException: com.almasb.calc.Controller
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:928)
... 22 more


Ich habe drei Klassen: Main, Controller und Model.
Und noch ein File, die ui.fxml.

[CODE lang="java" title="Main-Klasse"]package application;

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



public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
try {
//Parent root = FXMLLoader.load(getClass().getResource("/application/ui.fxml"));
Parent root = FXMLLoader.load(getClass().getResource("ui.fxml"));
primaryStage.setScene(new Scene(root));
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}

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

[CODE lang="java" title="Controller-Klasse"]package application;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.text.Text;

public class Controller {

@FXML
private Text output;

private double number1 = 0;
private String operator = "" ;

private Model model = new Model();
private boolean start = true;

@FXML
private void processNumpad(ActionEvent event) {
if (start) {
output.setText("");
start = false;
}

String value = ((Button)event.getSource()).getText();
output.setText(output.getText() + value);
}

@FXML
private void processOperator(ActionEvent event) {
String value = ((Button)event.getSource()).getText();

if(!"=".equals(value)) {
if (!operator.isEmpty())
return;

operator = value;
number1 = Double.parseDouble(output.getText());
output.setText("");
}
else {
//calculation
if (operator.isEmpty())
return;

output.setText(String.valueOf(model.calculate(number1, Double.parseDouble(output.getText()), operator)));
operator = "";
start = true;
}
}[/CODE]

[CODE lang="java" title="Model-Klasse"]package application;



public class Model {

public double calculate(double number1, double number2, String operator) {
switch (operator) {
case "+":
return number1 + number2;
case "-":
return number1 - number2;
case "*":
return number1 * number2;
case "/":
if (number2 == 0)
return 0;
return number1 / number2;
}

System.out.println("Unknown operator -" + operator);
return 0;
}


}[/CODE]

[CODE lang="java" title="ui.fxml-Datei"]<?xml version="1.0" encoding="UTF-8"?>

<?import java.net.*?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.beans.property.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.shape.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>
<?import javafx.scene.paint.Color?>

<VBox spacing="10" alignment="CENTER" prefWidth="300" prefHeight="300" fx:controller="com.almasb.calc.Controller" xmlns:fx="http://javafx.com/fxml">
<fx:define>
<Font fx:id="FONT" size="18" />
</fx:define>

<StackPane alignment="CENTER">
<Rectangle fill="TRANSPARENT" stroke="GRAY" width="230" height="50" />
<Text fx:id="output" font="$FONT" />
</StackPane>

<HBox spacing="10" alignment="CENTER">
<Button text="7" prefWidth="50" font="$FONT" onAction="#processNumpad" />
<Button text="8" prefWidth="50" font="$FONT" onAction="#processNumpad" />
<Button text="9" prefWidth="50" font="$FONT" onAction="#processNumpad" />
<Button text="/" prefWidth="50" font="$FONT" onAction="#processOperator" />
</HBox>

<HBox spacing="10" alignment="CENTER">
<Button text="4" prefWidth="50" font="$FONT" onAction="#processNumpad" />
<Button text="5" prefWidth="50" font="$FONT" onAction="#processNumpad" />
<Button text="6" prefWidth="50" font="$FONT" onAction="#processNumpad" />
<Button text="*" prefWidth="50" font="$FONT" onAction="#processOperator" />
</HBox>

<HBox spacing="10" alignment="CENTER">
<Button text="1" prefWidth="50" font="$FONT" onAction="#processNumpad" />
<Button text="2" prefWidth="50" font="$FONT" onAction="#processNumpad" />
<Button text="3" prefWidth="50" font="$FONT" onAction="#processNumpad" />
<Button text="-" prefWidth="50" font="$FONT" onAction="#processOperator" />
</HBox>

<HBox spacing="10" alignment="CENTER">
<Button text="0" prefWidth="110" font="$FONT" onAction="#processNumpad" />
<Button text="=" prefWidth="50" font="$FONT" onAction="#processOperator" />
<Button text="+" prefWidth="50" font="$FONT" onAction="#processOperator" />
</HBox>
[/CODE]


Ich bin dankbar für jede Hilfe 🙂
 
In dem fxml hast du den Controller com.almasb.calc.Controller angegeben aber Dein Controller ist in einem anderen Namespace (application).
 
Dann hast du wohl etwas falsch gemacht.

Sorry, aber ohne detaillierte Informationen kann man nichts genaueres sagen. Was funktioniert nicht? Gibt es Fehlermeldungen? Was genau hast du geändert?
 
Dann hast du wohl etwas falsch gemacht.

Sorry, aber ohne detaillierte Informationen kann man nichts genaueres sagen. Was funktioniert nicht? Gibt es Fehlermeldungen? Was genau hast du geändert?
Tut mir leid, ich war vorhin im Stress.

Ich hab Zeile 15 in der ui.fxml so angepasst:
Java:
<VBox spacing="10" alignment="CENTER" prefWidth="300" prefHeight="300" fx:controller="application.Controller" xmlns:fx="http://javafx.com/fxml">

Damit hat es nicht auf Anhieb funktioniert, aber ich habe meinen Fehler dann selbst gefunden.
In der ui.fxml hatte </VBox> am Ende gefehlt.

Danke dir für deine Hilfe!
 

Zurück
Oben