⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 formatcontrols.java

📁 java语言编写的语音聊天室程序
💻 JAVA
字号:
package tcpSoundCommunication;

import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
import java.util.Vector;
import java.util.Enumeration;
import javax.sound.sampled.*;


/**
 * 对音乐格式的控制!Controls for the AudioFormat.
 */
class FormatControls
    extends JPanel {
//左窗口的JPanel
  Vector groups = new Vector(); //用于保存 BottonGroup!
  JToggleButton linrB, ulawB, alawB, rate8B, rate11B, rate16B, rate22B,
      rate44B;
  JToggleButton size8B, size16B, signB, unsignB, litB, bigB, monoB, sterB;

  public FormatControls() {
    //下面是JPanel的布局方法;从p1->p2...->p6都遵守的自动布局格式(0,1)表示只用1列;
    setLayout(new GridLayout(0, 1)); //参考GridLayout(int rows, int cols, int hgap, int vgap)
    EmptyBorder eb = new EmptyBorder(0, 0, 0, 5);
    BevelBorder bb = new BevelBorder(BevelBorder.LOWERED); //RAISED
    CompoundBorder cb = new CompoundBorder(eb, bb); //(eb, bb);
    setBorder(new CompoundBorder(cb, new EmptyBorder(8, 5, 5, 5))); //使用了decorator模式

//ButtonGroup是一个botton的单选组合对象encodingGroup
    JPanel p1 = new JPanel();
    ButtonGroup encodingGroup = new ButtonGroup();
    linrB = addToggleButton(p1, encodingGroup, "linear", true);
    ulawB = addToggleButton(p1, encodingGroup, "ulaw", false);
    alawB = addToggleButton(p1, encodingGroup, "alaw", false);
    add(p1);
    groups.addElement(encodingGroup); //注意:encodingGroup是一个ButtonGroup

//ButtonGroup是一个botton的单选组合对象sampleRateGroup
    JPanel p2 = new JPanel();
    JPanel p2b = new JPanel();
    ButtonGroup sampleRateGroup = new ButtonGroup();
    rate8B = addToggleButton(p2, sampleRateGroup, "8000", false);
    rate11B = addToggleButton(p2, sampleRateGroup, "11025", false);
    rate16B = addToggleButton(p2b, sampleRateGroup, "16000", false);
    rate22B = addToggleButton(p2b, sampleRateGroup, "22050", false);
    rate44B = addToggleButton(p2b, sampleRateGroup, "44100", true);
    add(p2);
    add(p2b);
    //注意:sampleRateGroup是一个ButtonGroup
    groups.addElement(sampleRateGroup);
//ButtonGroup是一个botton的单选组合对象sampleSizeInBitsGroup
    JPanel p3 = new JPanel();
    ButtonGroup sampleSizeInBitsGroup = new ButtonGroup();
    size8B = addToggleButton(p3, sampleSizeInBitsGroup, "8", false);
    size16B = addToggleButton(p3, sampleSizeInBitsGroup, "16", true);
    add(p3);
    groups.addElement(sampleSizeInBitsGroup);
//ButtonGroup是一个botton的单选组合对象signGroup
    JPanel p4 = new JPanel();
    ButtonGroup signGroup = new ButtonGroup();
    signB = addToggleButton(p4, signGroup, "signed", true);
    unsignB = addToggleButton(p4, signGroup, "unsigned", false);
    add(p4);
    groups.addElement(signGroup);
//ButtonGroup是一个botton的单选组合对象endianGroup
    JPanel p5 = new JPanel();
    ButtonGroup endianGroup = new ButtonGroup();
    litB = addToggleButton(p5, endianGroup, "little endian", false);
    bigB = addToggleButton(p5, endianGroup, "big endian", true);
    add(p5);
    groups.addElement(endianGroup);
//ButtonGroup是一个botton的单选组合对象channelsGroup
    JPanel p6 = new JPanel();
    ButtonGroup channelsGroup = new ButtonGroup();
    monoB = addToggleButton(p6, channelsGroup, "mono", false);
    sterB = addToggleButton(p6, channelsGroup, "stereo", true);
    add(p6);
//groups中的每一个组有一个元素为Format值
    groups.addElement(channelsGroup);
  }

//实现单选按钮组BottonGroup;state表明是否被选中!
  private JToggleButton addToggleButton(JPanel p, ButtonGroup g,
                                        String name, boolean state) {
    JToggleButton b = new JToggleButton(name, state);
    p.add(b);
    g.add(b);
    return b;
  }

  public AudioFormat getFormat() {
    //v 将用来保存取得的值——linear\44100\16\signed\big endian\stereo;
    Vector v = new Vector(groups.size());
    for (int i = 0; i < groups.size(); i++) {
      ButtonGroup g = (ButtonGroup) groups.get(i);
      for (Enumeration e = g.getElements(); e.hasMoreElements(); ) {
        /**AbstractButton->JButton,JMenuItem,JToggleButton ;
         * JButton->BasicArrowButton, MetalComboBoxButton
         * JToggleButton->JCheckBox,JRadioButton
         * JMenuItem->JCheckBoxMenuItem, JMenu, JRadioButtonMenuItem
         * JToggleButton is An implementation of a two-state button!!
         */
        AbstractButton b = (AbstractButton) e.nextElement();
        if (b.isSelected()) {
          v.add(b.getText());
          break;
        }
      }
    }
//将取得的v[]数值,转换成一个有效的format!
    AudioFormat.Encoding encoding = AudioFormat.Encoding.ULAW;
    String encString = (String) v.get(0);
    float rate = Float.valueOf( (String) v.get(1)).floatValue();
    int sampleSize = Integer.valueOf( (String) v.get(2)).intValue();
    String signedString = (String) v.get(3);
    boolean bigEndian = ( (String) v.get(4)).startsWith("big");
    int channels = ( (String) v.get(5)).equals("mono") ? 1 : 2;

    if (encString.equals("linear")) {
      if (signedString.equals("signed")) {
        encoding = AudioFormat.Encoding.PCM_SIGNED;
      }
      else {
        encoding = AudioFormat.Encoding.PCM_UNSIGNED;
      }
    }
    else if (encString.equals("alaw")) {
      encoding = AudioFormat.Encoding.ALAW;
    }
    return new AudioFormat(encoding, rate, sampleSize,
                           channels, (sampleSize / 8) * channels, rate,
                           bigEndian);
  }

  public void setFormat(AudioFormat format) {
    AudioFormat.Encoding type = format.getEncoding();
    if (type == AudioFormat.Encoding.ULAW) {
      ulawB.doClick();
    }
    else if (type == AudioFormat.Encoding.ALAW) {
      alawB.doClick();
    }
    else if (type == AudioFormat.Encoding.PCM_SIGNED) {
      linrB.doClick();
      signB.doClick();
    }
    else if (type == AudioFormat.Encoding.PCM_UNSIGNED) {
      linrB.doClick();
      unsignB.doClick();
    }
    float rate = format.getFrameRate();
    if (rate == 8000) {
      rate8B.doClick();
    }
    else if (rate == 11025) {
      rate11B.doClick();
    }
    else if (rate == 16000) {
      rate16B.doClick();
    }
    else if (rate == 22050) {
      rate22B.doClick();
    }
    else if (rate == 44100) {
      rate44B.doClick();
    }
    switch (format.getSampleSizeInBits()) {
      case 8:
        size8B.doClick();
        break;
      case 16:
        size16B.doClick();
        break;
    }
    if (format.isBigEndian()) {
      bigB.doClick();
    }
    else {
      litB.doClick();
    }
    if (format.getChannels() == 1) {
      monoB.doClick();
    }
    else {
      sterB.doClick();
    }
  }
} // End class FormatControls

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -