본문 바로가기

JAVA/공부

14. 고급 스윙 컴포넌트

6. "Calculate" 버튼과 레이블을 가진 프레임을 작성하라. JDialog를 상속받아 CalcDialog 다이얼로그를 구현하고 "Calculate"버튼을 클릭하면 CalcDialog가 출력되도록 하라. 사용자로부터 두 정수를 입력받고 "Add" 버튼을 클릭하면 그 결과 값이 레이블에 출력되도록 하라. CalcDialog는 모달 다이얼로그로 만들어라.

 

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class six extends JFrame{
	private JTextField jt1,jt2;
	private JButton calc,add;
	private JLabel ans;
	public six() {
		setTitle("다이얼로그 만들기");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		Container c=getContentPane();
		CalcDialog dialog=new CalcDialog();
		
		c.setLayout(new FlowLayout());
		calc=new JButton("calculate");
		calc.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				dialog.setVisible(true);
			}
		});
		c.add(calc);
		
		ans=new JLabel("계산 결과 출력");
		ans.setFont(new Font("Serif",Font.BOLD,15));
		ans.setBackground(Color.green);
		ans.setOpaque(true);
		c.add(ans);
		
		setLocation(880,420);
		setSize(300,150);
		setVisible(true);
	}

class CalcDialog extends JDialog{
	public CalcDialog() {
		setTitle("Calculation Dialog");
		setLayout(new FlowLayout());
		jt1=new JTextField(15);
		jt2=new JTextField(15);
		JLabel jl=new JLabel("두 수를 더합니다.");
		jl.setFont(new Font("Serif",Font.BOLD,15));
		add(jl);
		add(jt1);
		add(jt2);
		JButton btn=new JButton("Add");
		btn.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				int i1=Integer.parseInt(jt1.getText());
				int i2=Integer.parseInt(jt2.getText());
				ans.setText(Integer.toString(i1+i2));
				setVisible(false);
			}
		});
		add(btn);
		
		setSize(250,180);
		setLocation(980,520);
	}
}
	public static void main(String[]args) {
		new six();
	}
}

 

 

 

7. 메뉴를 이용하여 오디오를 연주하는 프로그램을 작성하라. "오디오" 메뉴에 "연주" 와 "종료" 메뉴아이템을 두고, "연주" 메뉴아이템이 선택되면 JFileChooser를 이용하여 wav파일을 선택하여 연주를 시작하고, "종료" 메뉴아이템이 선택되면 연주를 종료한다.

 

import javax.swing.*;
import javax.swing.filechooser.*;
import java.awt.*;
import java.awt.event.*;
import javax.sound.sampled.*;
import java.io.*;

public class seven extends JFrame{
	private JLabel label;
	private Clip clip;
	public seven() {
		setTitle("오디오 파일을 찾아 연주/종료 제어");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLayout(new FlowLayout());
		
		createMenu();
		label=new JLabel();
		label.setText("오디오 파일을 선택하세요");
		label.setFont(new Font("Serif",Font.BOLD,17));
		add(label);
		
		setLocation(880,420);
		setSize(500,200);
		setVisible(true);
	}
	private void createMenu() {
		JMenuBar mb=new JMenuBar();
		JMenu audioMenu=new JMenu("오디오");
		
		JMenuItem playItem=new JMenuItem("연주");
		JMenuItem stopItem=new JMenuItem("종료");
		playItem.addActionListener(new OpenActionListener());
		stopItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				clip.stop();
				label.setText("오디오 파일을 선택하세요");
			}
		});
		
		audioMenu.add(playItem);
		audioMenu.add(stopItem);
		
		mb.add(audioMenu);
		setJMenuBar(mb);
	}
	private void loadAudio(String pathName) {
		try{
			clip=AudioSystem.getClip();
			File audioFile=new File(pathName);
			AudioInputStream audioStream=AudioSystem.getAudioInputStream(audioFile);
			clip.open(audioStream);}
		catch(IOException e) {e.printStackTrace();}
		catch(LineUnavailableException e) {e.printStackTrace();}
		catch(UnsupportedAudioFileException e) {e.printStackTrace();}
	}
	class OpenActionListener implements ActionListener{
		private JFileChooser chooser;
		public OpenActionListener() {
			chooser=new JFileChooser();
			chooser.setCurrentDirectory(new File("C:\\Users\\orang\\eclipse-workspace\\14장"));
		}
		@Override
		public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub
			FileNameExtensionFilter filter=new FileNameExtensionFilter("WAV files","wav");
			chooser.setFileFilter(filter);
			int ret=chooser.showOpenDialog(null);
			if(ret !=JFileChooser.APPROVE_OPTION) {JOptionPane.showMessageDialog(null, "파일을 선택하지 않았습니다","경고",JOptionPane.WARNING_MESSAGE);
			return;}
			String filePath=chooser.getSelectedFile().getPath();
			loadAudio(filePath);
			clip.start();
			label.setText(chooser.getSelectedFile().getName()+" 를 연주하고 있습니다.");
			}
		}
	public static void main(String[]args) {
		new seven();
	}
}

 

 

 

8. 연주할 곡을 체크박스로 만들고 사용자가 체크한 곡만 순서대로 연주하는 프로그램을 작성하라. 연주시작 버튼을 누르면 연주가 시작되고 다음 곡에 대해서는 체크박스를 선택/해제할 수 있다. 연주되고 있는 곡명의 글자색을 달리하는 것은 옵션이다. 연주끝 버튼을 누르면 연주가 멈추고, 연주시작 버튼을 누르면 처음부터 시작한다. 연주될 wav 파일은 프로젝트의 audio폴더에 두면 된다.

 

어려웠다.

 

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 > 공부' 카테고리의 다른 글

15. 네트워크  (0) 2021.02.24
13. 스레드와 멀티태스킹  (0) 2021.02.03
12. 그래픽  (0) 2021.01.28
11. 기본적인 스윙 컴포넌트와 활용  (0) 2021.01.23
10. 자바의 이벤트 처리  (0) 2021.01.19