簡體   English   中英

有些場景在maven構建后沒有加載

[英]Some scene not loading after maven build

我正在開發netbeans中的JavaFx應用程序,在netbeans中項目正在構建並運行良好。

我從我的項目中創建了一個構建(mvn包),它完成沒有錯誤,但是當我啟動程序時,它沒有加載所有場景,並且在這種情況下FXMLLoader返回null值。

所有.fxml文件位於同一文件夾中。

public class JavaFXApplication extends Application {

    public static final String TOOLBAR_MAIN = "toolbarMain";
    public static final String TOOLBAR_MAIN_FXML = "/fxml/ToolbarMain.fxml";
    public static final String TOOLBAR_SUB = "toolbarSub";
    public static final String TOOLBAR_SUB_FXML = "/fxml/ToolbarSub.fxml";

    public static final String NEW_SESSION_PANEL = "newSession";
    public static final String NEW_SESSION_PANEL_FXML = "/fxml/NewSessionPanel.fxml";
    public static final String OPEN_SESSION_PANEL = "openSession";
    public static final String OPEN_SESSION_PANEL_FXML = "/fxml/OpenSessionPanel.fxml";
    public static final String CONNECTIONS_PANEL = "connections";
    public static final String CONNECTIONS_PANEL_FXML = "/fxml/ConnectionsPanel.fxml";
    public static final String LOGS_PANEL = "logs";
    public static final String LOGS_PANEL_FXML = "/fxml/LogsPanel.fxml";
    public static final String EXCEPTIONS_PANEL = "exceptions";
    public static final String EXCEPTIONS_PANEL_FXML = "/fxml/ExceptionsPanel.fxml";
    public static final String MESSAGES_PANEL = "messages";
    public static final String MESSAGES_PANEL_FXML = "/fxml/MessagesPanel.fxml";

    public static ScreensController menuContainer = new ScreensController();
    public static ScreensController contentContainer = new ScreensController();

    public static ServerService server = new ServerService();

    public static Stage STAGE;

    @Override
    public void start(Stage primaryStage) throws Exception {

        STAGE = primaryStage;

        primaryStage.setOnCloseRequest((WindowEvent t) -> {
            if (server.isRunning()) {
                server.cancel();
            }
        });

        menuContainer.loadScreen(JavaFXApplication.TOOLBAR_MAIN,
                JavaFXApplication.TOOLBAR_MAIN_FXML);
        menuContainer.loadScreen(JavaFXApplication.TOOLBAR_SUB,
                JavaFXApplication.TOOLBAR_SUB_FXML);

        contentContainer.loadScreen(JavaFXApplication.NEW_SESSION_PANEL,
                JavaFXApplication.NEW_SESSION_PANEL_FXML);
        contentContainer.loadScreen(JavaFXApplication.OPEN_SESSION_PANEL,
                JavaFXApplication.OPEN_SESSION_PANEL_FXML);
        contentContainer.loadScreen(JavaFXApplication.NEW_SESSION_PANEL,
                JavaFXApplication.NEW_SESSION_PANEL_FXML);
        contentContainer.loadScreen(JavaFXApplication.CONNECTIONS_PANEL,
                JavaFXApplication.CONNECTIONS_PANEL_FXML);
        contentContainer.loadScreen(JavaFXApplication.LOGS_PANEL,
                JavaFXApplication.LOGS_PANEL_FXML);
        contentContainer.loadScreen(JavaFXApplication.EXCEPTIONS_PANEL,
                JavaFXApplication.EXCEPTIONS_PANEL_FXML);
        contentContainer.loadScreen(JavaFXApplication.MESSAGES_PANEL,
                JavaFXApplication.MESSAGES_PANEL_FXML);
        menuContainer.setScreen(JavaFXApplication.TOOLBAR_MAIN);
        contentContainer.setScreen(JavaFXApplication.NEW_SESSION_PANEL);

        SplitPane root = new SplitPane();

        root.getItems().addAll(menuContainer, contentContainer);
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.show();
        primaryStage.setResizable(false);
        primaryStage.setTitle("Exam Supervisor");

    }

加載屏幕的屏幕控制器:

public class ScreensController extends StackPane {

    private HashMap<String, Node> screens = new HashMap<>();

    public void addScreen(String name, Node screen) {
        screens.put(name, screen);
    }

    public boolean loadScreen(String name, String resource) {
        try {
            FXMLLoader myLoader = new FXMLLoader(getClass().getResource(resource));
            System.out.println("name:" + name + " ,resource" + resource + " ,loader:" + myLoader.getLocation());
            Parent loadScreen = myLoader.load();
            ControlledScreen myScreenControler
                    = myLoader.getController();
            myScreenControler.setScreenParent(this);
            addScreen(name, loadScreen);
            return true;
        } catch (Exception e) {
            System.out.println("name: " + name + ", resource" + resource + " ,exception: " + e.getMessage());
            return false;
        }
    }

    public boolean setScreen(final String name) {

        if (screens.get(name) != null) {
            final DoubleProperty opacity = opacityProperty();

            if (!getChildren().isEmpty()) {
                getChildren().remove(0);
                getChildren().add(0, screens.get(name));
            } else {
                getChildren().add(screens.get(name));
            }
            return true;
        } else {
            System.out.println(screens.get(name) + " ,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;
        }
    }
}

我的github回購: https//github.com/eszikk/ExamSuperVisorServer

我查看了你的netbeans項目文件和maven pom,發現沒什么奇怪的。 javafx庫未包含在兩個配置的類路徑中這一事實告訴我,您正在使用Java安裝中的它。

也許您使用netbeans的不同Java安裝以及啟動maven目標時。 然后,fxml模塊可能會丟失,或者第二次安裝沒有安裝java fx或其他內容不兼容。

你是否從控制台啟動了maven目標? 例如

java -jar xyz.jar

嘗試

java -version

並將版本與netbeans使用的java版本進行比較(幫助>關於)。

Netbeans構建由內部maven版本完成。 但是外部maven構建也有可能使用不同版本的java編譯器而不是內部netbeans構建。

我希望有所幫助!

嘗試使用javafx-maven-plugin希望,它可以提供幫助。

在進行以下更改后,我已成功從Netbeans外部運行您的應用程序。

首先,我想知道為什么你有編譯器插件。 所以,我刪除了它,並在構建過程中收到“找不到sun.util.logging.PlatformLogger的類文件”錯誤。

您已經遇到過JavaFX8中解釋的問題- 在NetBeans 8中找不到sun.util.logging.PlatformLogger異常

你需要解決它。

其次,你所擁有的只是編譯階段,而不是可運行的jar。

可能有辦法使用編譯器插件(或通過在類路徑中包含其他依賴的jar)來實現它,但我發現使用程序集插件創建一個包含所有依賴項的jar更容易。

將以下內容添加到您的pom.xml中

  <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <archive> <manifest> <mainClass>com.eszik.supervisorserver.main.Main</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </plugin> 

接下來,分別運行兩個mvn命令。

mvn clean install
mvn assembly:single

然后,java -jar target / SuperVisorServer-1.0-SNAPSHOT-jar-with-dependencies.jar

暫無
暫無

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

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