Codenameone 使用JDK 11播放常规和循环声音?
我使用的是JavaJDK11.0.8(“Eclipse下安装的JRE”设置为JDK-11.0.8)、Eclipse2020-06和代码名ONE6.0.0 我最近从JDK 8切换到JDK 11,并注意到在我的应用程序中播放声音选项不再有效 请注意,我在创建应用程序时取消选中“Java8”,我只是尝试在模拟器中解决问题(我没有尝试将应用程序部署到实际的移动设备) 我想播放一个“常规声音”(我想从头到尾播放一个声音,当它结束时,我不需要从头开始重放它)和一个“循环声音”(当它结束时声音应该开始,因此,我可以在背景中连续播放它) 因此,我有两个问题: 问题1-关于“常规发音” 我想只创建一次媒体对象,然后在需要播放相同的常规声音时重复使用它 为此,我将在类中封装媒体创建,如下所示:Codenameone 使用JDK 11播放常规和循环声音?,codenameone,Codenameone,我使用的是JavaJDK11.0.8(“Eclipse下安装的JRE”设置为JDK-11.0.8)、Eclipse2020-06和代码名ONE6.0.0 我最近从JDK 8切换到JDK 11,并注意到在我的应用程序中播放声音选项不再有效 请注意,我在创建应用程序时取消选中“Java8”,我只是尝试在模拟器中解决问题(我没有尝试将应用程序部署到实际的移动设备) 我想播放一个“常规声音”(我想从头到尾播放一个声音,当它结束时,我不需要从头开始重放它)和一个“循环声音”(当它结束时声音应该开始,因此,
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安装添加到类路径。