Afterburner.fx ошибка загрузки fxml

Я пытаюсь использовать Afterburner.fx для DI в своем проекте. Я беру пример followme.fx и пытаюсь применить его к своему проекту. Но я не знаю, что не так, потому что я следую примеру, но когда я запускаю приложение, я получаю это исключение:

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:497)
    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:497)
    at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$151(LauncherImpl.java:182)
    at com.sun.javafx.application.LauncherImpl$$Lambda$50/1030870354.run(Unknown Source)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalStateException: Location is not set.
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2438)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2413)
    at com.airhacks.afterburner.views.FXMLView.loadSynchronously(FXMLView.java:87)
    at com.airhacks.afterburner.views.FXMLView.initializeFXMLLoader(FXMLView.java:96)
    at com.airhacks.afterburner.views.FXMLView.getView(FXMLView.java:108)
    at com.******.controladores.MainApp.start(MainApp.java:44)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$158(LauncherImpl.java:863)
    at com.sun.javafx.application.LauncherImpl$$Lambda$53/1821793753.run(Unknown Source)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$171(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl$$Lambda$46/1637506559.run(Unknown Source)
    at com.sun.javafx.application.PlatformImpl.lambda$null$169(PlatformImpl.java:295)
    at com.sun.javafx.application.PlatformImpl$$Lambda$48/313834886.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$170(PlatformImpl.java:294)
    at com.sun.javafx.application.PlatformImpl$$Lambda$47/2117255219.run(Unknown Source)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$144(WinApplication.java:101)
    at com.sun.glass.ui.win.WinApplication$$Lambda$36/764308918.run(Unknown Source)
    ... 1 more
Exception running application com.******.controladores.MainApp

Структура каталога:

Файлы, которые есть в моем проекте

Основной класс

package com.******.controladores;

import com.airhacks.afterburner.injection.Injector;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
import static java.util.logging.Logger.getLogger;
import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class MainApp extends Application {

    private static final Logger LOG = getLogger(MainApp.class.getName());

    @Override
    public void start(Stage stage) {        
        Map<Object, Object> customProperties = new HashMap<>();
        Injector.setConfigurationSource(customProperties::get);
        LoginView loginView = new LoginView();
        Scene scene = new Scene(loginView.getView());
        stage.setScene(scene);
        stage.show();
    }

    @Override
    public void stop() throws Exception {
        Injector.forgetAll();
    }

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

}

Класс LoginView

package com.******.controladores;

import com.airhacks.afterburner.views.FXMLView;

public class LoginView extends FXMLView {

}

Класс LoginPresenter

package com.****.controladores;

import com.****.dao.usuarioDAO;
import com.****.modelos.usuario;
import java.net.URL;
import java.util.List;
import java.util.ResourceBundle;
import java.util.logging.Logger;
import static java.util.logging.Logger.getLogger;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.PasswordField;
import javafx.scene.image.Image;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;
import javax.inject.Inject;

public class LoginPresenter implements Initializable {

    private static final Logger LOG = getLogger(LoginPresenter.class.getName());

    @FXML
    Button btnAceptar;
    @FXML
    ChoiceBox lstUsuario;
    @FXML
    PasswordField txtClave;

    @Inject
    private DataModel datos;

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        List<Usuario> usuarios = new UsuarioDAO().obtenListausuariosPorEstado(true);

        lstUsuario.getItems().addAll(usuarios);
        btnAceptar.setOnAction((ActionEvent event) -> {
            validarCampos();
        });
        txtClave.setOnKeyPressed((KeyEvent ke) -> {
            if (ke.getCode().equals(KeyCode.ENTER)) {
                validarCampos();
            }
        });
    }
}

Логин.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>


<VBox alignment="CENTER" prefHeight="338.0" prefWidth="286.0" styleClass="fondo" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.****.controladores.LoginPresenter">
    <children>
        <Label alignment="CENTER" contentDisplay="CENTER" nodeOrientation="LEFT_TO_RIGHT" styleClass="titulo" text="Inicio de sesión">
            <font>
                <Font name="Segoe UI" size="30.0" />
            </font>
        </Label>
        <Pane prefHeight="59.0" prefWidth="286.0" />
        <VBox alignment="CENTER">
            <children>
                <Label text="Usuario">
                    <font>
                        <Font name="System Bold" size="12.0" />
                    </font>
                </Label>
                <ChoiceBox fx:id="lstUsuario" prefWidth="150.0" />
                <Label text="Clave">
                    <font>
                        <Font name="System Bold" size="12.0" />
                    </font>
                </Label>
                <PasswordField fx:id="txtClave" promptText="Introduce tu clave" />
            </children>
        </VBox>
        <Pane prefHeight="59.0" prefWidth="286.0" />
        <Button fx:id="btnAceptar" contentDisplay="CENTER" mnemonicParsing="false" text="Aceptar" textAlignment="CENTER">
        </Button>
        <Pane prefHeight="59.0" prefWidth="286.0" />
    </children>
</VBox>

ПОМ

    <dependency>
        <groupId>com.airhacks</groupId>
        <artifactId>afterburner.fx</artifactId>
        <version>1.6.0</version>
    </dependency>

person Marcos    schedule 24.11.2014    source источник
comment
Я думаю, что имя файла FXML должно быть Login.fxml (а не login.fxml)   -  person James_D    schedule 24.11.2014
comment
Пробую, но получаю ту же ошибку.   -  person Marcos    schedule 24.11.2014
comment
@Marcos Ваш код работает для меня. Поэтому я просто переименовал Login.fmxl с другим именем (Login2.fxml) и получил то же самое исключение Location is not set. То же самое произойдет, если я положу файл в другой пакет. Поэтому проверьте, есть ли этот файл в том же пакете. Вы также можете проверить это, вручную загрузив его на start(): FXMLLoader loader = new FXMLLoader(getClass().getResource("Login.fxml")); try{ loader.load(); } catch(IOException e){} (не забудьте удалить это позже)   -  person José Pereda    schedule 24.11.2014
comment
Я пробую это в новом проекте, меняю имя пакета... но всегда получаю ту же ошибку.   -  person Marcos    schedule 25.11.2014


Ответы (2)


Caused by: java.lang.IllegalStateException: Location is not set. 

Вероятно, у вас нет файлов *.fxml в JAR. У меня такая же проблема. Попробуйте добавить фильтрацию ресурсов в ваш файл POM, как здесь: https://github.com/AdamBien/afterburner.fx/blob/master/pom.xml

    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.fxml</include>
                <include>**/*.css</include>
                <include>**/*.properties</include>
            </includes>
        </resource>
        <resource>
            <directory>src/test/java</directory>
            <includes>
                <include>**/*.fxml</include>
                <include>**/*.css</include>
                <include>**/*.properties</include>
            </includes>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.xml</include>
                <include>**/*.css</include>
                <include>**/*.css</include>
                <include>**/*.properties</include>
            </includes>
        </resource>
    </resources>

Это позволяет копировать файлы .fxml в пакеты в файле JAR.

person mats.nowak    schedule 25.11.2014

Это, вероятно, не поможет оригинальному плакату, так как ему уже 10 месяцев, но я столкнулся с той же проблемой.

Мой .fxml находился в правильном месте в моей банке. Исправление, которое я нашел, заключалось в том, что имя файла fxml должно быть написано строчными буквами.

Моя установка была DevicePanelPresenter.java, DevicePanelView.java и devicePanel.fxml. Это всегда вызывало следующее исключение

Caused by: java.lang.IllegalStateException: Location is not set.
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2438)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2413)
at com.airhacks.afterburner.views.FXMLView.loadSynchronously(FXMLView.java:87)
at com.airhacks.afterburner.views.FXMLView.initializeFXMLLoader(FXMLView.java:96)
at com.airhacks.afterburner.views.FXMLView.getPresenter(FXMLView.java:175)
at com.zai.rackit.views.main.MainPresenter.initialize(MainPresenter.java:47)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2552)

Просматривая код афтербернера, я нашел метод

String getConventionalName() {
    String clazz = this.getClass().getSimpleName().toLowerCase();
    return stripEnding(clazz);
}

Поэтому я изменил свой fxml на devicepanel.fxml, и теперь он работает.

person flycrg    schedule 25.09.2015