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 |