这里内部类嵌套在外部类上BeatMusic,内部类使用外部类的实例和方法就像开自家冰箱一样,这里的内部类就是实现不同功能的按钮监听器,按钮就会有不同的功能,

也就是用不同的内部类实现相同的接口。这里都是ActionListened

package com.example.zxlib;import java.awt.*;import javax.swing.*;
import javax.sound.midi.*;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.*;
import java.awt.event.*;public class BeatMusic {JPanel mainPanel;JPanel mainPanel2;int keychan = 9;ArrayList<JCheckBox> checkaboxList;ArrayList<JCheckBox> checkchansList;Sequence sequence;Sequencer sequencer;Track track;JFrame theFrame;String[] instrumentNames = {"Baa Drum", "Closed Hi-Hat","Open Hi-Hat", "Acoustic Snare", "Crash Cymbal","Hand Clap", "High Tom", "Hi Bongo", "Maracas","Whistlte", "Low Conga", "CowBell", "Vibraslap", "Low-mid Tom","High Agogo", "Open Hi Conga"};int[] instruments = {35, 42, 46, 38, 49, 39, 50, 60, 70, 72, 64, 56, 58, 47, 67, 63};int[] chans = {1, 2, 3, 4, 5, 6, 7, 8, 9};public static void main(String[] args) {new BeatMusic().buildGUI();}public void buildGUI() {theFrame = new JFrame("Cyber BeatBox");theFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);BorderLayout layout = new BorderLayout();JPanel background = new JPanel(layout);background.setBorder(BorderFactory.createEmptyBorder(10, 10, 101, 10));checkaboxList = new ArrayList<JCheckBox>();checkchansList = new ArrayList<JCheckBox>();Box buttonBox = new Box(BoxLayout.Y_AXIS);JButton start = new JButton("Start");start.addActionListener(new MyStartListener());buttonBox.add(start);JButton stop = new JButton("Stop");stop.addActionListener(new MyStopListener());buttonBox.add(stop);JButton clear = new JButton("Clear");clear.addActionListener(new MyClearListener());buttonBox.add(clear);JButton restore = new JButton("Restore");restore.addActionListener(new MyRestoreListener());buttonBox.add(restore);//        JButton serialize= new JButton("Serizalizelt");
//        serialize.addActionListener(new MySerizalizeListener());
//        buttonBox.add(serialize);JButton read=new JButton("Read");read.addActionListener(new MyReadListener());buttonBox.add(read);JButton upTempo = new JButton("tempUP");upTempo.addActionListener(new MyUpTempoListener());buttonBox.add(upTempo);JButton downTempo = new JButton("tempDown");downTempo.addActionListener(new MyDownTempoListener());buttonBox.add(downTempo);Box nameBox = new Box(BoxLayout.Y_AXIS);for (int i = 0; i < 16; i++) {nameBox.add(new Label(instrumentNames[i]));}Box chanBox = new Box(BoxLayout.X_AXIS);background.add(BorderLayout.EAST, buttonBox);background.add(BorderLayout.WEST, nameBox);theFrame.getContentPane().add(background);GridLayout grid = new GridLayout(16, 16);grid.setVgap(1);grid.setVgap(2);mainPanel = new JPanel(grid);GridLayout grid2 = new GridLayout(1, 10);grid2.setVgap(1);grid2.setVgap(2);mainPanel2 = new JPanel(grid2);background.add(BorderLayout.CENTER, mainPanel);background.add(BorderLayout.SOUTH, mainPanel2);
//        background.add(BorderLayout.SOUTH, chanBox);for (int i = 0; i < 10; i++) {chanBox.add(new Label(i + ""));JCheckBox cc = new JCheckBox();cc.setSelected(false);checkchansList.add(cc);mainPanel2.add(cc);};for (int i = 0; i < 256; i++) {JCheckBox c = new JCheckBox();c.setSelected(false);checkaboxList.add(c);mainPanel.add(c);}setUpMidi();theFrame.setBounds(50, 50, 300, 300);theFrame.pack();theFrame.setVisible(true);}public void setUpMidi() {try {sequencer = MidiSystem.getSequencer();sequencer.open();sequence = new Sequence(Sequence.PPQ, 4);track = sequence.createTrack();sequencer.setTempoInBPM(120);} catch (MidiUnavailableException e) {e.printStackTrace();} catch (InvalidMidiDataException e) {e.printStackTrace();}}public void buildClear() {for (int i = 0; i < 256; i++) {JCheckBox jjc = (JCheckBox) checkaboxList.get(i);jjc.setSelected(false);}}public int changeChans() {// int[] chanList = null;int chan = 9;for (int i = 0; i < 10; i++) {JCheckBox jcc = (JCheckBox) checkchansList.get(i);if (jcc.isSelected()) {//      chanList[i] = i;chan = i+8;break;}}return chan;}public final void buildTrackAndStart() {keychan = changeChans();int[] trackList = null;sequence.deleteTrack(track);track = sequence.createTrack();for (int i = 0; i < 16; i++) {trackList = new int[16];int key = instruments[i];for (int j = 0; j < 16; j++) {JCheckBox jc = (JCheckBox) checkaboxList.get(j + (16 * i));if (jc.isSelected()) {trackList[j] = key;} else {trackList[j] = 0;}}System.out.println("keychan is:"+keychan);
//怎么改变chan来改变不同乐器演奏?makeTracks(trackList);track.add(makeEvent(176, keychan, 127, 0, 16));}track.add(makeEvent(192, keychan, 1, 0, 15));try {sequencer.setSequence(sequence);sequencer.setLoopCount(sequencer.LOOP_CONTINUOUSLY);sequencer.start();sequencer.setTempoInBPM(120);} catch (Exception E) {E.printStackTrace();}}public class MyStartListener implements ActionListener {public void actionPerformed(ActionEvent a) {buildTrackAndStart();}}public class MyStopListener implements ActionListener {public void actionPerformed(ActionEvent a) {sequencer.stop();}}public class MyClearListener implements ActionListener {public void actionPerformed(ActionEvent a) {buildClear();}}public class MyUpTempoListener implements ActionListener {public void actionPerformed(ActionEvent a) {float tempoFactor = sequencer.getTempoFactor();sequencer.setTempoFactor((float) (tempoFactor * 1.03));}}public class MyDownTempoListener implements ActionListener {public void actionPerformed(ActionEvent a) {float tempoFactor = sequencer.getTempoFactor();sequencer.setTempoFactor((float) (tempoFactor * 0.97));}}public  class   MyRestoreListener implements ActionListener{public void actionPerformed (ActionEvent a){boolean[] checkboxStats = new boolean[256];for (int i=0;i<256;i++){JCheckBox check=(JCheckBox) checkaboxList.get(i);if(check.isSelected()){checkboxStats[i]=true;}}try{FileOutputStream fileStream = new FileOutputStream(new File("Checkbox.ser"));ObjectOutputStream os= new ObjectOutputStream(fileStream);os.writeObject(checkboxStats);}catch (Exception e){e.printStackTrace();}}}public class MyReadListener implements ActionListener {@Overridepublic void actionPerformed(ActionEvent actionEvent) {boolean[] checkboxStats = null;try {FileInputStream fileIn = new FileInputStream(new File("Checkbox.ser"));ObjectInputStream is = new ObjectInputStream(fileIn);checkboxStats = (boolean[]) is.readObject();} catch (Exception e) {e.printStackTrace();}for (int i=0; i < 256; i++) {JCheckBox check = (JCheckBox) checkaboxList.get(i);if (checkboxStats[i]) {check.setSelected(true);} else {check.setSelected(false);}}sequencer.stop();buildTrackAndStart();//}}public void makeTracks(int[] list) {for (int i = 0; i < 16; i++) {int key = list[i];if (key != 0) {track.add(makeEvent(144, keychan, key, 100, i));track.add(makeEvent(128, keychan, key, 100, i + 1));}}}public MidiEvent makeEvent(int comd, int chan, int one, int two, int tick) {MidiEvent event = null;try {ShortMessage a = new ShortMessage();a.setMessage(comd, chan, one, two);event = new MidiEvent(a, tick);} catch (Exception e) {e.printStackTrace();}return event;}}

Head First 中BeatBox code,(内部类的使用)相关推荐

  1. 静态方法中不能new内部类的实例对象的总结

    class Test{public void main(String[] args){A testA=new A(); //这里会出现问题new Thread(new Runnable(){publi ...

  2. 敏捷开发中的Code Review

    敏捷开发中的Code Review 一些敏捷团队在实施敏捷开发中忙于编码.忙于Unit Test.忙于沟通.忙于Build等,虽然也有编码审核阶段,但大都浮于表面,流于形式,效果不佳.本文结合实践,介 ...

  3. MaxCompute 中的Code Generation技术简介

    摘要: 前言 在<数据库系统中的Code Generation技术介绍>中,我们简单介绍了一下Code Generation技术及其在大规模OLAP系统,特别是大规模分布式OLAP系统中的 ...

  4. VS code中使用code runner遇到两例问题之解决:1.输出乱码,2运行无响应(输出)

    VS code中使用code runner遇到两例问题之解决:1.输出乱码,2运行无响应(输出) 参考文章: (1)VS code中使用code runner遇到两例问题之解决:1.输出乱码,2运行无 ...

  5. c语言中code table,unsigned char code table[]中的code的作用

    unsigned char code table[]中的code的作用是告诉单片机,我定义的无符号的字符串组放在ROM(程序存储区)里面,因为C语言中没办法详细描述存入的是ROM还是RAM(寄存器), ...

  6. 安装并在VSCode中配置Code Fira

    安装并在VSCode中配置Code Fira Code Fira是一个monospace(等距)的字体,应用范围在英文及代码上,我个人比较喜欢的是它对于一些字符的处理,如: 最主要的就是看得开心啦-- ...

  7. Android XML中引用自定义内部类view的四个why

    今天碰到了在XML中应用以内部类形式定义的自定义view,结果遇到了一些坑.虽然通过看了一些前辈写的文章解决了这个问题,但是我看到的几篇都没有完整说清楚why,于是决定做这个总结. 使用自定义内部类v ...

  8. 如何在团队中做好Code Review

    一.Code Review的好处 想要做好Code Review,必须让参与的工程师充分认识到Code Review的好处 1.互相学习,彼此成就 无论是高手云集的架构师团队,还是以CURD为主的业务 ...

  9. Ranorex中利用code module对于测试数据的管理

    我们在做一款自动化测试工具时,保持测试环境的整洁,是很重要的.也就是说,当我们自动创建了测试数据,在完成测试后,要把测试数据删除掉,这样才不会产生很多的垃圾数据,对测试环境造成影响.于是,测试数据的维 ...

最新文章

  1. 查询mysql上传大小限制_解决数据库phpmyadmin中上传最大限制:2,048 KB
  2. Windows2008防火墙封ip
  3. 【算法总结】图论相关
  4. json数组显示格式
  5. 【Canal源码分析】TableMetaTSDB
  6. Little Sub and Enigma
  7. [转] 小结js屏幕、浏览器、页面大小(三)———拖拽
  8. 常用数据库连接和diriver以及默认端口
  9. linux下的静态库与动态库
  10. 关于python import的sys.path路径问题
  11. 手机apk签名工具安卓版_小飞鱼APK签名工具使用方法
  12. 平凡的世界电子书pdf下载_零基础彩铅画入门教程步骤图及全套PDF电子书教程下载!...
  13. c语言五子棋人机对弈算法_从零开始编写C语言五子棋程序1
  14. redis学习-当下NoSQL应用场景简介
  15. chrome鼠标手势插件
  16. Linux操作系统中常见的英文报错
  17. 008 使用MyBatis,easyUI实现CRUD操作样例-CUD(CRUD完毕)
  18. Tomcat 在本地创建虚拟目录myapp
  19. Python中getA() 的意思
  20. 英语单词词性顺口溜_英语词性修饰关系顺口溜

热门文章

  1. 喜欢一个讨厌的人_为什么我们喜欢讨厌漫画无人
  2. 民锋国际期货:2023年USDA农业展望论坛
  3. DBCO高分子PEG_DBCO-PEG-Lipoic COOH_二苯并环辛炔-聚乙二醇-硫辛酸
  4. 深度学习如何解决各类科学问题
  5. 【weex】第一次尝试,weex windows下的环境搭建到第一个完整的app
  6. jquery中解决设置图片不显示
  7. vijos 1250 最勇敢的机器人
  8. 【shell脚本创建编辑文件,读取文件】
  9. 啦啦外卖独立版41.7完美运营版!全功能插件
  10. 企业级BPM之微服务架构演进