Java 如何使矩形在两种颜色之间周期性地改变?
我一直在尝试制作一个程序,通过感应我使用MIDI编辑器添加的“点击”轨迹,显示一个视觉节拍器,它将与MIDI文件同步闪烁 我只掌握Java编程的基本知识,但一直在努力完成这个项目。特别是,我在图形部分遇到了问题。作为测试和故障排除的一部分,我在条件语句中添加了一个println,当“click”启动时该语句为true,这一部分似乎工作得很好 点击大约每秒发生2次,每次点击持续约1/10秒。我想一个矩形形状,是红色的,在时间的点击是存在的,灰色的,当点击是不存在的。所附的代码实际上可以正常工作(我肯定这是一个完整的黑客工作),但只差一拍(我一直在使用的MIDI文件上有72次点击,但JFrame只闪烁71次) 我怀疑正确的方法是画一个矩形,然后以某种方式更改或更新条件语句中的填充颜色。我花了很多时间研究这一点,并尝试不同的方法,但我真的不知道什么是正确的方式进行 我将非常感谢任何指导和一些代码片段Java 如何使矩形在两种颜色之间周期性地改变?,java,Java,我一直在尝试制作一个程序,通过感应我使用MIDI编辑器添加的“点击”轨迹,显示一个视觉节拍器,它将与MIDI文件同步闪烁 我只掌握Java编程的基本知识,但一直在努力完成这个项目。特别是,我在图形部分遇到了问题。作为测试和故障排除的一部分,我在条件语句中添加了一个println,当“click”启动时该语句为true,这一部分似乎工作得很好 点击大约每秒发生2次,每次点击持续约1/10秒。我想一个矩形形状,是红色的,在时间的点击是存在的,灰色的,当点击是不存在的。所附的代码实际上可以正常工作(我
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
}
}
我可能能够提供帮助,但拥有
midi
文件会很有用。我很高兴与您分享,但是,我没有看到附加文件的方法……我知道的唯一方法是使用公共dropbox类型的服务之一并包含链接。如果你这样做,我愿意看一看。谢谢WJS的提议。我找到了一些解决方法来避免丢失的节拍(在MIDI文件的开头添加了一个空白度量值)。使用JFrame对象的setBackground方法似乎是更改颜色的最佳方法。我不确定是否还有其他选择,但这似乎效果不错,而且相当直接。使用fillRectangle似乎非常复杂,在我的代码中不容易实现。再次感谢。干杯今后,我将尽量使我的问题简短明了。