无法在 JavaFX 中播放音频

问题描述 投票:0回答:0

我正在使用 JavaFX 开发应用程序,但在主菜单中播放背景音乐时遇到了严重问题。当我尝试创建一个新的媒体对象时,applicationc 崩溃了,我不知道为什么。

我以为程序找不到文件,但它可以。如果我通过 File 类检查文件是否存在,它会说存在!我按照官方 JavaFX 20 documentation 正确地为媒体对象提供了文件路径(至少我认为我是)。 MP3 没有损坏,我可以通过 VLC 播放它。我将 Eclipse IDE 与 JavaFX 20Java 20 一起使用。

这是我得到的错误。

Exception in Application start method
java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:119)
    at java.base/java.lang.reflect.Method.invoke(Method.java:578)
    at [email protected]/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464)
    at [email protected]/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
    at java.base/java.lang.reflect.Method.invoke(Method.java:578)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1081)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at [email protected]/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:893)
    at [email protected]/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
    at java.base/java.lang.Thread.run(Thread.java:1623)
Caused by: javafx.fxml.LoadException: 
/C:/Users/jo/Desktop/Java/eclipse-workspace/Example/src/main/views/MainMenu.fxml

    at [email protected]/javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2722)
    at [email protected]/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2692)
    at [email protected]/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2563)
    at [email protected]/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3376)
    at [email protected]/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3332)
    at [email protected]/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3300)
    at [email protected]/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3272)
    at [email protected]/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3248)
    at [email protected]/javafx.fxml.FXMLLoader.load(FXMLLoader.java:3241)
    at main.Main.start(Main.java:18)
    at [email protected]/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:839)
    at [email protected]/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:483)
    at [email protected]/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:456)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
    at [email protected]/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:455)
    at [email protected]/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at [email protected]/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at [email protected]/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:185)
    ... 1 more
Caused by: java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:119)
    at java.base/java.lang.reflect.Method.invoke(Method.java:578)
    at com.sun.javafx.reflect.Trampoline.invoke(MethodUtil.java:72)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
    at java.base/java.lang.reflect.Method.invoke(Method.java:578)
    at [email protected]/com.sun.javafx.reflect.MethodUtil.invoke(MethodUtil.java:270)
    at [email protected]/com.sun.javafx.fxml.MethodHelper.invoke(MethodHelper.java:84)
    at [email protected]/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2688)
    ... 17 more
Caused by: java.lang.IllegalAccessError: class com.sun.media.jfxmediaimpl.NativeMediaManager (in unnamed module @0x1314f17) cannot access class com.sun.glass.utils.NativeLibLoader (in module javafx.graphics) because module javafx.graphics does not export com.sun.glass.utils to unnamed module @0x1314f17
    at com.sun.media.jfxmediaimpl.NativeMediaManager.lambda$new$0(NativeMediaManager.java:110)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:571)
    at com.sun.media.jfxmediaimpl.NativeMediaManager.<init>(NativeMediaManager.java:107)
    at com.sun.media.jfxmediaimpl.NativeMediaManager$NativeMediaManagerInitializer.<clinit>(NativeMediaManager.java:77)
    at com.sun.media.jfxmediaimpl.NativeMediaManager.getDefaultInstance(NativeMediaManager.java:89)
    at com.sun.media.jfxmedia.MediaManager.canPlayProtocol(MediaManager.java:78)
    at com.sun.media.jfxmedia.locator.Locator.<init>(Locator.java:240)
    at javafx.scene.media.Media.<init>(Media.java:392)
    at main.controllers.MainMenuController.music(MainMenuController.java:15)
    at main.controllers.MainMenuController.initialize(MainMenuController.java:11)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
    ... 24 more
Exception running application main.Main

可重现的例子:

Main.java

package main;

import java.io.File;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage arg0) throws Exception {
        Parent root = FXMLLoader.load(new File("src/main/views/MainMenu.fxml").toURI().toURL());
        Scene scene = new Scene(root);
        arg0.setFullScreen(true);
        arg0.setScene(scene);
        arg0.show();
    }
}

主菜单.fxml

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

<?import javafx.scene.layout.BorderPane?>


<BorderPane xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/19" fx:controller="main.controllers.MainMenuController">
    <!-- TODO Add Nodes -->
</BorderPane>

MainMenuController.java

package main.controllers;

import java.io.File;

import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.util.Duration;

public class MainMenuController {
    public void initialize() {
        music();
    }
    
    public void music() {
        Media media = new Media(new File("src/main/resources/mainmenu.mp3").toURI().toString());
        MediaPlayer mp = new MediaPlayer(media);
        mp.setOnEndOfMedia(new Runnable() {
            @Override
            public void run() {
                mp.seek(Duration.ZERO);
            }
        });
        mp.setVolume(1);
        mp.play();
    }
}

文件夹结构:

.
└── src/
    ├── main/
    │   ├── controllers/
    │   │   └── MainMenuController.java
    │   ├── views/
    │   │   └── MainMenu.fxml
    │   └── resources/
    │       └── mainmenu.mp3
    └── Main.java

非常感谢任何帮助。

java javafx audio media-player
© www.soinside.com 2019 - 2024. All rights reserved.