1. 🔥 Sound

  • 자바 오디오 API: 디지털 오디오, 미디 데이터
    • 디지털 오디오: 음악, 목소리등 아날로그 데이터를 디지털로 만든 오디오(WAV, AU, AIFF, AIFC)
    • 디지털 미디: 피아노, 바이올린등 악기와 높이 등을 표현하는 오다오 데이터, 미디 장치에서 연주

Clip인터페이스 이용

  • AudioSystem -> System.out과 같이 사용가능(static 메서드 사용)
    • getClip(): Clip clip = AudioSystem.getClip(); Clip 인터페이스 레퍼런스 변수에 사용 가능한 쓰레드 오디오 할당
  • 파일을 열어 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();
    }
} 

두가지 형태로 구분하여 생성한다.

태그: ,

카테고리:

업데이트:

댓글남기기