Mp3 Player by swing
import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Image;
import java.awt.SystemColor;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import javax.imageio.ImageIO;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSlider;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import com.mpatric.mp3agic.ID3v2;
import com.mpatric.mp3agic.InvalidDataException;
import com.mpatric.mp3agic.Mp3File;
import com.mpatric.mp3agic.UnsupportedTagException;
//import org.farng.mp3.MP3File;
//import org.farng.mp3.TagException;
//import org.farng.mp3.id3.AbstractID3v2;
//import org.farng.mp3.id3.ID3v1;
import javazoom.jlgui.basicplayer.BasicController;
import javazoom.jlgui.basicplayer.BasicPlayer;
import javazoom.jlgui.basicplayer.BasicPlayerEvent;
import javazoom.jlgui.basicplayer.BasicPlayerException;
import javazoom.jlgui.basicplayer.BasicPlayerListener;
public class FrmAudio extends JFrame implements DropTargetListener {
private JLabel label = new JLabel(“Mp3再生”);
private JPanel contentPane;
private JTextField textField = new JTextField();
private BasicPlayer player= new BasicPlayer();
private JTextField textField_1 = new JTextField(“G:\\Music”);
private String[] columnNames = {“曲名”};
private DefaultTableModel tableModel = new DefaultTableModel(columnNames, 0);
private JTable table = new JTable(tableModel){
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component component = super.prepareRenderer(renderer, row, column);
int rendererWidth = component.getPreferredSize().width;
TableColumn tableColumn = getColumnModel().getColumn(column);
tableColumn.setPreferredWidth(Math.max(rendererWidth + getIntercellSpacing().width, tableColumn.getPreferredWidth()));
return component;
}
};
// ボリュームスライダ
private JSlider volslider = new JSlider();
// ボリュームスライダ用のリスナー
ChangeListener volsliderCl;
// 演奏位置スライダー
private JSlider posslider = new JSlider();
// 演奏位置スライダ用のリスナー
ChangeListener possliderCl;
// 時間表示
private JLabel lbl_time = new JLabel(“”);
//画像表示
JLabel lbl = new JLabel(“AlbumImage”);
private Map audioInfo = null;
private int rownow=0;
private int rowcnt=0;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
FrmAudio frame = new FrmAudio();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public FrmAudio() {
setTitle(“FrmAudio”);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 841, 664);
contentPane = new JPanel();
contentPane.setBackground(new Color(230, 230, 250));
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
//枠
LineBorder border = new LineBorder(Color.BLUE, 1, true);
LineBorder border2 = new LineBorder(Color.MAGENTA, 1, true);
//「DropTargetListener」は「DropTarget」に設定します。
// new DropTarget(コンポーネント,
// リスナー);を実行すると、DropTargetの内部でaddDropTargetListenerされます。
new DropTarget(this, this);
JButton btn_sel = new JButton(“ファイル選択”);
btn_sel.setFont(new Font(“MS UI Gothic”, Font.PLAIN, 11));
btn_sel.setBounds(150, 108, 88, 36);
btn_sel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JFileChooser filechooser = new JFileChooser();
filechooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
//System.out.println(textField_1.getText());
File dir = new File(textField_1.getText());
filechooser.setCurrentDirectory(dir);
FileNameExtensionFilter filter = new FileNameExtensionFilter(“audioファイル(*.wav)”,”wav”, “mp3”);
filechooser.addChoosableFileFilter(filter);
int selected = filechooser.showOpenDialog(btn_sel);
if (selected == JFileChooser.APPROVE_OPTION){
File file =filechooser.getSelectedFile();
textField.setText(file.getAbsolutePath());
readTag(file);
}else if (selected == JFileChooser.CANCEL_OPTION){
textField.setText(“キャンセルされました”);
}else if (selected == JFileChooser.ERROR_OPTION){
textField.setText(“エラー又は取消しがありました”);
}
}
});
btn_sel.setBorder(border2);
contentPane.add(btn_sel);
textField.setHorizontalAlignment(SwingConstants.LEFT);
textField.setFont(new Font(“MS UI Gothic”, Font.PLAIN, 10));
textField.setBounds(250, 108, 563, 36);
textField.setBorder(border);
contentPane.add(textField);
textField.setColumns(10);
JButton btn_end = new JButton(“終 了”);
btn_end.setFont(new Font(“MS UI Gothic”, Font.PLAIN, 11));
btn_end.setBounds(705, 12, 108, 27);
btn_end.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//dispose();
System.exit(0);
}
});
btn_end.setBorder(border2);
contentPane.add(btn_end);
JButton btn_play = new JButton(“再 生”);
btn_play.setFont(new Font(“MS UI Gothic”, Font.PLAIN, 11));
btn_play.setBounds(150, 154, 88, 27);
btn_play.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//String pathToMp3 = textField.getText();
//BasicPlayer player = new BasicPlayer();
try {
//player.open(new URL(“file:///” + pathToMp3));
File file = new File(textField.getText());
player.open(file);
player.play();
} catch (BasicPlayerException e2) {
e2.printStackTrace();
}
}
});
btn_play.setBorder(border2);
contentPane.add(btn_play);
JButton btn_stop = new JButton(“停 止”);
btn_stop.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//String pathToMp3 = textField.getText();
//BasicPlayer player = new BasicPlayer();
try {
//player.open(new URL(“file:///” + pathToMp3));
player.stop();
} catch (BasicPlayerException e2) {
e2.printStackTrace();
}
}
});
btn_stop.setFont(new Font(“MS UI Gothic”, Font.PLAIN, 11));
btn_stop.setBounds(250, 154, 80, 27);
btn_stop.setBorder(border2);
contentPane.add(btn_stop);
JButton btn_pause = new JButton(“一時停止”);
btn_pause.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//String pathToMp3 = textField.getText();
//BasicPlayer player = new BasicPlayer();
try {
//player.open(new URL(“file:///” + pathToMp3));
player.pause();
} catch (BasicPlayerException e2) {
e2.printStackTrace();
}
}
});
btn_pause.setFont(new Font(“MS UI Gothic”, Font.PLAIN, 11));
btn_pause.setBounds(342, 154, 80, 27);
btn_pause.setBorder(border2);
contentPane.add(btn_pause);
JButton btn_resume = new JButton(“再 開”);
btn_resume.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
//player.open(new URL(“file:///” + pathToMp3));
player.resume();
} catch (BasicPlayerException e2) {
e2.printStackTrace();
}
}
});
btn_resume.setFont(new Font(“MS UI Gothic”, Font.PLAIN, 11));
btn_resume.setBounds(434, 154, 80, 27);
btn_resume.setBorder(border2);
contentPane.add(btn_resume);
JButton btn_dir = new JButton(“デフォルトDir”);
btn_dir.setFont(new Font(“MS UI Gothic”, Font.PLAIN, 11));
btn_dir.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
File dir = new File(textField_1.getText());
JFileChooser filechooser = new JFileChooser();
filechooser.setCurrentDirectory(dir);
filechooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int selected = filechooser.showOpenDialog(btn_dir);
if (selected == JFileChooser.APPROVE_OPTION){
dir =filechooser.getSelectedFile();
textField_1.setText(dir.getPath());
}else if (selected == JFileChooser.CANCEL_OPTION){
textField_1.setText(“キャンセルされました”);
}else if (selected == JFileChooser.ERROR_OPTION){
textField_1.setText(“エラー又は取消しがありました”);
}
}
});
btn_dir.setBounds(150, 45, 88, 27);
btn_dir.setBorder(border2);
contentPane.add(btn_dir);
textField_1.setHorizontalAlignment(SwingConstants.LEFT);
textField_1.setBorder(border);
textField_1.setBackground(SystemColor.text);
textField_1.setBounds(250, 47, 563, 23);
contentPane.add(textField_1);
textField_1.setColumns(10);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBackground(new Color(230, 230, 250));
scrollPane.setBounds(12, 189, 801, 428);
scrollPane.setBorder(border);
contentPane.add(scrollPane);
table.setBackground(new Color(250, 240, 230));
table.setColumnSelectionAllowed(true);
table.setCellSelectionEnabled(true);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);//セルの自動サイズ設定をoffにしています。
table.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
//編集不可
table.setDefaultEditor(Object.class, null);
//テーブルにマウスイベントを付ける
table.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(MouseEvent e) {
// 選択行の行番号を取得します
int row = table.getSelectedRow();
rownow=row;
//int col = table.getSelectedColumn();
//System.out.println(“行” + row + “::” + “列” + col);
//System.out.println(tableModel.getValueAt(row, 0).toString());
textField.setText(tableModel.getValueAt(row, 0).toString());
try {
//player.open(new URL(“file:///” + pathToMp3));
File file = new File(textField.getText());
player.open(file);
readTag(file);
player.play();
} catch (BasicPlayerException e2) {
e2.printStackTrace();
}
}
});
scrollPane.setViewportView(table);
//中央
DefaultTableCellRenderer Center = new DefaultTableCellRenderer();
Center.setHorizontalAlignment(SwingConstants.CENTER);
//table.getColumnModel().getColumn(0).setCellRenderer(Center);
//右寄せ
DefaultTableCellRenderer Right = new DefaultTableCellRenderer();
//Right.setHorizontalAlignment(SwingConstants.RIGHT);
JButton btnNewButton = new JButton(“曲名取得”);
btnNewButton.setFont(new Font(“MS UI Gothic”, Font.PLAIN, 11));
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//フィルタを作成する
FilenameFilter filter = new FilenameFilter(){
public boolean accept(File file, String str){
//指定文字列でフィルタする
if(str.indexOf(“.wav”) != -1) {
return true;
}else if(str.indexOf(“.mp3”) != -1) {
return true;
} else {
return false;
}
}
};
//テーブル行削除
//int rowcount= tableModel.getRowCount();
//for(int i = 0 ; i < rowcount ; i++){
// tableModel.removeRow(rowcount – i – 1);
//}
//listFilesメソッドを使用して一覧を取得する
File[] list = new File(textField_1.getText()).listFiles(filter);
Object[]row = new Object[1];
//rowcnt=0;
if(list != null) {
for(int i=0; i<list.length; i++) {
//ファイルの場合
if(list[i].isFile()) {
//System.out.println(“ファイルです : ” + list[i].toString());
row[0]=list[i].toString();
tableModel.addRow(row);
//rowcnt = rowcnt + 1;
}
//ディレクトリの場合
else if(list[i].isDirectory()) {
//System.out.println(“ディレクトリです : ” + list[i].toString());
}
}
rowcnt= tableModel.getRowCount();
} else {
System.out.println(“null”);
}
rowcnt= tableModel.getRowCount();
}
});
btnNewButton.setBounds(150, 72, 88, 36);
btnNewButton.setBorder(border2);
contentPane.add(btnNewButton);
//ボリュウーム用スライダー
volslider.setBackground(new Color(250, 250, 210));
volslider.setBounds(657, 80, 156, 23);
volslider.setBorder(border);
volsliderCl = getVolChangeListener();
volslider.addChangeListener(volsliderCl);
contentPane.add(volslider);
label.setFont(new Font(“MS UI Gothic”, Font.PLAIN, 11));
label.setHorizontalAlignment(SwingConstants.CENTER);
label.setOpaque(true);
label.setBackground(new Color(64, 224, 208));
label.setBounds(10, 10, 677, 29);
label.setBorder(border);
contentPane.add(label);
JLabel label_1 = new JLabel(“音量”);
label_1.setHorizontalAlignment(SwingConstants.CENTER);
label_1.setBounds(613, 79, 41, 23);
label_1.setBorder(border);
contentPane.add(label_1);
//再生用スライダー
posslider.setBackground(new Color(250, 250, 210));
posslider.setBorder(border);
posslider.setBounds(314, 80, 183, 23);
possliderCl = getPosChangeListener();
posslider.addChangeListener(possliderCl);
contentPane.add(posslider);
JLabel label_2 = new JLabel(“再生位置”);
label_2.setHorizontalAlignment(SwingConstants.CENTER);
label_2.setBounds(250, 79, 62, 23);
label_2.setBorder(border);
contentPane.add(label_2);
lbl_time.setHorizontalAlignment(SwingConstants.CENTER);
lbl_time.setBackground(new Color(230, 230, 250));
lbl_time.setBounds(500, 80, 98, 22);
lbl_time.setBorder(border);
contentPane.add(lbl_time);
JButton button = new JButton(“曲名消去”);
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int rowcount= tableModel.getRowCount();
for(int i = 0 ; i < rowcount ; i++){
tableModel.removeRow(rowcount – i – 1);
}
rowcnt= tableModel.getRowCount();
}
});
button.setFont(new Font(“MS UI Gothic”, Font.PLAIN, 11));
button.setBounds(732, 154, 80, 27);
button.setBorder(border2);
contentPane.add(button);
lbl.setHorizontalAlignment(SwingConstants.CENTER);
//画像表示
lbl.setBackground(SystemColor.control);
lbl.setBounds(10, 45, 134, 136);
//LineBorder border = new LineBorder(Color.BLUE, 1, true);
lbl.setBorder(border);
contentPane.add(lbl);
// BasicPlayerのインスタンス作成
addBasicPlayerListener();
}
// スライダの変更通知を受け取るリスナーです
private ChangeListener getPosChangeListener() {
return new ChangeListener() {
// スライダを操作すると通知が来ます
@Override
public void stateChanged(ChangeEvent e) {
// マウスで操作中は何もません
if (!posslider.getValueIsAdjusting()) {
// マウスで操作中でなければスライダの位置に合わせてシークします
try {
if (player.getStatus() == BasicPlayer.STOPPED) {
// 停止中の場合、再生開始してからシークします
play();
}
// シーク位置計算
long l = getAudioBytes() * posslider.getValue() / 100;
player.seek(l);
} catch (BasicPlayerException e1) {
e1.printStackTrace();
}
}
}
};
}
// スライダの変更通知を受け取るリスナーです
private ChangeListener getVolChangeListener() {
return new ChangeListener() {
// スライダを操作すると通知が来ます
@Override
public void stateChanged(ChangeEvent e) {
// マウスで操作中は何もません
if (!volslider.getValueIsAdjusting()) {
// マウスで操作中でなければスライダの位置に合わせてシークします
setGain();
}
}
};
}
// スライダに合わせてボリュームを設定します
private void setGain() {
try {
player.setGain((double) volslider.getValue() / volslider.getMaximum());
} catch (BasicPlayerException e1) {
e1.printStackTrace();
}
}
private void next() {
rownow = rownow + 1;
table.setRowSelectionInterval(rownow, rownow);
textField.setText(tableModel.getValueAt(rownow, 0).toString());
System.out.println(tableModel.getValueAt(rownow, 0).toString());
File file = new File(textField.getText());
try {
player.open(file);
readTag(file);
} catch (BasicPlayerException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
try {
player.play();
} catch (BasicPlayerException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
private void prev() {
rownow = rownow – 1;
textField.setText(tableModel.getValueAt(rownow, 0).toString());
System.out.println(tableModel.getValueAt(rownow, 0).toString());
File file = new File(textField.getText());
try {
player.open(file);
readTag(file);
} catch (BasicPlayerException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
try {
player.play();
} catch (BasicPlayerException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
// 一時停止
private void pause() throws BasicPlayerException {
// playMode = PLAY_MODE_PAUSE;
player.pause();
}
// 一時停止解除
private void resume() throws BasicPlayerException {
player.resume();
}
// 再生
private void play() throws BasicPlayerException {
player.play();
}
// 停止
private void stop() throws BasicPlayerException {
if (player.getStatus() != BasicPlayer.STOPPED) {
player.stop();
}
}
// BasicPlayerリスナーを追加します
BasicPlayerListener bpl;
private void addBasicPlayerListener() {
bpl = new BasicPlayerListener() {
// プレイヤーのステータス変更通知
@Override
public void stateUpdated(BasicPlayerEvent event) {
if (event.getCode() == BasicPlayerEvent.EOM) {
try {
stopAction();
} catch (BasicPlayerException e) {
e.printStackTrace();
}
}
// プレイヤーのステータスが停止になった場合
if (player.getStatus() == BasicPlayer.STOPPED) {
}
}
@Override
public void setController(BasicController controller) {
}
// 再生中の進捗通知
@Override
public void progress(int bytesread, long microseconds, byte[] pcmdata, Map properties) {
long total = Long.parseLong(audioInfo.get(“audio.length.bytes”).toString());
// 再生が進んだらスライダを操作します。
if (getAudioBytes() > 0) {
// 新しいスライダの位置を計算します
int newValue = (int) (bytesread * 100 / getAudioBytes());
// スライダをマウスで摘んでる間は操作しません
// スライダの値と、現在の値が同じ場合も操作しません
if (!posslider.getValueIsAdjusting() && posslider.getValue() != newValue) {
// setValueでの操作でも、ChangeListenerに通知が行くのでリスナー取り出し、操作、リスナー追加の順に処理します
posslider.removeChangeListener(possliderCl);
posslider.setValue(newValue);
posslider.addChangeListener(possliderCl);
// トータル秒数計算
try {
long bitrate = Long.parseLong(audioInfo.get(“bitrate”).toString());
int seconds = (int) (total / (bitrate / 8));
// 現在の秒数
int nowSecond = (int) (bytesread * seconds / total);
// 分と秒を計算
int tm = seconds / 60;
int ts = seconds % 60;
int m = nowSecond / 60;
int s = nowSecond % 60;
lbl_time.setText( String.format(“%1$02d:%2$02d / %3$02d:%4$02d”, m, s, tm, ts) );
}catch (Exception e ) {
File file = new File(textField.getText());
AudioInputStream stream;
try {
stream = AudioSystem.getAudioInputStream(file);
long length = stream.getFrameLength(); // 総フレーム数の取得。
AudioFormat format = stream.getFormat();
float flame = format.getSampleRate(); //一秒当たりのフレーム数の取得。普通の音楽ファイルだと44100のはず。
int playtime = (int) (length / flame); //割ってるだけ。
// 現在の秒数
int nowSecond = (int) (bytesread * playtime / total);
// 分と秒を計算
int tm = playtime / 60;
int ts = playtime % 60;
int m = nowSecond / 60;
int s = nowSecond % 60;
lbl_time.setText( String.format(“%1$02d:%2$02d / %3$02d:%4$02d”, m, s, tm, ts) );
} catch (UnsupportedAudioFileException | IOException e1) {
// TODO 自動生成された catch ブロック
//e1.printStackTrace();
System.out.println(“Not AudioInputStream”);
lbl_time.setText(” ? / ? “);
}
}
}
}
}
// ファイルオープン通知
@Override
public void opened(Object stream, Map properties) {
// プロパティをクラス変数に保存します
audioInfo = properties;
}
};
player.addBasicPlayerListener(bpl);
}
// プロパティから音楽ファイルの長さを返します
private long getAudioBytes() {
try {
return Long.parseLong(audioInfo.get(“audio.length.bytes”).toString());
} catch (Exception e) {
return 0;
}
}
// 曲の最後まできた時のアクション
private void stopAction() throws BasicPlayerException {
if (rownow + 1 >= rowcnt) {
// ループじゃない&最後まで来てたら停止
stop();
} else {
// 最後じゃなければ次のファイルへ
next();
}
}
// ポイント1.ドロップイベントを受け取るには「DropTargetListener.drop」を実装します。
@Override
public void drop(DropTargetDropEvent dtde) {
// ポイント3.ドロップすると1.で実装した「drop」が実行されます。
// 「DropTargetDropEvent.acceptDrop」でドロップを受け取る準備をします。
dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
boolean flg = false;
String str = “”;
try {
// 「DropTargetDropEvent.getTransferable」で転送クラスを取得します。
Transferable tr = dtde.getTransferable();
// 「DropTargetDropEvent.isDataFlavorSupported」で、受け取り可能なフレーバーを調べます。
// 標準では文字列用の「stringFlavor」、ファイル用の「javaFileListFlavor」、画像イメージ用の「imageFlavor」があります。
if (dtde.isDataFlavorSupported(DataFlavor.stringFlavor)) {
// 文字列をドロップされた場合
// ドロップされた文字列をラベルに表示します。
str += “文字列をドロップされました。\n”;
// 「Transferable.getTransferData」でドロップされたオブジェクトを受け取ります。
str += tr.getTransferData(DataFlavor.stringFlavor).toString();
flg = true;
} else if (dtde
.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
// ファイルをドロップされた場合
// ドロップされたファイルを文字列に入れてラベルに表示します。
//str += “ファイルをドロップされました。\n”;
// 「Transferable.getTransferData」でドロップされたオブジェクトを受け取ります。
// ファイルは「List<File>」にキャストして操作するとよいです。
List<File> list = (List<File>) tr
.getTransferData(DataFlavor.javaFileListFlavor);
for (File file : list) {
str += file.getPath() + “@”;
}
flg = true;
}
str += “”;
} catch (UnsupportedFlavorException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 「DropTargetDropEvent.dropComplete」で転送完了を通知して終了です。
dtde.dropComplete(flg);
if (flg) {
// ドロップされたオブジェクトをJLabelに設定します。
Object[]row = new Object[1];
//rowcnt=0;
String[] filename = str.split(“@”, 0);
for(int i=0; i<filename.length; i++) {
row[0]=filename[i].toString();
tableModel.addRow(row);
//rowcnt = rowcnt + 1;
}
rowcnt= tableModel.getRowCount();
} else {
// ドロップを受け取れなかった場合はこちらで。
textField.setText(“ドロップを受け取りできませんでした。”);
}
}
}
@Override
public void dragEnter(DropTargetDragEvent dtde) {
// TODO 自動生成されたメソッド・スタブ
}
@Override
public void dragOver(DropTargetDragEvent dtde) {
// TODO 自動生成されたメソッド・スタブ
}
@Override
public void dropActionChanged(DropTargetDragEvent dtde) {
// TODO 自動生成されたメソッド・スタブ
}
@Override
public void dragExit(DropTargetEvent dte) {
// TODO 自動生成されたメソッド・スタブ
}
//@Override
//public void drop(DropTargetDropEvent dtde) {
// TODO 自動生成されたメソッド・スタブ
//}
// mp3ファイルからID3タグを読んで表示します
private void readTag(File file) {
//com.mpatric.mp3agic
Mp3File song = null;
try {
song = new Mp3File(file);
} catch (UnsupportedTagException | InvalidDataException | IOException e) {
// TODO 自動生成された catch ブロック
//e.printStackTrace();
System.out.println(” Not Mp3 File”);
return;
}
if (song.hasId3v2Tag()){
ID3v2 id3v2tag = song.getId3v2Tag();
byte[] imageData = id3v2tag.getAlbumImage();
String title = “”;
String artist = “”;
String albumTitle = “”;
title = id3v2tag.getTitle();
artist = id3v2tag.getArtist();
albumTitle = id3v2tag.getAlbum();
label.setText(“[ ” + albumTitle + ” ] [ “+ title + ” ] [ ” + artist + ” ]”);
//converting the bytes to an image
if (imageData != null) {
//System.out.println(“Have album image data, length: ” + imageData.length + ” bytes”);
//System.out.println(“Album image mime type: ” + id3v2tag.getAlbumImageMimeType());
try {
BufferedImage img = ImageIO.read(new ByteArrayInputStream(imageData));
// 幅、高さの取得
//System.out.println(“Width:” + img.getWidth());
//System.out.println(“Height:” + img.getHeight());
Image dimg = img.getScaledInstance(lbl.getWidth(), lbl.getHeight(),
Image.SCALE_SMOOTH);
ImageIcon icon = new ImageIcon(dimg);
lbl.setIcon(icon);
} catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
}
}
}