JAVAFX Проблема при попытке воспроизведения звука при нажатии кнопки

Я пытаюсь воспроизвести звук Windows, когда пользователь нажимает кнопку. Код чуть ниже:

public class TestController extends Application {

    public String audio = getClass().getResource("src/Sounds/WindowsError.wav").toString();

     @FXML
     private Button playbt;

     @FXML
     void playtest(MouseEvent event)     
     {

         System.out.println("Clicked!");
        AudioClip clip = new AudioClip(audio);// 1
        clip.play(); // 2

     }

    @Override
    public void start(Stage primaryStage) {


        try 

        {

            FXMLLoader loader = new FXMLLoader(this.getClass().getResource("/FXML/Test.fxml"));
            Parent root = loader.load();
            Scene scene = new Scene(root);
            primaryStage.setTitle("Test");
            primaryStage.setScene(scene);
            primaryStage.setResizable(false);
            primaryStage.show();

        } 

        catch (IOException e) 

        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }

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

Контроллер правильно настроен на FXML. Однако когда я пытаюсь запустить проект, возникает следующая ошибка.

Exception in Application constructor java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    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(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
 Caused by: java.lang.RuntimeException: Unable to construct Application instance: class Controller.TestController
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:907)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$159(LauncherImpl.java:182)
    at java.lang.Thread.run(Unknown Source)
 Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$165(LauncherImpl.java:819)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$179(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$177(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$178(PlatformImpl.java:294)
    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$152(WinApplication.java:177)
    ... 1 more
 Caused by: java.lang.NullPointerException
    at Controller.TestController.<init>(TestController.java:17)
    ... 13 more Exception running application Controller.TestController

Файлы в моем проекте расположены следующим образом:

введите описание изображения здесь

Кто-нибудь знает, почему возникает эта ошибка? Проект зависает при открытии из-за кода воспроизведения звука.

Всего 1 ответ


Я не совсем уверен в этом, но я думаю, что синтаксис getResource для аудио-переменной находится в форме «относительного адреса», так как он не начинается с «/». Другими словами, он может искать подпапку src в папке пакета Controller.

Возможно, следующее поможет системе найти ваш аудио ресурс:

public String audio = getClass().getResource("../Sounds/WindowsError.wav").toString();

Возможно, было бы хорошо перенести эту строку в метод start () и запустить System.out.println (audio), чтобы проверить, что у вас есть на данный момент.

РЕДАКТИРОВАТЬ: только что увидел комментарий Фабиана. Переход на форму с использованием корня пути к классу, как он предлагает, может быть более общей практикой, чем мое предложение использовать относительный путь.


Есть идеи?

10000