zoukankan      html  css  js  c++  java
  • 我的第一个长程序,虽然是直接抄了书上,可是还是出现了两次拼写错误,最终还是找到异常的答案,改过来了。

    一开始是下面红字部分,那个数组,少打了一个字,导致·原来16字长的数组变成了15字长,在后面,instruments数组赋值给其他数组的时候,出现了数组溢出的错误。


    1
    import java.awt.*; 2 import javax.swing.*; 3 import javax.sound.midi.*; 4 import java.util.*; 5 import java.awt.event.*; 6 7 public class BeatBox { 8 9 JPanel mainPanel; 10 ArrayList<JCheckBox> checkboxList; 11 Sequencer sequencer; 12 Sequence sequence; 13 Track track; 14 JFrame theFrame; 15 16 String[] instrumentNames={"Bass Drum","Closed Hi-Hat", 17 "Open Hi-Hat","Acoustic Snare","Crash Cymbal", 18 "Hand Clap","High Tom","Hi Bongo","Maracas","Whistle", 19 "Low Conga","Cowbell","Vibraslap","Low-mid Tom","High Agogo","Open Hi Conga"};//乐器的名称,以String的array维护。 20 int[] instruments={35,42,46,38,49,39,50,60,70,72,64,56,58,47,67,63};//实际的乐器关键字,例如说35是bass,42是Closed Hi-Hat 21 22 public static void main(String[] args){ 23 new BeatBox().buildGUI(); 24 } 25 public void buildGUI(){ 26 theFrame=new JFrame("CyberBeatBox"); 27 theFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 28 BorderLayout layout=new BorderLayout(); 29 JPanel background=new JPanel(layout); 30 background.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));//设置面板上摆设组件时的空白边缘。 31 32 checkboxList=new ArrayList<JCheckBox>(); 33 Box buttonBox=new Box(BoxLayout.Y_AXIS);//设置buttonBox沿着Y轴摆放。 34 35 JButton start=new JButton("Start"); 36 start.addActionListener(new MyStartListener()); 37 buttonBox.add(start); 38 39 JButton stop=new JButton("Stop"); 40 stop.addActionListener(new MyStopListener()); 41 buttonBox.add(stop); 42 43 JButton upTempo=new JButton("Tempo Up"); 44 upTempo.addActionListener(new MyUpTempoListener()); 45 buttonBox.add(upTempo); 46 47 JButton downTempo=new JButton("Tempo Down"); 48 downTempo.addActionListener(new MyDownTempoListener()); 49 buttonBox.add(downTempo); 50 51 Box nameBox=new Box(BoxLayout.Y_AXIS); 52 for (int i=0;i<16;i++){ 53 nameBox.add(new Label(instrumentNames[i])); 54 } 55 56 background.add(BorderLayout.EAST,buttonBox); 57 background.add(BorderLayout.WEST,nameBox); 58 59 theFrame.getContentPane().add(background); 60 61 GridLayout grid=new GridLayout(16,16); 62 grid.setVgap(1); 63 grid.setHgap(2); 64 mainPanel=new JPanel(grid); 65 background.add(BorderLayout.CENTER,mainPanel); 66 67 for(int i=0;i<256;i++){ 68 JCheckBox c=new JCheckBox(); 69 c.setSelected(false); 70 checkboxList.add(c); 71 mainPanel.add(c); 72 }//创建checkbox组,设定成未勾选的为false并加到ArrayList和面板上。 73 74 setUpMidi(); 75 76 theFrame.setBounds(50,50,300,300); 77 theFrame.pack(); 78 theFrame.setVisible(true); 79 }//关闭方法 80 81 public void setUpMidi() { 82 // TODO Auto-generated method stub 83 try{ 84 sequencer=MidiSystem.getSequencer(); 85 sequencer.open(); 86 sequence=new Sequence(Sequence.PPQ,4); 87 track=sequence.createTrack(); 88 sequencer.setTempoInBPM(120); 89 }catch(Exception e){e.printStackTrace();} 90 }//关闭方法 91 public void buildTrackAndStart(){ 92 int[] trackList=null; 93 94 sequence.deleteTrack(track); 95 track=sequence.createTrack(); 96 97 for(int i=0;i<16;i++){ 98 trackList=new int[16]; 99 100 int key=instruments[i]; 101 102 for(int j=0;j<16;j++){ 103 JCheckBox jc=(JCheckBox) checkboxList.get(j+(16*i)); 104 if(jc.isSelected()){ 105 trackList[j]=key; 106 }else{ 107 trackList[j]=0; 108 } 109 }//关闭内部循环 110 111 makeTracks(trackList); 112 track.add(makeEvent(176,1,127,0,16)); 113 }//关闭外部循环 114 115 track.add(makeEvent(192,9,1,0,15)); 116 try{ 117 118 sequencer.setSequence(sequence); 119 sequencer.setLoopCount(sequencer.LOOP_CONTINUOUSLY); 120 sequencer.start(); 121 sequencer.setTempoInBPM(120); 122 }catch(Exception e){e.printStackTrace();} 123 }//关闭buildTrackAndStart方法。 124 public class MyStartListener implements ActionListener{ 125 public void actionPerformed(ActionEvent a){ 126 //buildTrackAndStart(); 127 buildTrackAndStart(); 128 } 129 }//关闭内部类 130 public class MyStopListener implements ActionListener{ 131 public void actionPerformed(ActionEvent a){ 132 sequencer.stop(); 133 } 134 }//关闭内部类 135 public class MyUpTempoListener implements ActionListener{ 136 public void actionPerformed(ActionEvent a){ 137 float tempoFactor=sequencer.getTempoFactor(); 138 sequencer.setTempoFactor((float)(tempoFactor*1.03)); 139 } 140 }//关闭内部类 141 public class MyDownTempoListener implements ActionListener{ 142 public void actionPerformed(ActionEvent a){ 143 float tempoFactor=sequencer.getTempoFactor(); 144 sequencer.setTempoFactor((float)(tempoFactor*.97)); 145 } 146 }//关闭内部类 147 148 149 public void makeTracks(int[] list){ 150 for(int i=0;i<16;i++){ 151 int key=list[i]; 152 153 if(key!=0){ 154 track.add(makeEvent(144,9,key,100,i)); 155 track.add(makeEvent(128,9,key,100,i+1)); 156 } 157 } 158 } 159 public MidiEvent makeEvent(int comd,int chan,int one,int two,int tick){ 160 MidiEvent event=null; 161 try{ 162 ShortMessage a=new ShortMessage(); 163 a.setMessage(comd,chan,one,two); 164 event=new MidiEvent(a,tick); 165 }catch(Exception e){e.printStackTrace();} 166 return event; 167 } 168 }

    下面这个报错,就是运行时候,出现了“数组越界问题。”:。。。。。java.lang.ArrayIndexOutOfBoundsException....翻译成汉语,还真是数组越界。。。不难嘛~~~

  • 相关阅读:
    flask基础之请求处理核心机制(五)
    flask基础之app初始化(四)
    python内置模块之itertools
    python基础之命名空间
    python进阶之类常用魔法方法和魔法属性
    python进阶之函数和类内建魔法属性
    mysql笔记一——安装和设置root密码
    centos7环境安装rabbitMQ
    查询数据库锁
    [转]低成本搭建谷歌镜像
  • 原文地址:https://www.cnblogs.com/meihao1989/p/3248734.html
Copyright © 2011-2022 走看看