JAVA공부 [12. JAVA SWING(6)]
1. 🔥 Sound
- 자바 오디오 API: 디지털 오디오, 미디 데이터
- 디지털 오디오: 음악, 목소리등 아날로그 데이터를 디지털로 만든 오디오(WAV, AU, AIFF, AIFC)
- 디지털 미디: 피아노, 바이올린등 악기와 높이 등을 표현하는 오다오 데이터, 미디 장치에서 연주
Clip인터페이스 이용
- AudioSystem -> System.out과 같이 사용가능(static 메서드 사용)
- getClip():
Clip clip = AudioSystem.getClip();
Clip 인터페이스 레퍼런스 변수에 사용 가능한 쓰레드 오디오 할당
- getClip():
- 파일을 열어 Clip과 연결 오디오 스트림 연결
- Clip의 start()로 실행
1.1. 실습 - 오디오 재생(1)
import javax.sound.sampled.*;
import javax.swing.*;
import java.awt.*;
import java.io.File;
import java.io.IOException;
class SoundPlayerPraticePanel extends JPanel{
Clip clip = null;
SoundPlayerPraticePanel(){
try {
clip = AudioSystem.getClip(); // 사용 가능한 쓰레드 할당
File file = new File("audios/soundtest.wav"); // 파일 읽기
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file);
clip.open(audioInputStream);
} catch (LineUnavailableException e) { //파일 읽기 및 getClip관련 메서드
e.printStackTrace();
} catch (UnsupportedAudioFileException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
JButton play = new JButton("Play");
JButton stop = new JButton("Stop");
play.addActionListener((e) -> {clip.start();}); //람다식
stop.addActionListener((e) -> {clip.stop();});
add(play);
add(stop);
}
}
public class App extends JFrame{
App(){
setSize(300,300);
setTitle("My Sound Player");
setDefaultCloseOperation(EXIT_ON_CLOSE);
add(new SoundPlayerPraticePanel());
setVisible(true);
}
public static void main(String[] args){
new App();
}
}
재생과 종료는 Clip클래스의 start, stop을 이용하면 된다.
1.2. 실습 - 오디오 재생(2)
import javax.sound.sampled.*;
import javax.swing.*;
import java.awt.*;
import java.io.File;
import java.io.IOException;
class SoundPlayerPraticePanel extends JPanel implements LineListener{
Clip clip = null;
SoundPlayerPraticePanel(){
try {
clip = AudioSystem.getClip();
File file = new File("audios/soundtest.wav");
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file);
clip.open(audioInputStream);
} catch (LineUnavailableException e) {
e.printStackTrace();
} catch (UnsupportedAudioFileException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
clip.addLineListener(this);
JButton play = new JButton("Play");
JButton stop = new JButton("Stop");
JButton loop = new JButton("Loop");
play.addActionListener((e) -> {
clip.setFramePosition(0);
clip.start();
});
stop.addActionListener((e) -> clip.stop());
loop.addActionListener((e) -> clip.loop(clip.LOOP_CONTINUOUSLY));
add(play);
add(stop);
add(loop);
}
@Override
public void update(LineEvent event) {
if(event.getType() == LineEvent.Type.STOP){
setBackground(Color.BLACK);
}
if(event.getType() == LineEvent.Type.START){
setBackground(Color.ORANGE);
}
}
}
public class App extends JFrame{
App(){
setSize(300,300);
setTitle("My Sound Player");
setDefaultCloseOperation(EXIT_ON_CLOSE);
add(new SoundPlayerPraticePanel());
setVisible(true);
}
public static void main(String[] args){
new App();
}
}
연속 재생과 종료, 루프 클래스 내 참조 테스트..!
2. 🔥 JAR(java Archive file)
jar은 다양한 소스코드를 하나로 묶어서 압축하여 배포하는 용도, 추가적인 파일도 포함 가능(리소스 파일)
vscode에서는 조금 복잡하여 이클립스로 진행..
🔥 Swing Component
메뉴
- JMenuBar: 메뉴바의 기능을 하는 컴포넌트
- JMenu: 파일, 편집 등 하나의 메뉴 기능을 하는 컴포넌트
- JMenuItem: 파일 메뉴 내에 저장 등 메뉴 아이템 컴포넌트
- 분리선: 메뉴 아이템사이의 분리선
툴바
- JToolBar: 툴바의 기능을 하는 컴포넌트
- 여러 컴포넌트들 담는 컨테이너의 성격을 가짐
- 버튼, 레이블등 다양한 컴포넌트를 부착하여 사용
- 한 행 또는 열로만 표현
- 툴바는 BoardLayout배치 관리자를 가진 컨테이너에만 부착(상하좌우중에 부착)
- 드래그로 이동가능함
다이얼 로그
- 모달 리스 다이어 로그: 프레임이 두개로 각각 존재하며 독립적인 형태(쓰레드가 새로 생김)
- 모달 다이어 로그: 프레임이 두개로 존재하지만 앞서 다이어로그가 우선순위를 가지고 있음(쓰레드가 동일함)
실습 - 메뉴바 만들기
import java.awt.*;
import javax.swing.*;
public class App extends JFrame{
App(){
setSize(300,300);
setTitle("My Menu");
JMenuBar mBar = new JMenuBar();
JMenu fileMenu = new JMenu("file");
JMenuItem file1 = new JMenuItem("open");
JMenuItem file2 = new JMenuItem("save");
JMenuItem file3 = new JMenuItem("close");
fileMenu.add(file1);
fileMenu.add(file2);
fileMenu.addSeparator();
fileMenu.add(file3);
mBar.add(fileMenu);
setJMenuBar(mBar);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args){
new App();
}
}
맨 처음 JMenuBar를 만들고 그 위에 JMenu를 붙인 뒤 해당 메뉴에 JMenuItem를 각각 붙여서 만든다.
실습 - 일반화 된 메뉴바 만들기
import java.awt.*;
import javax.swing.*;
public class App extends JFrame{
App(){
setSize(300,300);
setTitle("My Menu");
JMenuBar mBar = new JMenuBar();
String [] fileMenu = {"file","open","save","","close"};
String [] editMenu = {"edit","copy","paste","cut"};
addMenu(mBar, fileMenu);
addMenu(mBar, editMenu);
setJMenuBar(mBar);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
void addMenu(JMenuBar mBar, String [] str){
JMenu menu = null;
for(int i = 0; i < str.length ; i++){
String e = str[i];
if(i == 0){
menu = new JMenu(e);
continue;
}
if(e.length() > 0)
{
JMenuItem it = new JMenuItem(e);
menu.add(it);
}
else
menu.addSeparator();
}
mBar.add(menu);
}
public static void main(String[] args){
new App();
}
}
메뉴바 생성을 일반화 하기 위해 메서드로 따로 빼서 관리한다.
실습 - 메뉴 선택 이벤트 (1)
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class App extends JFrame{
App(){
setSize(300,300);
setTitle("My Menu");
JMenuBar mBar = new JMenuBar();
String [] fileMenu = {"file","open","save","","close"};
ActionListener[] fileAction = {null,(e)->System.out.println("open"),null,null,null};
String [] editMenu = {"edit","copy","paste","cut"};
ActionListener[] editAction = {null,null,null,null};
addMenu(mBar, fileMenu, fileAction);
addMenu(mBar, editMenu, editAction);
setJMenuBar(mBar);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
//메뉴 메서드에 액션리스터를 추가 인자로 설정하여 메서드 내부에서 add해줌
void addMenu(JMenuBar mBar, String [] str, ActionListener [] acts){
JMenu menu = null;
for(int i = 0; i < str.length ; i++){
String e = str[i];
if(i == 0){
menu = new JMenu(e);
continue;
}
if(e.length() > 0)
{
JMenuItem it = new JMenuItem(e);
if(acts[i] != null)
it.addActionListener(acts[i]);
menu.add(it);
}
else
menu.addSeparator();
}
mBar.add(menu);
}
public static void main(String[] args){
new App();
}
}
람다식을 사용하여 액션리스너를 넘겨줌
실습 - 메뉴 선택이벤트 (2)
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class App extends JFrame implements ActionListener{
App(){
setSize(300,300);
setTitle("My Menu");
JMenuBar mBar = new JMenuBar();
String [] fileMenu = {"file","open","save","","close"};
ActionListener[] fileAction = {null,(e)->System.out.println("open"),null,null,null};
String [] editMenu = {"edit","copy","paste","cut"};
ActionListener[] editAction = {null,this,this,this}; //자신 컴포넌트가 ActionListener를 상속 받아서 가능
addMenu(mBar, fileMenu, fileAction);
addMenu(mBar, editMenu, editAction);
setJMenuBar(mBar);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
void addMenu(JMenuBar mBar, String [] str, ActionListener [] acts){
JMenu menu = null;
for(int i = 0; i < str.length ; i++){
String e = str[i];
if(i == 0){
menu = new JMenu(e);
continue;
}
if(e.length() > 0)
{
JMenuItem it = new JMenuItem(e);
if(acts[i] != null)
it.addActionListener(acts[i]);
menu.add(it);
}
else
menu.addSeparator();
}
mBar.add(menu);
}
public static void main(String[] args){
new App();
}
@Override
public void actionPerformed(ActionEvent e) {
JMenuItem item = (JMenuItem)e.getSource(); //다운캐스팅 부분
switch(item.getText()){
case "copy":
System.out.println("Copy..!");
break;
case "paste":
System.out.println("Paste!!");
break;
default:
break;
}
}
}
JFrame 자체에서 액션리스너를 상속받아 스위치문으로 분별함
실습 - 다이어 로그 만들기
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
class Mydialog extends JPanel implements ActionListener{
Mydialog(){
JButton but = new JButton("Push");
but.addActionListener(this);
add(but);
}
public void actionPerformed(ActionEvent e) {
JDialog dig = new JDialog();
dig.setSize(300,200);
dig.setTitle("My Dialog");
dig.setVisible(true);
}
}
public class App extends JFrame{
App(){
setSize(300,300);
setTitle("My Menu");
add(new Mydialog());
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args){
new App();
}
}
Frame과 비슷한 방식으로 생성하여 관리한다.
실습 - Modaless, Modal 다이어 로그 만들기
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
class Mydialog extends JPanel implements ActionListener{
JDialog dlg = null;
JFrame frame = null;
JButton but;
JButton but2;
Mydialog(JFrame parent){
frame = parent;
but = new JButton("Modaless Dialog");
but.addActionListener(this);
add(but);
but2 = new JButton("Modal Dialog");
but2.addActionListener(this);
add(but2);
}
public void actionPerformed(ActionEvent e) {
JButton temp = (JButton)e.getSource();
JDialog dig = null;
if(temp == but)
dig = new JDialog(frame, "My Dialog", false);
else if(temp == but2)
dig = new JDialog(frame, "My Dialog", true);
dig.setSize(300,200);
dig.setVisible(true);
}
}
public class App extends JFrame{
App(){
setSize(300,300);
setTitle("My Menu");
add(new Mydialog(this));
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args){
new App();
}
}
두가지 형태로 구분하여 생성한다.
댓글남기기