Hallo zusammen,
nun melde ich mich nach einigen Monaten doch noch zu Wort...
Ich lerne Java seit Februar 2019 nach langen eingeschlafenen Vorkenntnissen in HTML, CSS und JavaScript.
Gelernt habe ich über einen VideoKurs von Udemy und seit März sitze ich an einem eigenen Projekt.
Bisher konnte ich mir mit Google und dem Umbau des Codes gut selbst helfen, wenn Fehler auftauchten, aber jetzt komm ich leider nicht weiter.
Es handelt sich um ein mit FXML und Scene Builder erstelltes Programm.
Wenn ich dieses in Eclipse starte, läuft es perfekt. Aber sobald ich dieses in eine Executable JAR exportiere und (vom Schreibtisch aus beispielsweise) starte, schliesst sich diese wieder von selbst.
Ich habe die JAR vom Terminal gestartet und erhalte folgender Exception:
Es betrifft hier wohl offensichtlich meine Bild-Pfade.
Ich nutze hier zum schnellen einfügen der Bilder eine Klasse Namens ImageContainer:
Hier noch die aufrufende Main:
diese erstellt dann ein Objekt des DialogControllers, der die Bilder lädt:
Nach vielerlei Umbau und Probieren habe ich festgestellt, dass wenn ich die JAR in den SRC Ordner des Projektes verschiebe, die App läuft.
Dementsprechend habe ich hier ein Problem mit den relativen Pfaden, und mir fällt einfach keine saubere Lösung ein.
Ich bin mir bewusst, dass mein Code noch sehr umständlich ist und nicht unbedingt die Konventionen erfüllt, aber auch hier bin ich um Tipps dankbar
Ich hoffe, dass hier jemand für euch eine Idee für mich hat.
LG Daniel
nun melde ich mich nach einigen Monaten doch noch zu Wort...
Ich lerne Java seit Februar 2019 nach langen eingeschlafenen Vorkenntnissen in HTML, CSS und JavaScript.
Gelernt habe ich über einen VideoKurs von Udemy und seit März sitze ich an einem eigenen Projekt.
Bisher konnte ich mir mit Google und dem Umbau des Codes gut selbst helfen, wenn Fehler auftauchten, aber jetzt komm ich leider nicht weiter.
Es handelt sich um ein mit FXML und Scene Builder erstelltes Programm.
Wenn ich dieses in Eclipse starte, läuft es perfekt. Aber sobald ich dieses in eine Executable JAR exportiere und (vom Schreibtisch aus beispielsweise) starte, schliesst sich diese wieder von selbst.
Ich habe die JAR vom Terminal gestartet und erhalte folgender Exception:
Code:
Exception in Application constructor
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Unable to construct Application instance: class de.morpheus.init.Main
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:907)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$154(LauncherImpl.java:182)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$160(LauncherImpl.java:819)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
Caused by: java.lang.NullPointerException: Input stream must not be null
at javafx.scene.image.Image.validateInputStream(Image.java:1128)
at javafx.scene.image.Image.<init>(Image.java:706)
at de.morpheus.controller.ImageContainer.<init>(ImageContainer.java:7)
at de.morpheus.controller.DialogController.<init>(DialogController.java:21)
at de.morpheus.init.Main.<init>(Main.java:24)
... 10 more
Exception running application de.morpheus.init.Main
Es betrifft hier wohl offensichtlich meine Bild-Pfade.
Ich nutze hier zum schnellen einfügen der Bilder eine Klasse Namens ImageContainer:
Code:
package de.morpheus.controller;
import javafx.scene.image.Image;
public class ImageContainer {
public Image dbError32 = new Image(getClass().getResourceAsStream("../images/dbError_32.png"));
public Image dbOk32 = new Image(getClass().getResourceAsStream("../images/dbOk_32.png"));
public Image dbUnknown32 = new Image(getClass().getResourceAsStream("../images/dbunknown_32.png"));
public Image Error48 = new Image(getClass().getResourceAsStream("../images/Error_48.png"));
public Image Dummy48 = new Image(getClass().getResourceAsStream("../images/Dummy_48.png"));
public Image InfoY48 = new Image(getClass().getResourceAsStream("../images/InfoY_48.png"));
public Image InfoB48 = new Image(getClass().getResourceAsStream("../images/InfoB_48.png"));
public Image Ask48 = new Image(getClass().getResourceAsStream("../images/Ask_48.png"));
public Image Success48 = new Image(getClass().getResourceAsStream("../images/Success_48.png"));
public Image Key48 = new Image(getClass().getResourceAsStream("../images/key_48.png"));
}
Hier noch die aufrufende Main:
Code:
package de.morpheus.init;
import de.morpheus.controller.DialogController;
import de.morpheus.controller.SystemX;
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 {
DialogController dialogController = new DialogController();
@Override
public void start(Stage primaryStage) {
SystemX.consoleSplash();
try {
Parent root = FXMLLoader.load(getClass().getResource("../modules/dash/Dashboard.fxml"));
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.setTitle("Dashboard " + SystemX.APP_VERSION);
primaryStage.setResizable(true);
primaryStage.show();
} catch (Exception e) {
dialogController.displayError("FXML Error: start", e, Main.class.getName());
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
diese erstellt dann ein Objekt des DialogControllers, der die Bilder lädt:
Code:
package de.morpheus.controller;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Orientation;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.Separator;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class DialogController{
ImageContainer imageContainer = new ImageContainer();
// Voller Dialog
public void display(String _type, String _header, String _context) {
Stage stage = new Stage();
ImageView image = new ImageView();
image.setFitHeight(48);
image.setFitWidth(48);
image.setLayoutX(25);
image.setLayoutY(25);
switch (_type) {
case "notify":
System.out.println("*DialogController* open Dialog >notify<");
stage.setTitle("Hinweis");
image.setImage(imageContainer.InfoB48);
break;
case "success":
System.out.println("*DialogController* open Dialog >success<");
stage.setTitle("Erfolg");
image.setImage(imageContainer.Success48);
break;
}
Label header = new Label(_header);
header.setLayoutX(90);
header.setLayoutY(25);
Label context = new Label(_context);
context.setLayoutX(90);
context.setLayoutY(55);
Separator separator = new Separator(Orientation.HORIZONTAL);
separator.setPrefWidth(350);
separator.setLayoutY(100);
Button button = new Button("OK");
button.setPrefWidth(100);
button.setLayoutX(225);
button.setLayoutY(125);
button.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
stage.close();
}
});
AnchorPane root = new AnchorPane();
root.getChildren().addAll(image, header, context, separator, button);
Scene scene = new Scene(root, 350, 175);
stage.setScene(scene);
stage.showAndWait();
}
// Voller Dialog bei Fehler
public void displayError(String _header, Exception _e, String _url) {
Stage stage = new Stage();
stage.setTitle("Java Fehler");
System.out.println("*DialogController* open ErrorDialog");
ImageView image = new ImageView();
image.setFitHeight(48);
image.setFitWidth(48);
image.setLayoutX(25);
image.setLayoutY(25);
image.setImage(imageContainer.Error48);
Label header = new Label(_header);
header.setLayoutX(90);
header.setLayoutY(25);
Label context = new Label(_e.getMessage());
context.setLayoutX(90);
context.setLayoutY(55);
Label url = new Label(_url);
url.setLayoutX(90);
url.setLayoutY(85);
Separator separator = new Separator(Orientation.HORIZONTAL);
separator.setPrefWidth(550);
separator.setLayoutY(130);
Button button = new Button("OK");
button.setPrefWidth(100);
button.setLayoutX(425);
button.setLayoutY(155);
button.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
stage.close();
}
});
AnchorPane root = new AnchorPane();
root.getChildren().addAll(image, header, context, url, separator, button);
Scene scene = new Scene(root, 550, 205);
stage.setScene(scene);
stage.showAndWait();
}
public void SimpleDialog(String _type, String _message) {
Stage stage = new Stage();
ImageView image = new ImageView();
image.setFitHeight(48);
image.setFitWidth(48);
switch (_type) {
case "notify":
System.out.println("*DialogController* open SimpleDialog >notify<");
stage.setTitle("Hinweis");
image.setImage(imageContainer.InfoB48);
break;
case "success":
System.out.println("*DialogController* open SimpleDialog >success<");
stage.setTitle("Erfolg");
image.setImage(imageContainer.Success48);
break;
case "error":
System.out.println("*DialogController* open SimpleDialog >error<");
stage.setTitle("Fehler");
image.setImage(imageContainer.Error48);
break;
}
Label message = new Label(_message);
message.setPrefWidth(350);
Button button = new Button("OK");
button.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
stage.close();
}
});
VBox root = new VBox(10);
HBox sub = new HBox(10);
HBox interaction = new HBox(10);
root.getChildren().addAll(sub, interaction);
root.setAlignment(Pos.CENTER_RIGHT);
root.setPadding(new Insets(20));
sub.getChildren().addAll(image, message);
sub.setAlignment(Pos.CENTER_RIGHT);
interaction.getChildren().add(button);
interaction.setAlignment(Pos.CENTER_RIGHT);
Scene scene = new Scene(root, 450, 150);
stage.setScene(scene);
stage.showAndWait();
}
}
Nach vielerlei Umbau und Probieren habe ich festgestellt, dass wenn ich die JAR in den SRC Ordner des Projektes verschiebe, die App läuft.
Dementsprechend habe ich hier ein Problem mit den relativen Pfaden, und mir fällt einfach keine saubere Lösung ein.
Ich bin mir bewusst, dass mein Code noch sehr umständlich ist und nicht unbedingt die Konventionen erfüllt, aber auch hier bin ich um Tipps dankbar
Ich hoffe, dass hier jemand für euch eine Idee für mich hat.
LG Daniel