我正在开发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;
}
}
}
答案 0 :(得分:4)
我查看了你的netbeans项目文件和maven pom,发现没什么奇怪的。 javafx库未包含在两个配置的类路径中这一事实告诉我,您正在使用Java安装中的它。
也许您使用netbeans的不同Java安装以及启动maven目标时。然后,fxml模块可能会丢失,或者第二次安装没有安装java fx或其他内容不兼容。
你是否从控制台启动了maven目标? e.g。
java -jar xyz.jar
尝试
java -version
并将版本与netbeans使用的java版本进行比较(帮助&gt;关于)。
Netbeans构建由内部maven版本完成。但是外部maven构建也有可能使用不同版本的java编译器而不是内部netbeans构建。
我希望有所帮助!
答案 1 :(得分:1)
尝试使用javafx-maven-plugin 希望,它可以提供帮助。
答案 2 :(得分:0)
在进行以下更改后,我已经从Netbeans外部成功运行了您的应用程序。
首先,我想知道为什么你有编译器插件。所以,我删除它并在构建过程中收到“找不到sun.util.logging.PlatformLogger的类文件”错误。
您已按照JavaFX8 - sun.util.logging.PlatformLogger not found Exception in NetBeans 8
中的说明遇到此问题你需要解决它。
其次,你所拥有的只是编译阶段,而不是可运行的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