Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Codenameone 使用JDK 11播放常规和循环声音?_Codenameone - Fatal编程技术网

Codenameone 使用JDK 11播放常规和循环声音?

Codenameone 使用JDK 11播放常规和循环声音?,codenameone,Codenameone,我使用的是JavaJDK11.0.8(“Eclipse下安装的JRE”设置为JDK-11.0.8)、Eclipse2020-06和代码名ONE6.0.0 我最近从JDK 8切换到JDK 11,并注意到在我的应用程序中播放声音选项不再有效 请注意,我在创建应用程序时取消选中“Java8”,我只是尝试在模拟器中解决问题(我没有尝试将应用程序部署到实际的移动设备) 我想播放一个“常规声音”(我想从头到尾播放一个声音,当它结束时,我不需要从头开始重放它)和一个“循环声音”(当它结束时声音应该开始,因此,

我使用的是JavaJDK11.0.8(“Eclipse下安装的JRE”设置为JDK-11.0.8)、Eclipse2020-06和代码名ONE6.0.0

我最近从JDK 8切换到JDK 11,并注意到在我的应用程序中播放声音选项不再有效

请注意,我在创建应用程序时取消选中“Java8”,我只是尝试在模拟器中解决问题(我没有尝试将应用程序部署到实际的移动设备)

我想播放一个“常规声音”(我想从头到尾播放一个声音,当它结束时,我不需要从头开始重放它)和一个“循环声音”(当它结束时声音应该开始,因此,我可以在背景中连续播放它)

因此,我有两个问题:

问题1-关于“常规发音”

我想只创建一次媒体对象,然后在需要播放相同的常规声音时重复使用它

为此,我将在类中封装媒体创建,如下所示:

public class RegularSound {
    private Media m;
    public RegularSound(String fileName) {
        try{
        InputStream is = Display.getInstance().getResourceAsStream(getClass(), "/"+fileName);
        m = MediaManager.createMedia(is, "audio/wav");
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        
    }
    
    public void play() {
        m.setTime(0);
        m.play();
    }
}
mySound = new RegularSound("example.wav");
mySound.play();
public class LoopingSound implements Runnable{
    private Media m;
    String fileName;
    
    public LoopingSound(String fileName){
        try{
            InputStream is = Display.getInstance().getResourceAsStream(getClass(), "/"+fileName);
            m = MediaManager.createMedia(is, "audio/wav",this);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        
    }
    public void pause()
        {
        m.pause();
        }
    public void play()
        {
        m.play();
        }
    
    public void run() {
        m.setTime(0);
        m.play();
            
    }
}
Step1) Create JavaFX11 user library under Eclipse
Download JavaFX 11 from https://gluonhq.com/products/javafx/
unzip it -> creates javafx-sdk-11.0.2 folder
Create a User Library: Eclipse -> Window -> Preferences -> Java -> Build Path -> User Libraries -> New. 
Name it JavaFX11.
Hit "Add External JARs" and include all the jars under javafx-sdk-11.0.2\lib

Step 2) Add the JavaFX11 library to the project:
Right click on project.
Select Build path -> Configure Build Path 
Goto Library tab->Add Library->User Library->Check JavaFX11->Apply and Close
然后我实例化RegularSound对象并按如下方式播放:

public class RegularSound {
    private Media m;
    public RegularSound(String fileName) {
        try{
        InputStream is = Display.getInstance().getResourceAsStream(getClass(), "/"+fileName);
        m = MediaManager.createMedia(is, "audio/wav");
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        
    }
    
    public void play() {
        m.setTime(0);
        m.play();
    }
}
mySound = new RegularSound("example.wav");
mySound.play();
public class LoopingSound implements Runnable{
    private Media m;
    String fileName;
    
    public LoopingSound(String fileName){
        try{
            InputStream is = Display.getInstance().getResourceAsStream(getClass(), "/"+fileName);
            m = MediaManager.createMedia(is, "audio/wav",this);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        
    }
    public void pause()
        {
        m.pause();
        }
    public void play()
        {
        m.play();
        }
    
    public void run() {
        m.setTime(0);
        m.play();
            
    }
}
Step1) Create JavaFX11 user library under Eclipse
Download JavaFX 11 from https://gluonhq.com/products/javafx/
unzip it -> creates javafx-sdk-11.0.2 folder
Create a User Library: Eclipse -> Window -> Preferences -> Java -> Build Path -> User Libraries -> New. 
Name it JavaFX11.
Hit "Add External JARs" and include all the jars under javafx-sdk-11.0.2\lib

Step 2) Add the JavaFX11 library to the project:
Right click on project.
Select Build path -> Configure Build Path 
Goto Library tab->Add Library->User Library->Check JavaFX11->Apply and Close
请注意,example.wav直接复制到我的项目的“src”目录下

这段代码过去用于JDK 8,但在JDK 11中,我会遇到以下构建错误:

Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: javax/media/ControllerListener
    at com.codename1.impl.javase.JavaJMFSEPort$1.run(JavaJMFSEPort.java:67)
    at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
    at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
    at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
    at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: java.lang.ClassNotFoundException: javax.media.ControllerListener
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at java.base/java.lang.ClassLoader.findSystemClass(ClassLoader.java:1247)
    at com.codename1.impl.javase.ClassPathLoader.findClass(ClassPathLoader.java:269)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588)
    at com.codename1.impl.javase.ClassPathLoader.loadClass(ClassPathLoader.java:115)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at com.codename1.impl.javase.ClassPathLoader.loadClass(ClassPathLoader.java:107)
    ... 14 more
问题2-关于“循环声音”

对于循环声音,我创建了另一个类,如下所示:

public class RegularSound {
    private Media m;
    public RegularSound(String fileName) {
        try{
        InputStream is = Display.getInstance().getResourceAsStream(getClass(), "/"+fileName);
        m = MediaManager.createMedia(is, "audio/wav");
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        
    }
    
    public void play() {
        m.setTime(0);
        m.play();
    }
}
mySound = new RegularSound("example.wav");
mySound.play();
public class LoopingSound implements Runnable{
    private Media m;
    String fileName;
    
    public LoopingSound(String fileName){
        try{
            InputStream is = Display.getInstance().getResourceAsStream(getClass(), "/"+fileName);
            m = MediaManager.createMedia(is, "audio/wav",this);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        
    }
    public void pause()
        {
        m.pause();
        }
    public void play()
        {
        m.play();
        }
    
    public void run() {
        m.setTime(0);
        m.play();
            
    }
}
Step1) Create JavaFX11 user library under Eclipse
Download JavaFX 11 from https://gluonhq.com/products/javafx/
unzip it -> creates javafx-sdk-11.0.2 folder
Create a User Library: Eclipse -> Window -> Preferences -> Java -> Build Path -> User Libraries -> New. 
Name it JavaFX11.
Hit "Add External JARs" and include all the jars under javafx-sdk-11.0.2\lib

Step 2) Add the JavaFX11 library to the project:
Right click on project.
Select Build path -> Configure Build Path 
Goto Library tab->Add Library->User Library->Check JavaFX11->Apply and Close
但当我实例化LoopingSound对象并尝试播放它时,我再次遇到构建错误

所以,您能告诉我如何更改规则和循环声音的代码,以便在使用JDK 11时不会收到上述错误吗

更新

感谢您的回复@shai almog。我已经安装了CEF。但是我在运行时在控制台上收到一些消息,我听不到声音在播放。。。我运行以下代码:

try {
            InputStream is = Display.getInstance().getResourceAsStream(getClass(), "/example.wav");
            Media m = MediaManager.createMedia(is, "audio/wav");
            m.play();
    } catch (IOException e) {
            e.printStackTrace();
    }
当我运行此代码时,我在控制台上收到以下消息(它在最后抛出一个异常):

更新2

我可以手动将Open JavaFX 11添加到Eclipse中,并在使用JDK 11的同时将一个在Eclipse下运行的应用程序命名为,如下所示:

public class RegularSound {
    private Media m;
    public RegularSound(String fileName) {
        try{
        InputStream is = Display.getInstance().getResourceAsStream(getClass(), "/"+fileName);
        m = MediaManager.createMedia(is, "audio/wav");
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        
    }
    
    public void play() {
        m.setTime(0);
        m.play();
    }
}
mySound = new RegularSound("example.wav");
mySound.play();
public class LoopingSound implements Runnable{
    private Media m;
    String fileName;
    
    public LoopingSound(String fileName){
        try{
            InputStream is = Display.getInstance().getResourceAsStream(getClass(), "/"+fileName);
            m = MediaManager.createMedia(is, "audio/wav",this);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        
    }
    public void pause()
        {
        m.pause();
        }
    public void play()
        {
        m.play();
        }
    
    public void run() {
        m.setTime(0);
        m.play();
            
    }
}
Step1) Create JavaFX11 user library under Eclipse
Download JavaFX 11 from https://gluonhq.com/products/javafx/
unzip it -> creates javafx-sdk-11.0.2 folder
Create a User Library: Eclipse -> Window -> Preferences -> Java -> Build Path -> User Libraries -> New. 
Name it JavaFX11.
Hit "Add External JARs" and include all the jars under javafx-sdk-11.0.2\lib

Step 2) Add the JavaFX11 library to the project:
Right click on project.
Select Build path -> Configure Build Path 
Goto Library tab->Add Library->User Library->Check JavaFX11->Apply and Close
现在,我可以听到在我的代号一应用程序中播放的声音

但是,我需要从命令提示符下运行我的应用程序,常规命令行无法运行这些应用程序(应用程序无法从命令提示符下找到与JavaFX相关的类,我会遇到上面列出的相同错误)。那么,您能告诉我如何修改命令行,以便使用JavaFX的项目可以从命令提示符运行吗

以下是我使用的常规命令行:

java -cp dist\Proj.jar;JavaSE.jar com.codename1.impl.javase.Simulator com.mycompany.hi.Main
顺便说一句,我曾尝试将javafx-sdk-11.0.2\lib下的javafx.media.jar添加到命令行中的类路径(-cp),但没有成功

请告知

再次感谢

TL;博士

按照说明安装CEF,或者为您的虚拟机切换到ZuluFX 11

解释如下:

在我们集成CEF支持之前,这一直有效。我们会为JDK 11安装动态下载JavaFX,但这会导致很多相关问题。所以我们决定迁移到CEF,这仍在进行中,而JavaFX动态下载已经中断。一旦完成,CEF将自动安装,这将是无缝的

这会影响浏览器组件和媒体,这是JavaFX实现的两个组件。

TL;博士

按照说明安装CEF,或者为您的虚拟机切换到ZuluFX 11

解释如下:

在我们集成CEF支持之前,这一直有效。我们会为JDK 11安装动态下载JavaFX,但这会导致很多相关问题。所以我们决定迁移到CEF,这仍在进行中,而JavaFX动态下载已经中断。一旦完成,CEF将自动安装,这将是无缝的


这会影响浏览器组件和媒体,这是JavaFX实现的两个组件。

请参阅我问题中的更新。我仍然有问题,并将感谢您的帮助…这可能是一个错误的CEF。请在此提交一个问题:在这种情况下,您必须删除CEF并使用支持JavaFX的VM。您可以手动将JavaFX安装到您的虚拟机中,或者只需下载ZuluFX。再次感谢您的回答@shai almog。我已经在GitHub提交了这个问题。此外,我还成功地将JavaFX添加到Eclipse中,并为一个在Eclipse下运行的项目命名。但是,现在我在从命令提示符运行应用程序时遇到问题。请参阅我问题中的更新2。再次感谢您的帮助,谢谢!确保java命令是来自ZuluFX的命令。如果这不起作用,请尝试将jfxrt.jar从JDK安装添加到类路径。请参阅我问题中的更新。我仍然有问题,并将感谢您的帮助…这可能是一个错误的CEF。请在此提交一个问题:在这种情况下,您必须删除CEF并使用支持JavaFX的VM。您可以手动将JavaFX安装到您的虚拟机中,或者只需下载ZuluFX。再次感谢您的回答@shai almog。我已经在GitHub提交了这个问题。此外,我还成功地将JavaFX添加到Eclipse中,并为一个在Eclipse下运行的项目命名。但是,现在我在从命令提示符运行应用程序时遇到问题。请参阅我问题中的更新2。再次感谢您的帮助,谢谢!确保java命令是来自ZuluFX的命令。如果不起作用,请尝试将jfxrt.jar从JDK安装添加到类路径。