我正在尝试调整我的程序以在 Java 12 上运行。它目前在 Java 8 上运行并具有一些 JavaFX 组件(一些对话框)。它不是模块化的。我的 IDE 是 Eclipse,JavaFX jar 文件作为用户库包含在构建路径中。我想生成一个可运行的 jar 并将 javafx 文件捆绑在其中或将它们添加到自定义 JRE,以便我可以分发它,而不需要最终用户单独安装 Java12 或 JavaFX。
首先,我想尝试一个简单的HelloFX程序,修改后使其更类似于我的程序。
public class HelloFX2 {
public HelloFX2() {
startToolkit();
// have to wait a second for the JavaFX thread to actually start, or else the Platform.runLater throws an exception
try
{
Thread.sleep(1000);
}
catch(InterruptedException ex)
{
Thread.currentThread().interrupt();
}
// create the scene and display
Platform.runLater(() -> {
Scene theScene = createTheScene();
final Stage stage = new …Run Code Online (Sandbox Code Playgroud) 有一个处理实时数据的应用程序,该应用程序应在发生特定事件时发出蜂鸣声。触发事件每秒可能发生多次,并且如果在另一个事件触发时蜂鸣声已经在播放,则代码应该忽略它(与中断当前蜂鸣声并开始新的蜂鸣声相反)。这是基本代码:
Clip clickClip
public void prepareProcess() {
super.prepareProcess();
clickClip = null;
try {
clipFile = new File("C:/WINDOWS/Media/CHIMES.wav");
ais = AudioSystem.getAudioInputStream(clipFile);
clickClip = AudioSystem.getClip();
clickClip.open(ais);
fileIsLoaded = true;
} catch (Exception ex) {
clickClip = null;
fileIsLoaded = false;
}
}
public void playSound() {
if (fileIsLoaded) {
if ((clickClip==null) || (!clickClip.isRunning())) {
try {
clickClip.setFramePosition(0);
clickClip.start();
} catch (Exception ex) {
System.out.println("Cannot play click noise");
ex.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
prepareProcess方法从头开始运行一次,并且每次触发事件发生时都会调用playSound方法。我的问题是:是否需要关闭clickClip对象?我知道我可以添加一个actionListener来监视Stop事件,但是由于该事件频繁发生,我担心额外的处理会减慢实时数据收集的速度。
该代码似乎运行良好,但我担心的是内存泄漏。上面的代码基于我在网上搜索时发现的示例,但是该示例使用了一个actionListener来专门关闭Clip,“以消除未实现stop方法时发生的内存泄漏”。我的程序打算运行几个小时,所以我遇到的任何内存泄漏都会引起问题。
老实说:我不知道如何验证我是否有问题。我正在使用Netbeans,并且运行内存事件探查器只是给了我一大堆我不知道如何阅读的内容。这应该是该程序的简单部分,而我正在花费数小时。任何帮助将不胜感激!
麦可