首页 > 解决方案 > 如何定期在两种颜色之间进行矩形更改?

问题描述

我一直在尝试制作一个程序,该程序将显示一个视觉节拍器,该节拍器将通过感应我使用 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      
    }    
}

标签: java

解决方案


推荐阅读