📄 abxpanel.java
字号:
package abchr.gui;
import abchr.*;
import abchr.audio.*;
import guiutils.*;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
public class ABXPanel extends JPanel {
private ABXTest abxTest;
private JButton startTestButton;
private static JFileChooser fileChooser=new SimpleFileChooser() {
public int showOpenDialog(Component parent) {
this.resetChoosableFileFilters();
this.setAcceptAllFileFilterUsed(true);
this.setFileFilter(SampleFactory.getFileFilter());
return super.showOpenDialog(parent);
}
};
private static class Formatter extends DetailedABXTestFormatter {
public Formatter(ABXTest test) {
super(test);
final String nl=System.getProperty("line.separator");
this.setFormattingString("Sample A: $A_SAMPLE$"+nl+"Sample B: $B_SAMPLE$"+nl+nl+"$RESULT_LIST$");
this.setTrialFormattingString("$RANGE_COND$ $TIME$ $PASSFAIL_S$ $CORRECT$/$TOTAL$ pval $PVAL_EXT$");
this.setRangeFormatter(new DetailedABXTestFormatter.SimpleRangeFormatter() {
public String format(int rangeBegin,int rangeEnd) {
return "Playback Range: "+formatTime(rangeBegin)+" to "+formatTime(rangeEnd)+nl;
}
});
}
}
private WaitMessageDialog waitMessageDialog;
private class LabelChanger implements Runnable {
String s;
public LabelChanger(String s){this.s=s;}
public void run(){waitMessageDialog.setText(s);}
}
private ABXControlPanel controlPanel=new ABXControlPanel();
private ABXResultsPanel resultsPanel=new ABXResultsPanel(new ABXPanel.Formatter(null));
private JTextField aTextField=new JTextField(20);
private JTextField bTextField=new JTextField(20);
private JCheckBox offsetCheckBox=new JCheckBox("Offset correction",true);
private JCheckBox gainCheckBox=new JCheckBox("Gain correction",true);
private PlaybackRangeSelectBar rangeBar;
private RangeSelectBarPanel rangeBarPanel;
public ABXPanel() {
this.setLayout(new BorderLayout());
JPanel centerPanel=new JPanel(new BorderLayout());
centerPanel.setBorder(BorderFactory.createEmptyBorder(0,5,5,5));
JPanel mainPanel=new JPanel(new BorderLayout());
controlPanel.setBorder(BorderFactory.createEmptyBorder(0,0,0,20));
mainPanel.add(controlPanel,BorderLayout.WEST);
mainPanel.add(resultsPanel,BorderLayout.CENTER);
centerPanel.add(mainPanel,BorderLayout.CENTER);
rangeBarPanel=new RangeSelectBarPanel();
rangeBar=rangeBarPanel.getRangeBar();
rangeBarPanel.setEnabled(false);
centerPanel.add(rangeBarPanel,BorderLayout.SOUTH);
this.add(centerPanel,BorderLayout.CENTER);
JPanel topPanel=new JPanel(new GridBagLayout());
GridBagConstraints constraints=new GridBagConstraints();
constraints.insets=new Insets(0,5,3,10);
constraints.gridy=0;
topPanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
topPanel.add(new JLabel("Sample A:"),constraints);
aTextField.setEditable(true);
DocumentListener listener=new DocumentListener() {
public void insertUpdate(DocumentEvent e){sampleChange();}
public void removeUpdate(DocumentEvent e){sampleChange();}
public void changedUpdate(DocumentEvent e){sampleChange();}
};
aTextField.getDocument().addDocumentListener(listener);
constraints.fill=GridBagConstraints.HORIZONTAL;
constraints.weightx=1.0f;
constraints.insets=new Insets(0,5,3,5);
topPanel.add(aTextField,constraints);
constraints.fill=GridBagConstraints.NONE;
constraints.weightx=0.0f;
topPanel.add(new TextFieldBrowseButton(this,fileChooser,aTextField,false),constraints);
constraints.gridy=1;
constraints.insets=new Insets(0,5,3,10);
topPanel.add(new JLabel("Sample B:"),constraints);
bTextField.setEditable(true);
bTextField.getDocument().addDocumentListener(listener);
constraints.fill=GridBagConstraints.HORIZONTAL;
constraints.weightx=1.0f;
constraints.insets=new Insets(0,5,3,5);
topPanel.add(bTextField,constraints);
constraints.fill=GridBagConstraints.NONE;
constraints.weightx=0.0f;
topPanel.add(new TextFieldBrowseButton(this,fileChooser,bTextField,false),constraints);
constraints.gridy=2;
constraints.gridwidth=3;
constraints.anchor=GridBagConstraints.EAST;
constraints.insets=new Insets(0,5,3,5);
JPanel p=new JPanel(new LineLayout(LineLayout.RIGHT_ALIGN));
startTestButton=new JButton("Start Test");
startTestButton.setEnabled(false);
startTestButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){startTest();}
});
p.add(offsetCheckBox);
p.add(gainCheckBox);
p.add(startTestButton);
topPanel.add(p,constraints);
constraints.gridy=3;
constraints.gridx=0;
constraints.anchor=GridBagConstraints.CENTER;
constraints.fill=GridBagConstraints.HORIZONTAL;
topPanel.add(new JSeparator(SwingConstants.HORIZONTAL),constraints);
this.add(topPanel,BorderLayout.NORTH);
}
private void showErrorMessage(String message) {
JOptionPane.showMessageDialog(this,message,"Error",JOptionPane.ERROR_MESSAGE);
}
private class SampleLoader implements Runnable {
private SampleConfig aFile,bFile;
private Sample aSample=null;
private Sample bSample=null;
private boolean succeeded;
private String errorString;
public SampleLoader(SampleConfig aFile,SampleConfig bFile) {
this.aFile=aFile;
this.bFile=bFile;
}
public void run() {
SampleConfig file=null;
succeeded=false;
errorString="";
try {
SwingUtilities.invokeLater(new ABXPanel.LabelChanger("Decoding sample A"));
aSample=SampleFactory.createSample(file=aFile);
SwingUtilities.invokeLater(new ABXPanel.LabelChanger("Decoding sample B"));
bSample=SampleFactory.createSample(file=bFile);
} catch(IOException e) {
errorString="File "+file.getAbsoluteFile()+" could not be read.";
e.printStackTrace();
waitMessageDialog.setVisible(false);
return;
} catch(UnsupportedAudioFileException e) {
errorString="File "+file.getAbsoluteFile()+" could not be decoded.";
e.printStackTrace();
waitMessageDialog.setVisible(false);
return;
}
succeeded=true;
if(offsetCheckBox.isSelected()) {
try {
SwingUtilities.invokeLater(new ABXPanel.LabelChanger("Correcting offset"));
OffsetCalculator.configureOffset(aSample,bSample);
} catch(IOException e) {
showErrorMessage("Offset could not be calculated.\n"+e.getMessage());
} catch(UnsupportedAudioFileException e) {
showErrorMessage("Offset could not be calculated.\n"+e.getMessage());
}
}
if(gainCheckBox.isSelected()) {
try {
SwingUtilities.invokeLater(new LabelChanger("Correcting gain"));
OffsetCalculator.configureGain(aSample,bSample);
/*int offset=OffsetCalculator.calcOffset(new File(aTextField.getText()),new File(bTextField.getText()));
bSample.setGain(OffsetCalculator.calcVolumeDifference(new File(aTextField.getText()),new File(bTextField.getText())));
System.out.println("Offset="+offset);
if(offset>0){bSample.setOffset(offset);}else{aSample.setOffset(-offset);}*/
} catch(IOException e) {
showErrorMessage("Gain could not be calculated.\n"+e.getMessage());
} catch(UnsupportedAudioFileException e) {
showErrorMessage("Gain could not be calculated.\n"+e.getMessage());
}
}
}
public Sample getASample(){return aSample;}
public Sample getBSample(){return bSample;}
public String getErrorString(){return errorString;}
public boolean succeeded(){return succeeded;}
}
private void startTest() {
Sample aSample=null,bSample=null;
File file=null;
SampleConfig aFile=null;
SampleConfig bFile=null;
try {
aFile=SampleConfig.makeFromString(aTextField.getText());
bFile=SampleConfig.makeFromString(bTextField.getText());
} catch(IllegalArgumentException e) {
showErrorMessage("Syntax Error. Use: filename [|commandline>ext [|commandline2>ext [|...]]]");
abxTest=null;
controlPanel.setTest(null);
resultsPanel.setTest(null);
rangeBarPanel.setEnabled(false);
notifyListeners();
return;
}
if(!(file=aFile.getAbsoluteFile()).exists() || !(file=bFile.getAbsoluteFile()).exists()) {
showErrorMessage("File "+file+" does not exist.");
abxTest=null;
controlPanel.setTest(null);
resultsPanel.setTest(null);
rangeBarPanel.setEnabled(false);
notifyListeners();
return;
}
final SampleLoader loader=new SampleLoader(aFile,bFile);
SwingWorker worker=new SwingWorker() {
public Object construct() {
loader.run();
return null;
}
public void finished() {
waitMessageDialog.setVisible(false);
}
};
waitMessageDialog=new WaitMessageDialog((Frame)SwingUtilities.getWindowAncestor(this),"Please Wait");
worker.start();
waitMessageDialog.show();
if(!loader.succeeded()) {
showErrorMessage(loader.errorString);
abxTest=null;
controlPanel.setTest(null);
resultsPanel.setTest(null);
rangeBarPanel.setEnabled(false);
notifyListeners();
return;
}
aSample=loader.getASample();
bSample=loader.getBSample();
abxTest=new ListenableABXTest(new ABXTestImpl(aSample,bSample));
controlPanel.setTest(abxTest);
resultsPanel.setListenableTest((ListenableABXTest)abxTest);
rangeBar.setSavedRanges(new SavedRangesModel());
int length=(int)(aSample.getLength()*1000);
DefaultBoundedRangeModel model=new DefaultBoundedRangeModel(0,length,0,length);
rangeBar.setModel(model);
PlaybackThread.getInstance().setRangeModel(model);
rangeBar.setPosMarker(PlaybackThread.getInstance().getPosMarker());
rangeBarPanel.setEnabled(true);
notifyListeners();
}
private void sampleChange() {
startTestButton.setEnabled(!(aTextField.getText().equals("") || bTextField.getText().equals("")));
abxTest=null;
controlPanel.setTest(null);
resultsPanel.setTest(null);
rangeBarPanel.setEnabled(false);
notifyListeners();
}
static {
fileChooser.setAcceptAllFileFilterUsed(false);
}
public ABXTest getTest() {
return abxTest;
}
public static interface Listener {
public void changed(ABXPanel sender);
}
private java.util.List<Listener> listeners=new ArrayList<Listener>(1);
private void notifyListeners() {
for(Listener l : listeners){l.changed(this);}
}
public void addListener(ABXPanel.Listener listener) {
listeners.add(listener);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -