Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使矩形在两种颜色之间周期性地改变?_Java - Fatal编程技术网

Java 如何使矩形在两种颜色之间周期性地改变?

Java 如何使矩形在两种颜色之间周期性地改变?,java,Java,我一直在尝试制作一个程序,通过感应我使用MIDI编辑器添加的“点击”轨迹,显示一个视觉节拍器,它将与MIDI文件同步闪烁 我只掌握Java编程的基本知识,但一直在努力完成这个项目。特别是,我在图形部分遇到了问题。作为测试和故障排除的一部分,我在条件语句中添加了一个println,当“click”启动时该语句为true,这一部分似乎工作得很好 点击大约每秒发生2次,每次点击持续约1/10秒。我想一个矩形形状,是红色的,在时间的点击是存在的,灰色的,当点击是不存在的。所附的代码实际上可以正常工作(我

我一直在尝试制作一个程序,通过感应我使用MIDI编辑器添加的“点击”轨迹,显示一个视觉节拍器,它将与MIDI文件同步闪烁

我只掌握Java编程的基本知识,但一直在努力完成这个项目。特别是,我在图形部分遇到了问题。作为测试和故障排除的一部分,我在条件语句中添加了一个println,当“click”启动时该语句为true,这一部分似乎工作得很好

点击大约每秒发生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      
    }    
}

我可能能够提供帮助,但拥有
midi
文件会很有用。我很高兴与您分享,但是,我没有看到附加文件的方法……我知道的唯一方法是使用公共dropbox类型的服务之一并包含链接。如果你这样做,我愿意看一看。谢谢WJS的提议。我找到了一些解决方法来避免丢失的节拍(在MIDI文件的开头添加了一个空白度量值)。使用JFrame对象的setBackground方法似乎是更改颜色的最佳方法。我不确定是否还有其他选择,但这似乎效果不错,而且相当直接。使用fillRectangle似乎非常复杂,在我的代码中不容易实现。再次感谢。干杯今后,我将尽量使我的问题简短明了。