연주할 곡을 체크박스로 만들고 사용자가 체크한 곡만 순서대로 연주하는 프로그램이다. 만들 때 꽤나 고생했던 걸로 기억하는데 아마 사용자 선택의 기록과 음악 파일 재생을 따로 진행하면서 유기적으로 연결하는 부분이 문제였다. 나는 벡터에 선택 순서대로 경로와 파일명을 저장한 후 맨 위의것부터 재생하는 방법을 사용했다. 체크 해제시 검색하여 삭제해야 되기 때문에 삭제기능이 없다면 큐를 사용하긴 힘들다.
○ 연주시작 버튼을 누르면 연주가 시작되고 다음 곡에 대해서는 체크박스를 선택/해제할 수 있다.
○ 연주끝 버튼을 누르면 연주가 멈추고, 연주시작 버튼을 누르면 처음부터 시작한다.
○ 연주되고 있는 곡은 다른 글자색으로 나타낸다.
코드
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.sound.sampled.*;
import java.io.*;
import java.util.*;
public class eight extends JFrame{
private JCheckBox[] box=new JCheckBox[3];
private Clip clip;
private Vector <String> v=new Vector<String>();
public eight() {
setTitle("오디오 연주");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c=getContentPane();
c.setLayout(new BorderLayout());
JPanel jp=new JPanel();
jp.setBackground(Color.LIGHT_GRAY);
JLabel jl=new JLabel("체크된 곡만 순서대로 연주합니다.");
jl.setFont(new Font("Serif",Font.BOLD,13));
jp.add(jl);
MusicPanel panel=new MusicPanel();
c.add(jp,BorderLayout.NORTH);
c.add(panel,BorderLayout.CENTER);
setLocation(880,420);
setSize(400,250);
setVisible(true);
}
class MusicPanel extends JPanel{
public MusicPanel() {
setLayout(null);
for(int i=0;i<3;i++) {
box[i]=new JCheckBox("0"+(i+1)+".wav");
box[i].setSize(100,20);
box[i].setLocation(150,30+30*i);
box[i].addItemListener(new MyItemListener());
add(box[i]);
}
JButton start=new JButton("연주시작");
start.setSize(90,30);
start.setLocation(95,140);
start.addActionListener(new MyActionListener());
add(start);
JButton end=new JButton("연주 끝");
end.setSize(90,30);
end.setLocation(205,140);
end.addActionListener(new MyActionListener());
add(end);
}
}
private void loadAudio(String pathName) {
try{
clip=AudioSystem.getClip();
File audioFile=new File(pathName);
AudioInputStream audioStream=AudioSystem.getAudioInputStream(audioFile);
clip.open(audioStream);
clip.start();
clip.addLineListener(new LineListener() {
@Override
public void update(LineEvent event) {
if(event.getType()==LineEvent.Type.START) {
for(int i=0;i<3;i++) {
if(pathName.contains(box[i].getText()))
box[i].setForeground(Color.red);
}
}
if(event.getType()==LineEvent.Type.STOP) {
for(int i=0;i<3;i++) {
if(pathName.contains(box[i].getText()))
box[i].setForeground(Color.black);
}
if(v.size()>=1) {loadAudio(v.get(0));}
else {clip.stop();}
}
}});}
catch(IOException e) {e.printStackTrace();}
catch(LineUnavailableException e) {e.printStackTrace();}
catch(UnsupportedAudioFileException e) {e.printStackTrace();}
}
class MyItemListener implements ItemListener{ //벡터에 경로 추가
public void itemStateChanged(ItemEvent e) {
JCheckBox tmpbox=(JCheckBox) e.getSource();
if(e.getStateChange()==ItemEvent.DESELECTED) {v.remove("audio/"+tmpbox.getText());}
else
v.add("audio/"+tmpbox.getText());
}
}
class MyActionListener implements ActionListener{
public void actionPerformed(ActionEvent e) {
JButton tmpbtn=(JButton)e.getSource();
if(tmpbtn.getText().equals("연주시작")) {
loadAudio(v.get(0));
v.remove(0);
}
else if(tmpbtn.getText().equals("연주 끝")) {v.removeAllElements();clip.stop();}
}
}
public static void main(String[]args) {
new eight();
}
}
'JAVA > 개발' 카테고리의 다른 글
[JAVA] 영어 사전 서버 - 클라이언트 (0) | 2023.02.22 |
---|---|
[JAVA] 점수 조회 서버 - 클라이언트 (0) | 2023.02.22 |
[JAVA] 산성비 게임 (0) | 2023.02.18 |
[JAVA] 슬롯 머신 (0) | 2023.02.17 |
[JAVA] 스네이크 게임 (0) | 2022.10.07 |