10.1 스윙 컴포넌트 소개
컴포넌트 기반 GUI 프로그래밍
▶ 자바 GUI 프로그래밍:
- 컴포넌트 기반 GUI 프로그래밍: 스윙 컴포넌트를 이용하여 쉽게 GUI 구축
- 그래픽 기반 GUI 프로그래밍: 그래픽을 이용하여 GUI 구축
스윙 컴포넌트의 상속 구조
▶ 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
: 문자열이나 이미지를 화면에 출력하기 위한 목적
/*
* 예제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 이벤트 발생
이미지 버튼 만들기
/*
* 예제 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) 두 상태만 가지는 버튼
/*
* 예제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
: 버튼 그룹을 형성하고, 그룹에 속한 버튼 중 하나만 선택되는 버튼
- 체크박스는 각각 선택/해제가 가능하지만, 라디오버튼은 그룹에 속한 버튼 중 하나만 선택할 수 있다.
버튼 그룹과 라디오버튼의 생성 과정
라디오버튼에 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 이벤트 발생
- 입력 가능한 문자 개수와 입력 창의 크기는 서로 다름
/*
* 예제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 컴포넌트 생성 예
/*
* 예제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>로 다양한 리스트 만들기
*/
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>
: 텍스트필드, 버튼, 드롭다운 리스트로 구성되는 콤보박스
- 드롭다운 리스트에서 선택한 것이 텍스트필드에 나타난다.
/*
* 예제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();
}
}
'Programming > Java프로그래밍및실습' 카테고리의 다른 글
[자프실] 12. 자바 스레드 기초 (0) | 2024.01.15 |
---|---|
[자프실] 11. 그래픽 (0) | 2024.01.15 |
[자프실] 9. 자바의 이벤트 처리 (1) | 2024.01.11 |
[자프실] 8. 자바 GUI 스윙 기초 (1) | 2024.01.10 |
[자프실] 7. 컬렉션과 제네릭 (0) | 2024.01.07 |