首页 > 解决方案 > 使用 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");
        });

标签: javaswinganimationmidijslider

解决方案


仅当我用鼠标单击滑块时,滑块的位置才会更新。

   tickDisplay.addChangeListener(e -> {
        tickDisplay.setValue((int)sequencer.getTickPosition());

使用 ChangeListener 的要点是当用户更改滑块时它会生成一个事件。

您不想在滑块上监听更改事件,您需要在“序列器”上监听更改事件。然后,当音序器生成事件时,您会更新滑块。我不知道声音 API,因此您需要阅读 API 文档以了解可以使用哪些侦听器。

如果音序器没有生成事件,那么您可以使用 Swing Timer 来轮询音序器。您将 Timer 设置为以指定的时间间隔生成事件。当 Timer 触发时,您将获得音序器刻度位置,然后更新您的滑块。

阅读 Swing 教程中有关如何使用计时器的部分以获取更多信息。


推荐阅读