본문 바로가기
Programming/Java프로그래밍및실습

[자프실] 10. 스윙 컴포넌트 활용

by Lizardee 2024. 1. 13.
10.1 스윙 컴포넌트 소개
컴포넌트 기반 GUI 프로그래밍

▶ 자바 GUI 프로그래밍:

  • 컴포넌트 기반 GUI 프로그래밍: 스윙 컴포넌트를 이용하여 쉽게 GUI 구축
  • 그래픽 기반 GUI 프로그래밍: 그래픽을 이용하여 GUI 구축

 

스윙 컴포넌트의 상속 구조

▶ JComponent

: 스윙 컴포넌트는 JComponent를 상속받는다.

JComponent

 

/*
 * 예제10-1: 스윙 컴포넌트의 공통 기능, JComponent의 메소드
 */
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class JComponentEx extends JFrame {
	public JComponentEx() {
		setTitle("JComponent의 공통 메소드 예제");
		Container c = getContentPane();
		c.setLayout(new FlowLayout());
		
		JButton b1 = new JButton("Megenta/Yellow Button");
		JButton b2 = new JButton("Disabled Button");
		JButton b3 = new JButton("getX(), getY()");
		
		b1.setBackground(Color.YELLOW);
		b1.setForeground(Color.MAGENTA);  // 글자색
		b1.setFont(new Font("Arial", Font.ITALIC, 20));  
		
		b2.setEnabled(false);  // 버튼 비활성화
		
		b3.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				JButton b = (JButton)e.getSource();
				setTitle(b.getX() + "," + b.getY());  // 클릭하면 타이틀에 버튼 좌표 출력
			}
		});
		
		c.add(b1); c.add(b2); c.add(b3);  
		
		setSize(260,200);
		setVisible(true);
	}
	
	public static void main(String[] args) {
		new JComponentEx();
	}
}

 


10.2 JLabel로 문자열과 이미지 출력
JLabel

: 문자열이나 이미지를 화면에 출력하기 위한 목적

JLabel

 

/*
 * 예제10-2: JLabel을 이용한 문자열과 이미지 출력
 */
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class LabelEx extends JFrame {
	public LabelEx() {
		setTitle("레이블 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = getContentPane();
		c.setLayout(new FlowLayout());
		
		// 문자열 레이블 생성
		JLabel textLabel = new JLabel("제임스 고슬링 입니더!");
		
		// 이미지 레이블 생성
		ImageIcon img = new ImageIcon("image/gosling.jpg");  // 이미지 로딩
		JLabel imageLabel = new JLabel(img);  // 레이블 생성
		
		// 문자열 이미지 모두 가진 레이블 생성
		ImageIcon icon = new ImageIcon("image/icon.gif");  // 이미지 로딩
		JLabel label = new JLabel("커피한잔 하실래예, 전화주이소", icon, SwingConstants.CENTER);  // 레이블 생성
		
		c.add(textLabel);
		c.add(imageLabel);
		c.add(label);
		
		setSize(300,500);
		setVisible(true);
	}
	
	public static void main(String[] args) {
		new LabelEx();
	}
}

 


10.3 JButton으로 버튼 만들기
JButton

: 버튼 모양의 컴포넌트. 사용자로부터 명령을 입력받기 위한 목적

--> 버튼이 클릭될 때 Action 이벤트 발생

JButton

 

이미지 버튼 만들기

이미지 버튼 만들기

 

/*
 * 예제 10-3: JButton을 이용한 이미지 버튼 만들기
 */
import javax.swing.*;
import java.awt.*;

public class ButtonImageEx extends JFrame {
	public ButtonImageEx() {
		setTitle("이미지 버튼 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = getContentPane();
		c.setLayout(new FlowLayout());
		
		// 3개의 이미지를 읽어들인다.
		ImageIcon normalIcon = new ImageIcon("images/normalIcon.gif");
		ImageIcon rolloverIcon = new ImageIcon("images/rolloverIcon.gif");
		ImageIcon pressedIcon = new ImageIcon("images/pressedIcon.gif");
		
		// 3개의 아이콘을 가진 버튼 컴포넌트 생성
		JButton btn = new JButton("call~~", normalIcon);
		btn.setPressedIcon(pressedIcon);  // pressedIcon용 이미지 등록
		btn.setRolloverIcon(rolloverIcon);  // rolloverIcon용 이미지 등록
		c.add(btn);
		
		setSize(250,150);
		setVisible(true);
	}
	public static void main(String[] args) {
		new ButtonImageEx();
	}
}

 


10.4 JCheck로 체크박스 만들기
JCheckBox

: 선택(selected)과 비선택(deselected) 두 상태만 가지는 버튼

JCheckBox

 

/*
 * 예제10-4: JCheckBox로 체크박스 만들기
 */

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

public class CheckBoxEx extends JFrame {
	public CheckBoxEx() {
		setTitle("체크박스 만들기 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = getContentPane();
		c.setLayout(new FlowLayout());
		
		// 3개의 체크박스를 생성한다.
		JCheckBox apple = new JCheckBox("사과");
		JCheckBox pear = new JCheckBox("배", true);  // 선택 상태의 체크박스 생성
		JCheckBox cherry = new JCheckBox("체리");
		
		// 컨텐트팬에 3개의 체크박스 삽입
		c.add(apple);
		c.add(pear);
		c.add(cherry);
		
		setSize(250,150);
		setVisible(true);
	}
	public static void main(String[] args) {
		new CheckBoxEx();
	}
}

 

체크박스에 Item 이벤트 처리
  • Item 이벤트: 체크박스의 선택 상태에 변화가 생길 때 발생하는 이벤트

/*
 * 예제10-5: ItemEvent를 활용하여 체크박스로 가격을 합산하는 응용
 */
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class CheckBoxItemEventEx extends JFrame {
	private JCheckBox[] fruits = new JCheckBox[3];  // 체크박스 배열
	private String[] names = {"사과", "배", "체리"};  // 체크박스 문자열로 사용할 문자열 배열
	private JLabel sumLabel;  // 계산 합을 출력할 레이블
	
	public CheckBoxItemEventEx() {
		setTitle("체크박스와 ItemEvent 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = getContentPane();
		c.setLayout(new FlowLayout());
		
		JLabel la = new JLabel("사과 100원, 배 500원, 체리 2000원");
		c.add(la);
		
		// 3개의 체크박스 컴포넌트를 생성하고 컨텐트팬에 삽입, Item 리스너 등록
		MyItemListener listener = new MyItemListener();
		for(int i=0; i<fruits.length; i++) {
			fruits[i] = new JCheckBox(names[i]);  // names[]의 문자열로 체크박스 생성
			fruits[i].setBorderPainted(true);  // 체크박스 외곽선이 보이도록 설정
			c.add(fruits[i]); 
			fruits[i].addItemListener(listener);  // 체크박스에 Item 리스너 등록
		}
		
		sumLabel = new JLabel("현재 0원입니다.");  // 필드로 선언된 sumLabel을 초기화
		c.add(sumLabel);
		
		setSize(250,200);
		setVisible(true);
	}
	
	// Item 리스너 구현
	class MyItemListener implements ItemListener{
		private int sum=0; // 가격의 합
		
		// 체크박스의 선택 상태가 변하면 itemStateChange()가 호출됨
		public void itemStateChanged(ItemEvent e) {
			if(e.getStateChange() == ItemEvent.SELECTED) {  // 체크박스가 선택된 경우
				if(e.getItem() == fruits[0])
					sum+=100;
				else if(e.getItem() == fruits[1])
					sum+=500;
				else
					sum+=2000;
			}
			else {  // 체크박스가 해제된 경우
				if(e.getItem() == fruits[0])
					sum-=100;
				else if(e.getItem() == fruits[1])
					sum-=500;
				else
					sum-=2000;
			}
			sumLabel.setText("현재 " + sum + "원 입니다.");  // 합 출력
		}
	}

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

 


10.5 JRadioButton으로 라디오버튼 만들기
JRadioButton

: 버튼 그룹을 형성하고, 그룹에 속한 버튼 중 하나만 선택되는 버튼

  • 체크박스는 각각 선택/해제가 가능하지만, 라디오버튼은 그룹에 속한 버튼 중 하나만 선택할 수 있다.

JRadioButton

 

버튼 그룹과 라디오버튼의 생성 과정

버튼 그룹과 라디오버튼의 생성 과정

 

라디오버튼에 Item 이벤트 처리

: ItemListener 리스너 이용

  • 라디오버튼이 선택/해제되어 상태가 달라지면, Item 이벤트 발생

/*
 * 예제10-6: JRadioButton으로 라디오 버튼 만들기
 */
import javax.swing.*;
import java.awt.*;

public class RadioButtonEx extends JFrame {
	public RadioButtonEx() {
		setTitle("라디오버튼 만들기 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = getContentPane();
		c.setLayout(new FlowLayout());
		
		ButtonGroup g = new ButtonGroup();  // 버튼 그룹 객체 생성
		
		// 라디오버튼 3개 생성
		JRadioButton apple = new JRadioButton("사과");
		JRadioButton pear = new JRadioButton("배");
		JRadioButton cherry = new JRadioButton("체리");
		
		// 버튼 그룹에 3개의 라디오버튼 삽입
		g.add(apple);
		g.add(pear);
		g.add(cherry);
		
		// 컨텐트팬에 3개의 라디오버튼 삽입
		c.add(apple); 
		c.add(pear);
		c.add(cherry);
		
		setSize(250,150);
		setVisible(true);
	}
	public static void main(String[] args) {
		new RadioButtonEx();
	}
}

 


10.6 JTextField로 한 줄 입력 창 만들기
JTextField

: 한 줄의 문자열을 입력받는 창(텍스트 필드)

  • 텍스트 입력 도중 <Enter> 키가 입력되면 Action 이벤트 발생
  • 입력 가능한 문자 개수와 입력 창의 크기는 서로 다름

JTextField

 

/*
 * 예제10-7: JTextField로 텍스트필드 만들기
 */
import javax.swing.*;
import java.awt.*;

public class TextFieldEx extends JFrame {
	public TextFieldEx() {
		setTitle("텍스트필드 만들기 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = getContentPane();
		c.setLayout(new FlowLayout());
		
		c.add(new JLabel("이름  "));
		c.add(new JTextField(20));  // 창의 열의 개수 20
		c.add(new JLabel("학과  "));
		c.add(new JTextField("컴퓨터공학과", 20));  // 창의 열의 개수 20
		c.add(new JLabel("주소  "));
		c.add(new JTextField("서울시 ...", 20));
		
		setSize(250,150);
		setVisible(true);
	}
	public static void main(String[] args) {
		new TextFieldEx();
	}
}

 


10.7 JTextArea로 여러 줄의 입력 창 만들기
JTextArea

: 여러 줄의 문자열을 입력받을 수 있는 창 (텍스트 영역)

JTextArea

 

JTextArea 컴포넌트 생성 예

/*
 * 예제10-8: JTextArea로 여러 줄이 입력되는 창 만들기
 */
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class TextAreaEx extends JFrame {
	private JTextField tf = new JTextField(20);
	private JTextArea ta = new JTextArea(7,20);  // 한 줄에 20개 입력 가능. 7줄 입력창
	
	public TextAreaEx() {
		setTitle("텍스트 영역 만들기 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = getContentPane();
		c.setLayout(new FlowLayout());
		
		c.add(new JLabel("입력 후 <Enter> 키를 입력하세요"));
		c.add(tf);
		c.add(new JScrollPane(ta));
		
		// 텍스트필드에 Action 리스너를 등록한다.
		tf.addActionListener(new ActionListener() {  // <Enter> 키 입력시 작동하는 리스너
			public void actionPerformed(ActionEvent e) {
				JTextField t = (JTextField)e.getSource();
				ta.append(t.getText() + "\n");  // 텍스트필드의 문자열을 텍스트영역에 붙임
				t.setText("");  // 현재 텍스트필드에 입력된 내용 지우기
			}
		});
		
		setSize(300,250);
		setVisible(true);
	}
	public static void main(String[] args) {
		new TextAreaEx();
	}
}

 


10.8 JList<E>로 리스트 만들기
JList<E>

: 하나 이상의 아이템을 보여주고 아이템을 선택하도록 하는 리스트

JList<E>

/*
 * JList<E>로 다양한 리스트 만들기
 */
import javax.swing.*;
import java.awt.*;

public class ListEx extends JFrame {
	private String[] fruits = {"apple", "banana", "kiwi", "mango", "pear", "peach", 
			"berry", "strawberry", "blackberry"};
	private ImageIcon[] images = {new ImageIcon("images/icon1.png"),
			new ImageIcon("images/icon2.png"),
			new ImageIcon("images/icon3.png"),
			new ImageIcon("images/icon4.png")
	};
	
	public ListEx() {
		setTitle("리스트 만들기 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = getContentPane();
		c.setLayout(new FlowLayout());
		
		JList<String> strList = new JList<String>(fruits);  // 문자열 리스트 생성
		c.add(strList);
		
		JList<ImageIcon> imageList = new JList<ImageIcon>();  // 이미지 리스트 생성. 빈 리스트
		imageList.setListData(images);  // 리스트에 이미지 아이템 삽입
		c.add(imageList);
		
		JList<String> scrollList = new JList<String>(fruits);  // 문자열 리스트 생성
		c.add(new JScrollPane(scrollList));  // 리스트를 JScrollPane에 부착
		
		setSize(300,300);
		setVisible(true);
	}
	public static void main(String[] args) {
		new ListEx();
	}
}

 


10.9 JComboBox<E>로 콤보박스 만들기
JComboBox<E>

: 텍스트필드, 버튼, 드롭다운 리스트로 구성되는 콤보박스

  • 드롭다운 리스트에서 선택한 것이 텍스트필드에 나타난다.

JComboBox<E>

 

/*
 * 예제10-10: JComboBox<E>로 콤보박스 만들고 활용하기
 */
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class ComboActionEx extends JFrame {
	private String[] fruits = {"apple", "banana", "mango"};  // 콤보박스 아이템
	private ImageIcon[] images = {new ImageIcon("images/apple.jpg"),
			new ImageIcon("images/banana/jpg"),
			new ImageIcon("images/mango.jpg")
	};
	private JLabel imgLabel = new JLabel(images[0]);  // 이미지를 출력할 레이블
	
	public ComboActionEx() {
		setTitle("콤보박스 활용 예제");
		Container c = getContentPane();
		c.setLayout(new FlowLayout());
		JComboBox<String> combo = new JComboBox<String>(fruits);  // 콤보박스 생성
		c.add(combo);
		c.add(imgLabel);
		
		// 콤보박스에 Action 리스너 등록. 선택된 아이템의 이미지 출력
		combo.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e){
				JComboBox<String> cb = (JComboBox<String>)e.getSource();  // Action 이벤트가 발생한 콤보박스 알아내기
				int index = cb.getSelectedIndex();  // 콤보박스의 선택된 아이템의 인덱스 번호 알아내기
				imgLabel.setIcon(images[index]);
			}
		});
		
		setSize(300,250);
		setVisible(true);
	}
	public static void main(String[] args) {
		new ComboActionEx();
	}
}

 


10.10 메뉴 만들기
메뉴 구성

메뉴 구성

 

메뉴 만들기

메뉴 만들기

/*
 * 예제10-11: 메뉴 만들기
 */
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class MenuEx extends JFrame {
	public MenuEx() {
		setTitle("Menu 만들기 예제");
		createMenu();  // 메뉴 생성, 프레임에 삽입
		setSize(250,200);
		setVisible(true);
	}
	
	// 메뉴를 만들어 프레임에 삽입한다.
	private void createMenu() {
		JMenuBar mb = new JMenuBar();  // 메뉴바 생성
		JMenu screenMenu = new JMenu("Screen");  // Screen 메뉴 생성
		
		// 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);  // Screen 메뉴 삽입
		mb.add(new JMenu("Edit"));  // Edit 메뉴 생성 삽입
		mb.add(new JMenu("Source"));  // Source 메뉴 생성 삽입
		mb.add(new JMenu("Project"));  // Project 메뉴 생성 삽입
		mb.add(new JMenu("Run"));  // Run 메뉴 생성 삽입
		
		// 메뉴바를 프레임에 부착
		setJMenuBar(mb);
	}
	public static void main(String[] args) {
		new MenuEx();
	}
}

 

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

: 메뉴아이템을 클릭하면 Action 발생

/* 
 * 예제 10-12: 메뉴에 Action 리스너 활용
 */
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class MenuActionEventEx extends JFrame {
	private JLabel imgLabel = new JLabel();  // 빈 이미지를 가진 레이블
	
	public MenuActionEventEx() {
		setTitle("Menu에 Action 리스너 만들기 예제");
		createMenu();
		getContentPane().add(imgLabel, BorderLayout.CENTER);
		
		setSize(250,200);
		setVisible(true);
	}
	
	// 메뉴바, Screen 메뉴 생성. Screen 메뉴에 4개의 메뉴아이템 삽입
	private void createMenu() {
		JMenuBar mb = new JMenuBar();  // 메뉴바 생성
		JMenuItem[] menuItem = new JMenuItem[4];
		String[] itemTitle = {"Loaf", "Hide", "ReShow", "Exit"};
		JMenu screenMenu = new JMenu("Screen");
		
		// 4개의 메뉴아이템을 Screen 메뉴에 삽입한다.
		MenuActionListener listener = new MenuActionListener();  // Action 리스너 생성
		for(int i=0; i<menuItem.length; i++) {
			menuItem[i] = new JMenuItem(itemTitle[i]);  // 메뉴아이템 생성
			menuItem[i].addActionListener(listener);  // 메뉴아이템에 Action 리스너 등록
			screenMenu.add(menuItem[i]);  // 메뉴아이템을 Screen 메뉴에 삽입
		}
		mb.add(screenMenu);  // 메뉴바에 Screen 메뉴 삽입
		setJMenuBar(mb);  // 메뉴바를 프레임에 부착
	}
	
	// 메뉴아이템 처리 Action 리스너
	class MenuActionListener implements ActionListener{
		public void actionPerformed(ActionEvent e) {
			String cmd = e.getActionCommand();  // 사용자가 선택한 메뉴아이템의 문자열 리턴
			switch(cmd) {  // 메뉴 아이템의 종류 구분
			case "Load":
				if(imgLabel.getIcon() != null)
					return;  // 이미 로딩되었으면 리턴
				imgLabel.setIcon(new ImageIcon("imgate/img.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();
	}
}

 


10.11 팝업 다이얼로그
  • 팝업 다이얼로그: 사용자에게 메시지를 전달하거나 문자열을 간단히 입력받는 용도
입력 다이얼로그, JOptionPane.showInputDialog()

입력 다이얼로그

 

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

확인 다이얼로그

 

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

메시지 다이얼로그

 

/*
 * 예제10-13: JOptionPane으로 3가지 팝업 다이얼로그 만들기
 */

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

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);
	}
	
	class MyPanel extends Panel{
		private JButton inputBtn = new JButton("Input Name");
		private JTextField tf = new JTextField(10);
		private JButton confirmBtn = new JButton("Confirm");
		private JButton messageBtn = new JButton("Message");
		
		public MyPanel() {
			setBackground(Color.LIGHT_GRAY);
			add(inputBtn);
			add(confirmBtn);
			add(messageBtn);
			add(tf);
			
			inputBtn.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					// 입력 다이얼로그 생성
					String name = JOptionPane.showInputDialog("이름을 입력하세요.");
					if(name!=null)
						tf.setText(name);  // 사용자가 입력한 문자열을 텍스트필드 창에 출력
				}
			});
			
			confirmBtn.addActionListener(new ActionListener() {
				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() {
				public void actionPerformed(ActionEvent e) {
					// 메시지 다이얼로그 생성
					JOptionPane.showMessageDialog(null,  "조심하세요", "Message",
							JOptionPane.ERROR_MESSAGE);
				}
			});
		}
	}
	public static void main(String[] args) {
		new OptionPaneEx();
	}
}