package yun;
import java.awt.Color;
 //import java.awt.Dimension;
 //import java.awt.FlowLayout;
 import java.awt.Graphics;
 import java.awt.Toolkit;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 //import java.awt.event.WindowAdapter;
 //import java.awt.event.WindowEvent;
 //import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 //import java.io.IOException;
 //import java.io.InputStream;import javax.sound.sampled.AudioFormat;
 //import javax.sound.sampled.AudioInputStream;
 import javax.sound.sampled.AudioSystem;
 import javax.sound.sampled.DataLine;
 import javax.sound.sampled.LineUnavailableException;
 //import javax.sound.sampled.SourceDataLine;
 import javax.sound.sampled.TargetDataLine;
 import javax.swing.BorderFactory;
 import javax.swing.JButton;
 import javax.swing.JFrame;
 import javax.swing.JPanel;public  class audio extends JFrame {
  //取得屏幕的宽度
  int  width=Toolkit.getDefaultToolkit().getScreenSize().width;
  //取得屏幕的高度
  int height =Toolkit.getDefaultToolkit().getScreenSize().height;
     //设置一个按钮用于监听声音
  public static JButton button1=new JButton("监听声音");
  public static JButton button2=new JButton("停止");
  public static JButton button3=new JButton("退出");
  //public static JButton button4=new JButton("播放");
  //public static JButton button5=new JButton("绘图");
  //定义一个面板来放置按钮
  JPanel pane2=new JPanel();
  //定义一个面板用于绘制波形
  panel jpanel=new panel();
  
  //实例化监听类
  public static MyActionListenerbutton1 bt1=new MyActionListenerbutton1();
  public static MyActionListenerbutton2 bt2=new MyActionListenerbutton2();
  public static MyActionListenerbutton3 bt3=new MyActionListenerbutton3();
  //public static MyActionListenerbutton4 bt4=new MyActionListenerbutton4();
  //public static MyActionListenerbutton5 bt5=new MyActionListenerbutton5();
  //控制录音标志
  public static boolean stopCapture = false;
  //采集数据是否准备好
   public static boolean dataready=true;
  //录音格式
  public static AudioFormat audioFormat; 
  //读取数据:从TargetDataLine写入ByteArrayOutputStream录音
  public static ByteArrayOutputStream byteArrayOutputStream;
  public static int totaldatasize = 0;
     public static TargetDataLine targetDataLine;
     //录音缓冲数组
     public static byte[] tempBuffer=new byte[1024];
     //绘图缓冲区
     public static byte[] draw=new byte[1024];
     //播放数据:从AudioInputStream写入SourceDataLine播放
     //public static AudioInputStream audioInputStream;
     //public static SourceDataLine sourceDataLine;
    /** private byte[] audioDatas = null;
  private int intBytes = 0;
  private byte[] ml = new byte[1];
  private int[] drawl = null;**/
     static int[] drawl = null;
     private int intBytes = 0;
     //static byte [] bs=null;
   
  
  public audio(){
   //设置标题 
   this.setTitle("说话人识别"); 
   //设置窗体的大小 
   this.setSize(600,600); 
   //设置窗体的位置  
   this.setLocation((width-600)/2,(height-600)/2);
   //设置窗体的大小不可调整
   this.setResizable(false); 
   //设置退出方式  
   this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     //绝对布局
   setLayout(null);
   //设置按钮面板位置
    pane2.setBounds(10,10,560,60);
    pane2.setBorder(BorderFactory.createLineBorder(Color.red));
   //加入按钮面板
    this.getContentPane().add(pane2);
    pane2.setLayout(null);
    //设置按钮的位置
     button1.setBounds(10,10,90,40);
    button2.setBounds(110,10,90,40);
    button3.setBounds(210,10,90,40);
   // pane2.add(button4);
    //pane2.add(button5);  
     //将按钮添加的按钮面板上
    pane2.add(button1);
    pane2.add(button2);
    pane2.add(button3);
    //设置绘图面板的位置及大小 
    jpanel.setBounds(10,100,560,200);
   //设置绘图面板的颜色
    jpanel.setBorder(BorderFactory.createLineBorder(Color.red));
   //加入绘制波形的面板
   this.getContentPane().add(jpanel);
   
   
   //注册监听
   button1.addActionListener(bt1);//监听
   button2.addActionListener(bt2);//停止
   button3.addActionListener(bt3);//退出
   //button4.addActionListener(bt4);//回放
   //button5.addActionListener(bt5);//绘图
   //设置状态
   button1.setEnabled(true);//监听
   button2.setEnabled(false);//停止
   button3.setEnabled(true);//退出
   //button4.setEnabled(false);//回放
   //button5.setEnabled(false);
   //绘图
   repaint();
        //设置窗体为可见
   this.setVisible(true);
  }
     
  //定义开始监听类按钮程序 
   public static class MyActionListenerbutton1 implements ActionListener{
    public void actionPerformed(ActionEvent e){
     button1.setEnabled(false);
     button2.setEnabled(true);
     button3.setEnabled(true);
     //button4.setEnabled(false);
     //button5.setEnabled(true);
     capture();//开始录音  
        }
   }
   //定义停止类监听程序
   public static class MyActionListenerbutton2 implements ActionListener{
    public void actionPerformed(ActionEvent e){
     button1.setEnabled(true);
     button2.setEnabled(false);
     button3.setEnabled(true);
     //button4.setEnabled(true);
     //button5.setEnabled(true);
     stop();//停止
    }
   }
   //定义退出类监听程序
   public static class MyActionListenerbutton3 implements ActionListener{
    public void actionPerformed(ActionEvent e){
        button1.setEnabled(false);
     button2.setEnabled(true);
     button3.setEnabled(true);
     //button4.setEnabled(true);
     //button5.setEnabled(true);
     exit();//退出
    }
   }
   //定义回放类监听程序
   /**public static class MyActionListenerbutton4 implements ActionListener{
    public void actionPerformed(ActionEvent e){
     play();//播放录音
    }
       }**/
   
   //录音
   public static void capture() {
    // TODO Auto-generated method stub
      //打开录音
       try {
        //获得录音格式
        audioFormat = getAudioFormat();
        //取得输入设备信息
        DataLine.Info dataLineInfo = new DataLine.Info(TargetDataLine.class, audioFormat);
        //取得输入设备
        targetDataLine = (TargetDataLine) AudioSystem.getLine(dataLineInfo);
        //打开输入设备
        targetDataLine.open(audioFormat);
        //开始录音
        targetDataLine.start();
        //创建独立线程进行录音
        Thread captureThread = new Thread(new CaptureThread());
        captureThread.start();
       } catch (LineUnavailableException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
     System.exit(0);
    }
   }
   //播放类
   /**private static void play() {
    // TODO Auto-generated method stub
     try
      {
       //取得录音数据
       byte audioData[] = byteArrayOutputStream.toByteArray();
       //转换成输入流
       InputStream byteArrayInputStream = new ByteArrayInputStream(audioData);
       AudioFormat audioFormat = getAudioFormat();
       audioInputStream = new AudioInputStream(byteArrayInputStream,audioFormat, audioData.length / audioFormat.getFrameSize());
       DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, audioFormat);
       sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo);
       sourceDataLine.open(audioFormat);
       sourceDataLine.start();
       //创建独立线程进行播放
       Thread playThread = new Thread(new PlayThread());
       playThread.start();
        }
      catch(Exception e)
      {
       e.printStackTrace();
       System.exit(0);
      }
   }**/
   //暂停
   private static void stop() {
    // TODO Auto-generated method stub
    stopCapture = true;
     }
   //退出
   private static  void exit() {
    System.exit(0);
   }
   
   //获取AudioFormat
   private static AudioFormat getAudioFormat()
    {
     float sampleRate = 16000.0F;//8000,11025,16000,22050,44100
     int sampleSizeInBits = 16;//8,16
     int channels = 1;//1,2
     boolean signed = true;//true,false
     boolean bigEndian = false;//true,false
     return new AudioFormat(sampleRate,sampleSizeInBits,channels,signed,bigEndian);
    }
   
   //录音线程
   private static class CaptureThread extends Thread
    {
    //读取录音数据,数据存放在tempbuffer数组中
     byte tempBuffer[]=new byte[1024];
     public void run()
     {
      byteArrayOutputStream = new ByteArrayOutputStream();
      totaldatasize = 0;
      stopCapture = false;
      try
      {
       while(!stopCapture)
       {
        //读取1024个数据
        int cnt = targetDataLine.read(tempBuffer,0,tempBuffer.length);
        dataready=true;
      //将采集到的数据存数绘图数组
     System.arraycopy(tempBuffer, 0, draw, 0, draw.length);
        if(cnt>0)
        {
         //保存该数据
         byteArrayOutputStream.write(tempBuffer, 0, cnt);
         totaldatasize += cnt;  
          /**输出tempBuffer数组中的数据
         for(int j=0;j<=tempBuffer.length;j++){
          System.out.println(tempBuffer[j]);
         }**/
        }
       }
       //将缓冲数组中的数据和大小,传送到数组bs中
            //   byte [] bs= byteArrayOutputStream.toByteArray();
             /**  for(int j=0;j<=bs.length;j++){
                System.out.println(bs[j]);
               }**/
              byteArrayOutputStream.close();
      }
      catch(Exception e)
      {
       e.printStackTrace();
       System.exit(0);
      }
     }
    }
   //绘图线程
      /**static  class drawthread extends Thread{
    public void run(){
     while(true){
      if(dataready){
          //将采集到的数据存数绘图数组
       //System.arraycopy(tempBuffer, 0, draw, 0, draw.length);
       //数据已经取走
       dataready=false;
           
      }
     }
    }
   }**/
   //播放线程
   /**private static class PlayThread extends Thread//播放线程
    {
     byte tempBuffer[] = new byte[1024];
     public void run()
     {
      try
      {
       int cnt;
       //读取数据到缓存数据
       while ((cnt=audioInputStream.read(tempBuffer,0,tempBuffer.length))!=-1)
       {
        if(cnt>0)
        {
         //写入缓存数据
         sourceDataLine.write(tempBuffer, 0, cnt);
        }
       }
       
       //Block等待临时数据被输出为空
       sourceDataLine.drain();
       sourceDataLine.close();
      }
      catch(Exception e)
      {
       e.printStackTrace();
       System.exit(0);
      }
     }
    }**/
   /**public void paint(Graphics g){
    for(int i=0;i<bs.length;i++){
     drawl[i]=Math.abs((int) bs[0]);
    }
    for(int i=0;i<drawl.length;i++){
     g.drawLine(i+100, drawl[i],(i+1)+100,drawl[i+1]);
    }
   }**/
   //jpanel画图的类
  class panel extends JPanel  {   
   public void paintComponent(Graphics g){
      /**while(true){
       if(dataready){
           //将采集到的数据存数绘图数组
        //System.arraycopy(tempBuffer, 0, draw, 0, draw.length);
        //数据已经取走
        dataready=false;
                  }
      }**/
        dataready=false;
     
     for(int i=0;i<draw.length;i++){ 
      drawl[i]=Math.abs((int) draw[0]);
      }
       for(int i=0;i<drawl.length;i++){
        g.drawLine(i+20,drawl[i],(i+1)+20,draw[i+1]);
       }
      /**  for(int i=0;i<bs.length;i++){
       drawl[i]=Math.abs((int) bs[0]);
      }
      for(int i=0;i<drawl.length;i++){
       g.drawLine(i+30, drawl[i],(i+1)+30,drawl[i+1]);
      }**/
   }
    }
   }


 这个程序 您帮我瞅瞅 哪里有问题。我定义了两个jpanel面板,能够正常显示,但是在paint中绘制动态的波形图时不能正常显示两个面板,而且波形还不能显示。这个程序是实现一边录音,一边绘制绘制出波形图。