📄 formatcontrols.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 + -