JAVAFX Проблема при попытке воспроизведения звука при нажатии кнопки - PullRequest
0 голосов
/ 17 мая 2019

Я пытаюсь воспроизвести звук 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

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

enter image description here

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

1 Ответ

0 голосов
/ 18 мая 2019

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

Может быть, следующее поможет системе найти ваш аудио ресурс:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...