java - 如何定期在两种颜色之间进行矩形更改?
问题描述
我一直在尝试制作一个程序,该程序将显示一个视觉节拍器,该节拍器将通过感应我使用 MIDI 编辑器添加的“点击”轨道与 MIDI 文件同步闪烁。
我只有 Java 编程的基本知识,但一直在努力完成这个项目。特别是,我在图形部分遇到问题。作为我的测试和故障排除的一部分,我在条件语句中添加了一个 println,它在“点击”开始时为真,这部分似乎运行良好。
点击大约每秒发生 2 次,每次点击持续大约 1/10 秒。我想要一个矩形,在点击时呈红色,在点击不存在时呈灰色。附加的代码实际上可以正常工作(我敢肯定,这是一个完整的黑客工作),但只是一个节拍(我一直在使用的 MIDI 文件有 72 次点击,但 JFrame 只闪烁 71 次)。
我怀疑正确的方法是绘制一个矩形并以某种方式更改或更新条件语句中的填充颜色。我花了很多时间研究这个并尝试不同的方法,但我真的不知道什么是正确的方法。
我将不胜感激任何指导,也许还有一些代码片段。
import java.io.File;
import java.io.IOException;
import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.MidiMessage;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.MidiUnavailableException;
import javax.sound.midi.Receiver;
import javax.sound.midi.Sequence;
import javax.sound.midi.Sequencer;
import javax.sound.midi.ShortMessage;
import javax.sound.midi.Transmitter;
import java.awt.*;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Midi6 extends JPanel implements Receiver
{
private static final int NOTE_ON = 144;
private static final int NOTE_OFF = 128;
int count = 0;
int count2 = 0;
Sequencer sequencer = MidiSystem.getSequencer();
String str = new String();
public Midi6() throws MidiUnavailableException, InvalidMidiDataException, IOException, InterruptedException
{
Sequence sequence = MidiSystem.getSequence(new File("miditest2.mid"));
sequencer.open();
sequencer.setSequence(sequence);
Transmitter transmitter = sequencer.getTransmitter();
transmitter.setReceiver(this);
sequencer.start();
}
public static void main(String[] args) throws InvalidMidiDataException, IOException, MidiUnavailableException, InterruptedException
{
Midi6 midi6 = new Midi6();
JFrame frame1=new JFrame();
frame1.add(midi6);
frame1.setSize(600,100);
frame1.getContentPane().setBackground( Color.LIGHT_GRAY);
frame1.setVisible(true);
}
synchronized public void send(MidiMessage message, long timeStamp)
{
if(message instanceof ShortMessage)
{
ShortMessage sm = (ShortMessage) message;
int channel = sm.getChannel();
if (sm.getCommand() == NOTE_ON)
{
if (channel == 0)
{
setBackground(Color.RED);
count ++;
System.out.println(count);
}
}
else if (sm.getCommand() == NOTE_OFF)
{
if (channel == 0)
{
setBackground(Color.LIGHT_GRAY);
}
}
else
{
}
}
}
@Override
public void close()
{
// TODO Auto-generated method stub
}
}
解决方案
推荐阅读
- snowflake-cloud-data-platform - 变体列用逗号分隔文件中的json值?
- flutter - 什么时候关闭 Flutter 的 Dio 包中的 Dio 客户端?
- c++ - 如何在 C++ 中制作与 Delphi 中类似的结构
- python - Python - 拼字游戏字数
- facebook - 从我的 Facebook 直播中实时检索 Facebook 直播评论
- typescript - 打字稿抽象属性
- java - 处理函数之外的资源的 AWS 容器重用和同步
- python-3.x - 如果从命令行调用一个类而不是在代码中调用一个类,python 中是否有办法运行不同的函数?
- powerbi - Power BI 计算多级矩阵中两列之间的差异
- c# - 关于解决问题的最佳方法的建议 - C# Windows 表单(列表框、文本框、用户输入)