簡體   English   中英

Java:尚未加載屏幕

[英]Java: Screen has not been loaded

我創建了一個接近完成的JavaFX應用程序。 我將其導出為可運行的JAR。 打開此JAR時,我只會看到一個空白窗口。 我遵循了stackoverflow的其他一些答案,但是我沒有使它工作。 它僅在Eclipse IDE中有效!

我的屏幕控制器:

 package gui; import java.io.File; import java.net.URL; import java.util.HashMap; import java.util.Iterator; import java.util.Set; import javafx.fxml.FXMLLoader; import javafx.scene.Node; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.layout.StackPane; public class ScreensController extends StackPane { private HashMap<String, Node> screens = new HashMap<>(); public static String sourcePath = ""; private CoreService coreService; public ScreensController(){ super(); } public void addScreen(String name, Node screen) { screens.put(name, screen); } public boolean loadScreen(String name, String resource) { System.out.println("ID: "+name); System.out.println("Resource: "+resource); String file = System.getProperty("user.dir")+"\\\\bin\\\\"+resource; // System.out.println(file); try { FXMLLoader myLoader = new FXMLLoader(); File f = new File(file); URL url = f.toURI().toURL(); myLoader.setLocation(url); // System.out.println("Location: "+myLoader.getLocation()); Parent loadScreen = (Parent) myLoader.load(); ControlledScreen myScreenControler = ((ControlledScreen) myLoader.getController()); myScreenControler.setScreenParent(this); addScreen(name, loadScreen); System.out.println("Anzahl Screens: "+screens.size()); return true; }catch(Exception e) { System.out.println("Fehler beim Laden von "+file); System.out.println(e.getMessage()); return false; } } public boolean setScreen(final String name) { @SuppressWarnings("unused") Node screenToRemove; if(screens.get(name) != null){ //screen loaded if(!getChildren().isEmpty()){ //if there is more than one screen getChildren().add(0, screens.get(name)); //add the screen screenToRemove = getChildren().get(1); getChildren().remove(1); //remove the displayed screen }else{ getChildren().add(screens.get(name)); //no one else been displayed, then just show } return true; }else { System.out.println("Screen hasn't been loaded!!! \\n"); return false; } } public boolean unloadScreen(String name) { if(screens.remove(name) == null) { System.out.println("Screen didn't exist!!!"); return false; } else { return true; } } public void print() { Set<String> keys = screens.keySet(); Iterator<String> it = keys.iterator(); while (it.hasNext()){ System.out.println("Key: "+it.next()); } } public CoreService getCoreService(){ return this.coreService; } public void setCoreService(CoreService coreService){ this.coreService = coreService; } } 

在這里我用它:

 package gui; import java.util.Optional; import javafx.application.Application; import javafx.event.EventHandler; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.control.Alert; import javafx.scene.control.Button; import javafx.scene.control.ButtonType; import javafx.stage.Modality; import javafx.stage.Stage; import javafx.stage.WindowEvent; public class MainMenu extends Application { private Stage mainStage; private static CoreService coreService; public static final String MAIN_SCREEN = "main"; public static final String MAIN_SCREEN_FXML = "gui\\\\MainMenu.fxml"; @Override public void start(Stage primaryStage) { this.mainStage = primaryStage; ScreensController mainContainer = new ScreensController(); mainContainer.loadScreen(MainMenu.MAIN_SCREEN, MainMenu.MAIN_SCREEN_FXML); mainContainer.setCoreService(MainMenu.coreService); mainContainer.setScreen(MainMenu.MAIN_SCREEN); Group root = new Group(); root.getChildren().addAll(mainContainer); Scene scene = new Scene(root); primaryStage.setScene(scene); primaryStage.setOnCloseRequest(confirmCloseEventHandler); primaryStage.show(); } private EventHandler<WindowEvent> confirmCloseEventHandler = event -> { //Source: http://stackoverflow.com/questions/29710492/javafx-internal-close-request Alert closeConfirmation = new Alert( Alert.AlertType.CONFIRMATION, "Are you sure you want to exit?" ); Button exitButton = (Button) closeConfirmation.getDialogPane().lookupButton( ButtonType.OK ); exitButton.setText("Exit"); closeConfirmation.setHeaderText("Confirm Exit"); closeConfirmation.initModality(Modality.APPLICATION_MODAL); closeConfirmation.initOwner(mainStage); closeConfirmation.setX(mainStage.getX() + 150); closeConfirmation.setY(mainStage.getY() - 300 + mainStage.getHeight()); Optional<ButtonType> closeResponse = closeConfirmation.showAndWait(); if (!ButtonType.OK.equals(closeResponse.get())) { event.consume(); } }; public static void main(String[] args, CoreService aService) { // Weitergeben des CoreServices coreService = aService; launch(args); } } 

我看不到錯誤在哪里。 當我從命令行啟動程序時,它說找不到MainMenu.fxml文件。 在我的應用程序中,它位於gui包中。 -> gui / MainMenu.fxml

如果有人發現我的錯誤,那就太好了!

錯誤消息告訴您,找不到FXML文件。

您可以嘗試:

改變這個...

public static final String MAIN_SCREEN_FXML = "gui\\MainMenu.fxml"; 

... 至 ...

public static final String MAIN_SCREEN_FXML = "/gui/MainMenu.fxml"; 

並改變這個...

FXMLLoader myLoader = new FXMLLoader();
File f = new File(file);
URL url = f.toURI().toURL();
myLoader.setLocation(url);

...到(並且您不需要變量filef )...

FXMLLoader myLoader = new FXMLLoader(getClass().getResource(resource));

一些參考:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM