java - 使用 midi 音序器及时为 Java Swing 滑块设置动画的问题
问题描述
我正在构建一个简单的鼓机应用程序,并想尝试为滑块设置动画以随着节拍移动以显示鼓机在小节的第 16 个音符上。
我已经使用 javax.sound.midi api 设置了一个以 16 拍循环运行的音序器。该程序的声音方面运行良好,但我希望屏幕底部的滑块可以循环播放我听到的节拍。
当我对代码实施 changeListener 时,只有当我用鼠标单击滑块时,滑块的位置才会更新。
我尝试使用滑块和 JPanel 的 updateUI、重绘、重新验证方法,但没有任何变化。
真的有可能以这种方式为 GUI 元素设置动画吗?
我正在使用摇摆 API
tickDisplaySlider.addChangeListener(e -> {
tickDisplaySlider.setValue((int)sequencer.getTickPosition());
tickDisplaySlider.repaint();
System.out.println(Thread.currentThread() + " is running");
});
解决方案
仅当我用鼠标单击滑块时,滑块的位置才会更新。
tickDisplay.addChangeListener(e -> {
tickDisplay.setValue((int)sequencer.getTickPosition());
使用 ChangeListener 的要点是当用户更改滑块时它会生成一个事件。
您不想在滑块上监听更改事件,您需要在“序列器”上监听更改事件。然后,当音序器生成事件时,您会更新滑块。我不知道声音 API,因此您需要阅读 API 文档以了解可以使用哪些侦听器。
如果音序器没有生成事件,那么您可以使用 Swing Timer 来轮询音序器。您将 Timer 设置为以指定的时间间隔生成事件。当 Timer 触发时,您将获得音序器刻度位置,然后更新您的滑块。
阅读 Swing 教程中有关如何使用计时器的部分以获取更多信息。
推荐阅读
- tensorflow - 尝试从源代码安装 TensorFlow 时出现 Bazel 安装错误
- flask - 如何在与端口 80 上运行的主站点不同的端口上提供 Flask 应用程序?
- python - 使用与 HYPERLINK 链接的颜色突出显示目标单元格
- c# - 除了添加 [Key] 或将变量命名为 ID 或 EntityNameId 之外,“Entity Type has no key defined”错误的解决方案是什么?
- batch-file - 音频转换:批处理文件中的嵌套循环没有输出
- postgresql - 尝试在 psql 中使用“\i [文件名]”,得到“无效参数”
- java - 登录特定帐户,检索帐户数据
- javascript - 如果 Firestore 批处理超过一定数量的作业,它不会永远完成
- javascript - 如何在每两个 v-for 生成的标签之间插入一个新标签?
- javascript - 给泡泡添加点 - JS