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

📄 abxpanel.java

📁 Java version of ABC/HR comparator v0.5. by schnofler. Runs on Sun JRE 1.5 or later
💻 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 + -