티스토리 뷰

PL/JAVA

[JAVA] 자바 - 고급 스윙 컴포넌트

poopooreum 2024. 6. 16. 20:40
반응형

✏️ 메뉴 만들기

메뉴 구성

  • JMenuBar: 메뉴바의 기능을 구현한 클래스로 이곳에 JMenu로 만든 메뉴를 여러 개 단다
  • JMenu: 하나의 메뉴를 구현한 클래스로 이곳에 JMenuItem으로 만든 메뉴아이템을 여러 개 단다
  • JMenuItem: 하나의 메뉴아이템을 구현한 클래스이다
  • 분리선: 메뉴아이템 사이의 분리선으로서 JMenu의 addSeparator() 메소드를 호출하여 사용한다.

메뉴 만들기

// 1. 메뉴바 만들기
JMenuBar mb = new JMenuBar();

// 2. 메뉴 만들고 메뉴바에 붙이기
JMenu screenMenu = new JMenu("Screen");
mb.add(screenMenu);

// 3. 메뉴 아이템을 생성하여 메뉴에 붙이기
screenMenu.add(new JMenuItem("Load"));
screenMenu.add(new JMenuItem("Hide"));
screenMenu.add(new JMenuItem("ReShow"));
screenMenu.addSeparator();
screenMenu.add(new JMenuItem("Exit"));

// 4. 메뉴바를 프레임에 붙이기
frame.setJMenuBar(mb);

 

4개의 메뉴아이템과 하나의 분리선을 가지는 메뉴바 만들기 

package ex;
import javax.swing.*;
public class MenuEx extends JFrame{

    public MenuEx(){
        setTitle("Menu 만들기 예제");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        createMenu();
        setSize(250,200);
        setVisible(true);
    }

    private void createMenu() {
        JMenuBar mb = new JMenuBar();
        JMenu screenMenu = new JMenu("Screen");

        screenMenu.add(new JMenuItem("Load"));
        screenMenu.add(new JMenuItem("Hide"));
        screenMenu.add(new JMenuItem("Reshow"));
        screenMenu.addSeparator();
        screenMenu.add(new JMenuItem("Exit"));

        mb.add(screenMenu);
        mb.add(new JMenu("Edit"));
        mb.add(new JMenu("Source"));
        mb.add(new JMenu("Porject"));
        mb.add(new JMenu("Run"));

        setJMenuBar(mb);
    }

    public static void main(String[] args) {
        new MenuEx();
    }

}

 

메뉴아이템에 Action 이벤트 달기

package ex;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class MenuActionEventEx extends JFrame{

    private JLabel imgLabel = new JLabel(); // 빈 이미지를 가진 레이블
    public MenuActionEventEx(){
        setTitle("메뉴에 Action 이벤트 넣기");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        createMenu();
        getContentPane().add(imgLabel,BorderLayout.CENTER);
        setSize(250,220);
        setVisible(true);
    }

    private void createMenu() {

        JMenuBar mb = new JMenuBar();
        JMenuItem[] menuItem = new JMenuItem[4];
        String[] itemTitle = {"Load", "Hide", "ReShow", "Exit"};
        JMenu screenMenu = new JMenu("Screen");


        MenuActionListener listener = new MenuActionListener();
        for (int i = 0; i < menuItem.length;i++){
            menuItem[i] = new JMenuItem(itemTitle[i]);
            menuItem[i].addActionListener(listener);
            screenMenu.add(menuItem[i]);
        }
        mb.add(screenMenu);
        setJMenuBar(mb);
    }
    private class MenuActionListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
            String cmd = e.getActionCommand();
            switch (cmd){
                case "Load" :
                    if(imgLabel.getIcon()!=null)
                        return;
                    imgLabel.setIcon(new ImageIcon("images/네블.jpg"));
                    break;
                case "Hide" :
                    imgLabel.setVisible(false);
                    break;
                case "ReShow" :
                    imgLabel.setVisible(true);
                    break;
                case "Exit" :
                    System.exit(0);
                    break;
            }
        }
    }

    public static void main(String[] args) {
        new MenuActionEventEx();
    }

}

 

 

✏️ 툴바

JToolBar

JToolBar는 툴바를 구현한 컴포넌트로 다양한 스윙 컴포넌트를 담아 아이콘 형태의 메뉴를 제공하기 위해 사용한다. 툴바는 BorderLayout 배치관리자를 가진 컨테이너에만 부착되며, 툴바의 핸들을 드래깅하여 4개의 영역 중 어디에도 붙이지 않고 독립적으로 떠다니게 할 수도 있다.

 

툴바 만들기

// 1. ToolBar 객체 생성
JToolBar toolBar = new JToolBar("Kitae Menu");

// 2. 메뉴로 사용할 컴포넌트를 툴바에 삽입
toolBar.add(new JButton("NEW"));
toolBar.addSeparator();
toolBar.add(new JTextFiled("text field"));

// 3. 툴바를 컨테이너에 삽입
container.add(toolBar, BorderLayout.NORTH);

// 툴바 이동 제어
toolBar.setFloatable(false); // false면 이동 불가능, true면 이동 가능

 

툴바 만들기 예제

package ex;
import javax.swing.*;
import javax.tools.Tool;
import java.awt.*;

public class ToolBarEx  extends JFrame{
  private Container contentPane;

  public ToolBarEx(){
      setTitle("툴바 만들기 예제");
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      contentPane = getContentPane();
      createToolBar();
      setSize(400,200);
      setVisible(true);
  }

    private void createToolBar() {
        JToolBar toolBar = new JToolBar("Menu");
        toolBar.setBackground(Color.GRAY);

        toolBar.add(new JButton("New"));
        toolBar.add(new JButton(new ImageIcon("images/네블.jpg")));
        toolBar.addSeparator();
        toolBar.add(new JButton(new ImageIcon("images/자바/jpg")));
        toolBar.add(new JLabel("search"));
        toolBar.add(new JTextField("TEXT FIELD"));

        JComboBox<String> combo = new JComboBox<>();
        combo.addItem("Java");
        combo.addItem("C");
        combo.addItem("C++");
        combo.addItem("C#");
        toolBar.add(combo);

        contentPane.add(toolBar,BorderLayout.NORTH);
    }

    public static void main(String[] args) {
        new ToolBarEx();
    }
}

 

 

✏️ 툴팁

툴팁 생성 및 달기

스윙 컴포넌트에 마우스를 올리면 잠깐 나타났다가 사라지는 문자열을 툴팁(tooltip)이라고 부른다. 툴팁을 등록할 때는 JComponent의 setToolTipText(String msg) 메소드를 호출한다.

JButton b = new JButton();
b.setToolTipText("파일을 생성합니다.");

 

툴팁 달기 예제

package ex;

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

public class ToolTipEx extends JFrame {
   private Container contentPane;

   public ToolTipEx(){
       setTitle("툴팁 예제");
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       contentPane = getContentPane();
       createToolBar();
       setSize(400,150);
       setVisible(true);
   }

    private void createToolBar() {
        JToolBar bar = new JToolBar("Menu");
        bar.setBackground(Color.LIGHT_GRAY);

        JButton newBtn = new JButton("New");
        newBtn.setToolTipText("파일을 생성합니다.");
        bar.add(newBtn);

        JButton openBtn = new JButton(new ImageIcon("images/티스토리.jpg"));
        openBtn.setToolTipText("파일을 엽니다.");
        bar.add(openBtn);
        bar.addSeparator();

        JButton saveBtn = new JButton(new ImageIcon("images/자바.jpg"));
        saveBtn.setToolTipText("파일을 저장합니다.");
        bar.add(saveBtn);
        bar.add(new JLabel("search"));

        JTextField tf = new JTextField("TEXT fIELD");
        tf.setToolTipText("찾고자 하는 문자열을 입력하세요.");
        bar.add(tf);
        contentPane.add(bar,BorderLayout.NORTH);
    }

    public static void main(String[] args) {
        new ToolTipEx();
    }
}

 

ToolTipManager와 툴팁 시간 제어

툴팁은 마우스를 올리면 나타났다가 일정 시간 후에 사라지는데 ToolTipManager 클래스를 이용하여 툴팁과 관련된 시간을 제어할 수 있다. 그러나 시간 제어는 모든 툴팁에 일괄적으로 적용되며 각 툴팁마다 관련 시간을 따로 지정할 수 없다.

// 1. ToolTipManager 객체 얻기
ToolTipManager m = ToolTipManager.shareInstance(); // ToolTipManager 객체 리턴

// 2. 툴팁 활성화
m.setEnabled(false); // 툴팁이 나타나지 않도록 설정, true로 하면 모든 툴팁 활성화

// 3. 초기 툴팁 출력 시간 제어
m.setInitialDealy(1000); // 마우스가 올라온지 1000ms 후 툴팁이 출력됨

// 4. 툴팁 지속 시간 제어
m.setDismissDelay(1000); // 툴팁이 출력되어 있는 지속 시간을 1000ms로 설정

 

툴팁 시간 제어 예제

package ex;

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

public class ToolTipDelayEx extends JFrame {
   public  ToolTipDelayEx(){
       setTitle("툴팁 시간 제어 예제");
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       Container c = getContentPane();
       c.setLayout(new FlowLayout());

       JLabel image1 = new JLabel(new ImageIcon("images/티스토리.jpg"));
       image1.setToolTipText("티스토리 등장");

       JLabel image2 = new JLabel(new ImageIcon("images/자바.jpg"));
       image2.setToolTipText("자바 등장");

       c.add(image1);
       c.add(image2);

       ToolTipManager m = ToolTipManager.sharedInstance();
       m.setInitialDelay(0);
       m.setDismissDelay(10000);

       setSize(400,220);
       setVisible(true);
   }

    public static void main(String[] args) {
        new ToolTipDelayEx();
    }
}

 

 

✏️ 다이얼로그 만들기

JDialog

다이얼로그란 보여주고자 하는 내용을 스크린에 출력하고, 사용자로부터 입력을 받는 대화 상자이다. JDialog는 JFrame처럼 다른 컨테이너에 속할 필요 없이 화면에 출력 가능한 최상위 컨테이너이다. JDialog의 주요 멤버는 다음과 같다.

메소드 내용
JDialog()
JDialog(Frame owner)
JDialog(Frame owner, String title)
JDialog(Frame owner, String title,boolean modal)
다이얼로그를 생성하는 생성자이다. owner는 다이얼로그의 주인, title은 타이틀,
modal
은 다이얼로그의 종류를 뜻한다. modal값이 true이면 모달 다이얼로그를, false이면 모달리스 다이얼로그를 생성하고 디폴트는 모달리스 타입이다.
void setVisible(boolean b) btrue이면 다이얼로그를 화면에 출력하고 false이면 숨긴다
void setTitel(String title) title 문자열을 다이얼로그 타이틀로 설정한다.

 

다이얼로그 만들기

// 1. JDialog를 상속받는 다이얼로그 클래스 작성
class MyDialog extends JDialog{...}

// 2. 다이얼로그 생성자 작성
class MyDialog extends JDialog{
    public MyDialog(JFrame frame, String title){
    	super(frame,title);
    }
}

// 3. 다이얼로그에 삽입할 컴포넌트 생성
class MyDialog extends JDialog{
    private JTextField tf = new JTextField(10);
    private JButton okButton = new JButton("ok");

    public MyDialog(JFrame frame, String title){
    	super(frame,title);
    }
}

// 4. 다이얼로그에 컴포넌트 부착
class MyDialog extends JDialog{
    private JTextField tf = new JTextField(10);
    private JButton okButton = new JButton("ok");

    public MyDialog(JFrame frame, String title){
    	super(frame,title);
        setLayout(new FlowLayout());
        add(tf);
        add(okButton);
        setSize(200,100)
    }
}

// 5. OK 버튼에 Action 리스너 달기
class MyDialog extends JDialog{
    private JTextField tf = new JTextField(10);
    private JButton okButton = new JButton("ok");

	public MyDialog(JFrame frame, String title){
    	super(frame,title);
        setLayout(new FlowLayout());
        add(tf);
        add(okButton);
        setSize(200,100)
        
        okButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                setVisible(false);
            }
        });
    }
}

// 6. MyDialog 다이얼로그를 생성하는 프레임 작성
public class DialogEx extends JFrame{
    private MyDialog dialog;

    public DialogEx(){
        super("dialogEx 예제 프레임");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JButton btn = new JButton("Show Dialog");

        dialog = new MyDialog(this,"Test Dialog");

        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                dialog.setVisible(true);
            }
        });
        getContentPane().add(btn);
        setSize(250,200);
        setVisible(true);
    }

    public static void main(String[] args) {
        new DialogEx();
    }
}

 

JDialog를 상속받아 다이얼로그 만들기 예제

package ex;


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

class MyDialog extends JDialog{
    private JTextField tf = new JTextField(10);
    private JButton okButton = new JButton("OK");

    public MyDialog(JFrame frame, String title){
        super(frame,title);
        setLayout(new FlowLayout());
        add(tf);
        add(okButton);
        setSize(200,100);

        okButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                setVisible(false);
            }
        });
    }
}

public class DialogEx extends JFrame{
    private MyDialog dialog;

    public DialogEx(){
        super("dialogEx 예제");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JButton btn = new JButton("SHOW Dialog");

        dialog =new MyDialog(this,"Test Dialog");

        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                dialog.setVisible(true);
            }
        });
        getContentPane().add(btn);
        setSize(250,200);
        setVisible(true);
    }

    public static void main(String[] args) {
        new DialogEx();
    }
}

 

모달 다이얼로그와 모달리스 다이얼로그

다이얼로그의 타입은 모달(modal)과 모달리스(modeless)의 두 가지가 있다. 모달 타입은 다이얼로그가 일단 출력되면 다이얼로그를 닫기 전에는 다른 작업을 전혀 할 수 없도록 사용자 입력을 독점하는 타입이며, 모달리스 타입은 다른 창과 모달리스 다이얼로그가 각자 독립적으로 작동하는 타입이다.

 

다이얼로그로부터 사용자 입력 값 전달받기 예제

package ex;


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

class MyModalDialog extends JDialog{
   private JTextField tf = new JTextField(10);
   private JButton okButton = new JButton("OK");

   public MyModalDialog(JFrame frame, String title){
       super(frame,title,true);
       setLayout(new FlowLayout());
       add(tf);
       add(okButton);
       setSize(200,100);

       okButton.addActionListener(new ActionListener() {
           @Override
           public void actionPerformed(ActionEvent e) {
               setVisible(false);
           }
       });
   }

   public String getInput(){
       if(tf.getText().length()==0)
           return null;
       else
           return tf.getText();
   }
}
public class DialogEx2 extends JFrame{
    private MyModalDialog dialog;
    public DialogEx2(){
        super("Dialog 예제2");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JButton btn = new JButton("Show Modal Dialog");

        dialog = new MyModalDialog(this, "Test Modal Dialog");

        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                dialog.setVisible(true);

                String text = dialog.getInput();

                if(text==null)
                    return;
                JButton btn = (JButton)e.getSource();
                btn.setText(text);
            }
        });
        getContentPane().add(btn);
        setSize(250,200);
        setVisible(true);
    }

    public static void main(String[] args) {
        new DialogEx2();
    }
}

 

 

✏️ 팝업 다이얼로그

팝업 다이얼로그와 JOptionPane

팝업 다이얼로그는 스윙 패키지에 구현된 간단한 팝업 창으로 사용자에게 메시지를 전달하거나 간단한 문자열을 입력받는 유용한 다이얼로그이고 JOptionPane 클래스는 여러 종류의 팝업 다이얼로그를 출력하는 static 메소드를 지원한다. 많이 사용되는 3가지 팝업 다이얼로그를 알아보자

 

입력 다이얼로그, JOptionPnae.showInputDialog()

한 줄의 문자열을 입력받는 입력 다이얼로그를 출력

static String JOptionPane.showInputDialog(String msg)
// msg: 다이얼로그 메시지
// 리턴 값: 사용자가 입력한 문자열, 취소 버튼이 선택되거나 창이 닫히면 null 리턴

 

확인 다이얼로그, JOptionPnae.showConfirmDialog()

사용자로부터 확인/취소를 입력받기 위한 팝업 다이얼로그를 출력

static int JOptionPane.showConfirmDialog(Component parentComponent, Object msg, String title, int optionType)
// parentComponent: 다이얼로그의 부모 컴포넌트로서 다이얼로그가 출력되는 영역의 범위 지정을 위해 사용, null이면 전체 화면 중앙에 출력
// msg: 다이얼로그 메시지
// title: 다이얼로그 타이틀
// optionType: 다이얼로그 옵션 종류 지정 / YES_NO_OPTION, YES_NO_CANCEL_OPTION, OK_CANCEL_OPTION
// 리턴 값: 사용자가 선택한 옵션 종류 / YES_OPTION, NO_OPTION, CANCEL_OPTION, OK_OPTION, CLOSED_OPTION

 

메시지 다이얼로그, JOptionPnae.showMessageDialog()

사용자에게 문자열 메시지를 출력하는 메시지 다이얼로그를 출력

static int JOptionPane.showMessageDialog(Component parentComponent, Object msg, String title, int messageType)
// parentComponent: 다이얼로그의 부모 컴포넌트로서 다이얼로그가 출력되는 영역의 범위 지정을 위해 사용, null이면 전체 화면 중앙에 출력
// msg: 다이얼로그 메시지
// title: 다이얼로그 타이틀
// messageType: 다이얼로그의 종류로서 다음 중 하나
/* ERROR_MESSAGE, INFORMATION_MESSAGE, WARNING_MESSAGE, QUESTION_MESSAGE, PLAIN_MESSAGE */

 

3가지 다이얼로그 예제

 

JOptionPane을 사용한 팝업 다이얼로그 작성 예제

package ex;

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

public class OptionPaneEx extends JFrame {
    public OptionPaneEx(){
        setTitle("옵션 팬 예제");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container c =getContentPane();
        setSize(500,200);
        c.add(new MyPanel(),BorderLayout.NORTH);
        setVisible(true);
    }

    private class MyPanel extends Panel {
        private  JButton inputBtn = new JButton("Input Name");
        private  JButton confirmBtn = new JButton("Confirm");
        private  JButton messageBtn = new JButton("Message");
        private  JTextField tf = new JTextField(10);

        public MyPanel(){
            setBackground(Color.LIGHT_GRAY);
            add(inputBtn);
            add(confirmBtn);
            add(messageBtn);
            add(tf);

            inputBtn.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    String name = JOptionPane.showInputDialog("이름을 입력하세요");
                    if(name!=null)
                        tf.setText(name);
                }
            });
            confirmBtn.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    int result = JOptionPane.showConfirmDialog(null,"계속할 것입니까?","Confirm",JOptionPane.YES_NO_OPTION);

                    if(result==JOptionPane.CLOSED_OPTION)
                        tf.setText("Just Closed without Selection");
                    else if(result==JOptionPane.YES_OPTION)
                        tf.setText("Yes");
                    else
                        tf.setText("No");
                }
            });
            messageBtn.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    JOptionPane.showMessageDialog(null,"조심하세요","Message",JOptionPane.ERROR_MESSAGE);
                }
            });
        }
    }

    public static void main(String[] args) {
        new OptionPaneEx();
    }
}

 

 

✏️ 파일 다이얼로그

JFileChooser

JFileChooser는 파일 탐색기와 같은 파일 다이얼로그를 구현한 스윙 컴포넌트이다. JFileChooser는 아래 그림과 같은 모양의 다이얼로그를 출력하여 사용자가 파일이나 디렉터리를 선택하게 되고 JFileChooser를 이용하면 파일 열기 다이얼로그(File Open Dialog)와 파일 저장 다이얼로그(File Save Dialog)를 모두 출력할 수 있다.

 

파일 열기 다이얼로그 생성

// 1. JfileChooser 객체 생성
JfileChooser chooser = new JfileChooser();

// 2. 파일 필터 생성
FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG & GIF Images", "jpg", "gif");
import javax.swing.filechooser.*; 가 필요하다

// 3. JfileChooser에 파일 필터 설정
chooser.setFileFilter(filter); 
chooser.addChoosableFileFilter(filter); // 새로운 파일 필터를 추가할 때

// 4. 파일 대신 디렉터리를 선택하고자 할 때
chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); // 이 코드가 없다면 파일만 선택 가능

//5. 파일 열기 다이얼로그 출력
int ret = chooser.showOpenDialog(null);

// 6. 사용자가 선택한 파일 이름 알아내기
String pathName = chooser.getSelectedFile().getPath(); // 완전 경로명

// 7. showOpenDialog()의 리턴 값 처리
/* 
JFileChooser.APPROVE_OPTION: "열기" 버튼을 누른 경우
JFileChooser.CANCEL_OPTION: "취소" 버튼을 누른 경우
JFileChooser.ERROR_OPTION: 오류가 발생하거나 사용자가 다이얼로그를 닫은 경우

// 파일 저장 다이얼로그 생성
int ret = chooser.showSaveDialog(null);

 

파일 열기 다이얼로그 생성 및 출력

package ex;
import javax.swing.*;
import javax.swing.filechooser.*;
import java.awt.event.*;
import java.awt.*;
public class MenuAndFileDialogEx extends JFrame{
    private JLabel imgLabel = new JLabel();
    public MenuAndFileDialogEx(){
        setTitle("Menu와 JFileChooser 활용하기");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container c =getContentPane();
        c.add(imgLabel);
        createMenu();
        setSize(350,200);
        setVisible(true);
    }

    private void createMenu() {
        JMenuBar mb = new JMenuBar();
        JMenu fileMenu = new JMenu("File");
        JMenuItem openItem = new JMenuItem("Open");

        openItem.addActionListener(new OpenActionListener());
        fileMenu.add(openItem);
        mb.add(fileMenu);
        setJMenuBar(mb);
    }
    class OpenActionListener implements ActionListener {
        private JFileChooser chooser;
        public OpenActionListener(){
            chooser = new JFileChooser();
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG & GIF Images","jpg","gif");
            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();
            imgLabel.setIcon(new ImageIcon(filePath));
            pack();
        }

    }
    public static void main(String[] args) {
        new MenuAndFileDialogEx();
    }
}

 

 

✏️ 컬러 다이얼로그

JColorChooser

JColorChooser를 이용하면 사용자가 색을 선택할 수 있는 컬러 다이얼로그를 출력할 수 있다. 아래 그림은 JColorChooser을 사용하여 컬러 다이얼로그를 출력한 예시이다.

 

컬러 다이얼로그 생성 및 출력

// 1. 컬러 다이얼로그 출력
// JColorChooser 객체를 생성하여 컨텐트팬이나 패널에 컴포넌트로 삽입하여 사용하는 경우도 있음
Color selectedColor = JcolorChooser.showDialog(null, "Color", Color.YELLOW);

// 2. 사용자가 선택한 색 얻기
if(selectedColor != null ){
    JLabel.setForeground(selectedColor);
}

 

JColorChooser를 이용한 컬러 다이얼로그 출력

package ex;

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

public class MenuAndColorChooserEx extends JFrame {

    private JLabel label = new JLabel("Hello");

    public MenuAndColorChooserEx(){
        setTitle("JColorChooser 예제");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container c = getContentPane();
        label.setHorizontalAlignment(SwingConstants.CENTER);
        label.setFont(new Font("Ravie",Font.ITALIC,30));
        c.add(label,BorderLayout.CENTER);
        createMenu();
        setSize(250,200);
        setVisible(true);
    }

    private void createMenu() {
        JMenuBar mb = new JMenuBar();
        JMenu fileMenu = new JMenu("Text");
        JMenuItem colorMenuItem = new JMenuItem("Color");

        colorMenuItem.addActionListener(new MenuActionListener());

        fileMenu.add(colorMenuItem);
        mb.add(fileMenu);
        this.setJMenuBar(mb);
    }


    public static void main(String[] args) {
        new MenuAndColorChooserEx();
    }

    class MenuActionListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            String cmd = e.getActionCommand(); // 메뉴아이템의 이름 출력
            if(cmd.equals("Color")){
                Color selectedColor = JColorChooser.showDialog(null,"Color",Color.GREEN); // 색깔은 초기 화면에 선택된 값
                if(selectedColor!=null){
                    label.setForeground(selectedColor);
                }
            }
        }
    }
}

 

 

✏️ 탭팬

JTabbedPane

JTabbedPane은 아래 그림과 같이 여러 개의 패널을 겹치게 하여 출력 공간을 공유하는 탭팬을 구현하고 탭팬에 부착된 각 패널을 탭(tab)이라고 부른다.

 

탭팬 만들기

// 1. JTabbedPane 객체 생성
JTabbedPane pane = new JTabbedPane(); // 탭 위치는 디폴트로 JTabbedPane.TOP

// 2. 탭 만들어 붙이기
pane.addTab("tab1", new JLabel(new ImageIcon(""))); // 앞의 인자는 탭의 제목을 뜻함

 

3개의 탭을 가진 탭팬 만들기 예제

package ex;

import javax.swing.*;
import java.awt.*;
public class TabbedPaneEx extends JFrame {
    public TabbedPaneEx(){
        setTitle("탭팬 만들기 예제");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container c = getContentPane();
        JTabbedPane pane = createTabbedPane();
        c.add(pane,BorderLayout.CENTER);
        setSize(250,250);
        setVisible(true);
    }

    private JTabbedPane createTabbedPane() {
        JTabbedPane pane = new JTabbedPane();
        pane.addTab("네블",new JLabel(new ImageIcon("images/네블.jpg")));
        pane.addTab("티스토리",new JLabel(new ImageIcon("images/티스토리.jpg")));
        pane.addTab("tab3", new MyPanel());
        return pane;
    }

    private class MyPanel extends JPanel {
        public MyPanel(){
            this.setBackground(Color.YELLOW);
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.RED);
            g.fillRect(10,10,50,50);
            g.setColor(Color.BLUE);
            g.fillOval(10,70,50,50);
            g.setColor(Color.BLACK);
            g.drawString("~~~~`",30,50);
        }
    }

    public static void main(String[] args) {
        new TabbedPaneEx();
    }
}

 

 

✏️ 자바 오디오

자바의 오디오 API

자바는 응용프로그램에서 오디오를 재생하고 제어할 수 있는 오디오 API를 제공하며 아래의 2가지 종류의 오디오 데이터를 다룬다.

  • 디지털 오디오(Digital Audio): 연주되고 있는 음악이나 사람의 목소리 등 아날로그 소리를 샘플링하여 디지털 데이터로 만든 오디오 데이터로, 음악 CD나 전화 목소리를 녹음한 WAVE파일 등이 해당되고 javax.sound.sampled 패키지를 이용하여 디지털 오디오 클래스를 사용한다.
  • 미디(MIDI: Music Instrument Digital Interface) 데이터: 피아노, 바이올린, 드럼 등 악기의 소리를 낼 수 있는 특별한 장치(MIDI Device)에게, 어떤 악기를, 어느 높이로, 얼마의 시간동안 연주할지를 지시하는 데이터로, javax.sound.midi 패키지를 이용하여 미디를 제어할 수 있는 클래스를 사용할 수 있다.

오디오 클립과 오디오 재생

// 1. 오디오 클립 만들기
Clip clip = AudioSystem.getClip()

// 2. 오디오 클립에 오디오 스트림 연결
File audioFile = new File("애국가.wav");
AudioInputStream audioStream = AudioSystem.getAudioInputStream(audioFile);
clip.open(audioStream); // 오디오 클립과 오디오 스트림 연결

// 3. 오디오 재생
clip.start();

// Clip의 메소드
void open(AudioInputStream stream) // 오디오 클립은 stream에 존재하는 오디오의 형식과 데이터를 인식하고, 재생할 수 있는 준비를 갖춘다.
void start() // 현재 프레임 위치에서 오디오 클립을 재생하고, 처음 실행될 때 프레임 위치는 0
void stop() // 재생중인 오디오 클립의 재생을 중단
void setFramePosition(int frames) // 오디오 샘플 내에 재생할 프레임의 위치 지정, 프레임의 시작 번호는 0
void loop(int count) // 현재 프레임의 위치에서 시작하여 count만큼 반복 재생, count 값이 LOOP_CONTINUOUSLY이면 무한 반복
void close() // 오디오 클립의 모든 자원을 반환

 

오디오 재생/중지 예제

package ex;

import javax.sound.sampled.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;

public class AudioEx extends JFrame{
    private JButton btns[] = {new JButton("play"),new JButton("stop"),new JButton("play again")};
    private Clip clip;
    public AudioEx() {
        setTitle("오디오 제어");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(300,150);
        Container c = getContentPane();
        c.setLayout(new FlowLayout());
        
        MyActionListener al = new MyActionListener();
        for(int i=0;i<btns.length;i++){
            c.add(btns[i]);
            btns[i].addActionListener(al);
        }
        setVisible(true);
        loadAudio("audio/애국가1절.wav");
    }

    private void loadAudio(String pathName) {
        try{
            clip= AudioSystem.getClip();
            File audioFile = new File(pathName);
            AudioInputStream audioStream = AudioSystem.getAudioInputStream(audioFile);
            clip.open(audioStream);
        }
        catch (LineUnavailableException e){
            e.printStackTrace();
        }
        catch (UnsupportedAudioFileException e){
            e.printStackTrace();
        }
        catch (IOException e){
            e.printStackTrace();
        }
    }

    class MyActionListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            switch (e.getActionCommand()){
                case "play":
                    clip.start();
                    break;
                case "stop" :
                    clip.stop();
                    break;
                case "play again":
                    clip.setFramePosition(0);
                    clip.start();
                    break;
            }
        }
    }
    public static void main(String[] args) {
        new AudioEx();
    }

    
}
반응형

'PL > JAVA' 카테고리의 다른 글

명품 자바 프로그래밍 1장 실습 문제  (0) 2024.06.18
[JAVA] 자바 - 네트워크  (0) 2024.06.17
[JAVA] 자바 - 스레드와 멀티태스킹  (0) 2024.06.15
[Java] 자바 - 그래픽  (0) 2024.06.14
[JAVA] 자바 - 스윙 컴포넌트  (2) 2024.06.13
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함