Transcript 16장

16장. 스윙
public class SumTest {
public static void main(String a1[])
{
int a, b, sum;
a = Integer.parseInt(a1[0]);
b = Integer.parseInt(a1[1]);
sum = a + b ; // 두 수를 더하는 부분입니다
System.out.println("두수의 합은 " + sum + "입니다");
}
}
1
학습목표
사용자 인터페이스인 스윙 컴포넌트의 사용에 관해 학습한다.
JComponent 클래스에 관해 학습한다.
스윙의 모든 컴포넌트 클래스에 관해 학습한다.
2
 목차
 section 1 스윙 컴포넌트
-
1-1 스윙( javax.swing) 패키지의 개요
-
1-2 JComponent 클래스
 section 2 컴포넌트에서의 이벤트 처리
 section 3 이미지 아이콘(ImageIcon)과 라벨(Label)
 section 4 텍스트 필드와 텍스트 에리어
 section 5 버튼
3
 목차
 section 6 푸시 버튼
 section 7 체크박스
 section 8 라디오 버튼
 section 9 콤보박스
 section 10 리스트
 section 11 스크롤 바
 section 12 그룹 홀더
 section 13 테이블
 section 14 메뉴
4
1 스윙 컴포넌트
1-1
스윙( javax.swing) 패키지의 개요
 스윙(Swing)
-
선(sun)사가 넷스케이프사와 공동으로 개발한 새로운 그래픽 툴킷(toolkit)
-
그래픽을 JVM이 자체적으로 처리
-
컴포넌트를 그리기 위해 실행 중인 컴퓨터에서 하나의 컴포넌트(예를 들면 프레임 윈도)만
을 사용
-
16장. 스윙
스윙과 관련된 모든 클래스들은 javax.swing 패키지에 포함
5
1 스윙 컴포넌트
1-1
스윙( javax.swing) 패키지의 개요
 스윙 패키지의 주요 클래스와 상속관계
525 page
16장. 스윙
6
1 스윙 컴포넌트
1-1
스윙( javax.swing) 패키지의 개요
 스윙 패키지 주요 클래스의 기능
클래스
설명
AbstractButton
버튼과 연관된 클래스들의 상위 추상 클래스
ButtonGroup
버튼을 그룹화하기 위한 클래스
ImageIcon
이미지를 아이콘으로 캡슐화하여 제공하는 클래스
JApplet
애플릿(applet)의 스윙 버전으로 Applet 클래스로부터 상속된
클래스
JButton
스윙에서 사용하는 버튼 클래스
JCheckBox
스윙에서 사용하는 체크박스 클래스
JCheckBoxMenuItem
스윙의 메뉴에서 사용하는 체크박스 클래스
JComboBox
풀다운 리스트를 보여줄 수 있는 콤보박스 클래스
JComponent
모든 스윙 컴포넌트의 상위 클래스
JLabel
스윙에서 사용하는 라벨 클래스
JMenu
스윙의 메뉴에서 사용하는 메뉴 클래스
JMenuBar
스윙의 메뉴바를 만들기 위한 클래스
JMenuItem
스윙에서 사용하는 메뉴 관련 클래스의 상위 클래스
16장. 스윙
7
1 스윙 컴포넌트
1-1
스윙( javax.swing) 패키지의 개요
 스윙 패키지 주요 클래스의 기능
클래스
설명
JPanel
스윙에서 사용하는 패널 클래스
JRadioButton
스윙에서 사용하는 라디오 버튼 클래스
JRadioButtonMenuItem
스윙의 메뉴에서 사용하는 라디오 버튼 클래스
JScrollPane
스크롤 윈도를 나타내는 클래스
JTabbedPane
그룹을 홀더 형태로 제공하는 윈도를 나타내는 클래스
JTable
데이터를 행과 열로 나타내는 클래스
JTextArea
스윙에서 사용하는 텍스트 에리어 클래스
JTextComponent
스윙에서 사용하는 텍스트 관련 클래스들의 상위 클래스
JTextFeild
스윙에서 사용하는 텍스트 필드 클래스
JToggleButton
JCheckBox 클래스와 JRadioButton 클래스의 상위 클래스
JTree
트리 형태를 나타내는 클래스
16장. 스윙
8
1 스윙 컴포넌트
1-2
JComponent 클래스
 Jcomponent 클래스
-
AWT 패키지의 Component 클래스와 Container 클래스의 하위 클래스
-
상위 클래스에서 제공되는 기본적인 기능(메소드)들을 그대로 상속받아 사용할 수 있다는
의미
16장. 스윙
9
1 스윙 컴포넌트
1-2
JComponent 클래스
 JComponent 클래스의 상위 클래스와 하위 클래스
527 page
16장. 스윙
10
1 스윙 컴포넌트
1-2
JComponent 클래스
 JComponent 클래스의 메소드
메소드
설명
protected void paintComponent(Graphics g)
Graphics 객체 g를 이용하여 컴포넌트(주로 패널 객체)에 그래
픽을 출력한다.
void setFont(Font font)
컴포넌트에 나타낼 폰트를 설정한다.
void setVisible(boolean aFlag)
컴포넌트를 나타낼 것인지를 지정한다.
16장. 스윙
11
2 컴포넌트에서의 이벤트 처리
1-2
JComponent 클래스
 받아들일 이벤트와 연관된 인터페이스를 사용하여 클래스 생성
public class MyButton implements ActionListener
 GUI 구축을 위한 컴포넌트 객체를 생성 ƒ
JButton mybutton = new JButton("선택");
 이벤트를 받아들인 컴포넌트 객체(여기서는 버튼 객체)에 리스너를 등록 ƒ
mybutton.addActionListener(this);
16장. 스윙
12
2 컴포넌트에서의 이벤트 처리
1-2
JComponent 클래스
 add() 메소드를 사용하여 컴포넌트를 패널(또는 프레임)에 추가 ƒ
add(mybutton);
 이벤트를 처리할 이벤트 처리 루틴 작성(예 : action 이벤트)
public void actionPerformed(ActionEvent ae) {
label.setText(ae.getActionCommand()) ;
}
16장. 스윙
13
2 컴포넌트에서의 이벤트 처리
1-2
JComponent 클래스
 실습예제
EventTest1.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
16장. 스윙
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
이벤트 패키지 포함
class ButtonEventTest extends JFrame implements ActionListener {
ActionListener인터페이스 포함
private JLabel result = new JLabel("");
이벤트 처리 결과를 저장할 JLabel 객체 생성
public ButtonEventTest() {
JButton male = new JButton("남자");
사용자 인터페이스
JButton female = new JButton("여자");
컴포넌트 생성
JLabel label = new JLabel("당신의 성별은? ");
Container ct = getContentPane();
프레임과 연관된 컨테이너 객체 생성
ct.setLayout(new FlowLayout());
컨테이너 객체에 레이아웃 설정 (FlowLayout)
ct.add(male);
컴포넌트를 컨테이너에 추가
ct.add(female);
ct.add(label);
ct.add(result);
male.addActionListener(this);
버튼(male) 객체에 이벤트 리스너를 등록
female.addActionListener(this);
버튼(female) 객체에 이벤트 리스너를 등록
14
2 컴포넌트에서의 이벤트 처리
1-2
JComponent 클래스
 실습예제
EventTest1.java
18
19
20
21
22
23
24
25
26
27
28
29
30
31
16장. 스윙
setTitle("ButtonEvent Test");
setSize(300,100);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public void actionPerformed(ActionEvent ae) {
result.setText(ae.getActionCommand());
}
이벤트 처리 루틴 작성
버튼의 이름을
읽어 라벨로 출력
}
public class EventTest1 {
public static void main(String args[]) {
new ButtonEventTest();
}
}
15
2 컴포넌트에서의 이벤트 처리
1-2
JComponent 클래스
 프로그램 설명
-
03
: 이벤트 처리를 하는 프로그램을 작성하기 위해 java.event.* 패키지를 포함하였다.
-
04
: GUI 구축을 위해 JFrame 클래스로부터 상속받아 클래스를 작성하였으며, 또한 이벤트를
처리하기 위해 ActionListener 인터페이스를 포함하여 클래스를 작성하였다. 사용자는 컴포넌
트에서 처리할 이벤트의 종류가 어떤 것인지를 판단하여 포함할 인터페이스를 결정하여야 한
다.
-
05
: JLabel 객체를 생성하였다. 이 클래스에 관해서는 다음 절에서 설명한다. 이 클래스는 문
자열을 나타내기 위한 객체이다. 여기서는 버튼을 누르면 그 결과를 나타내기 위해 사용한다.
메소드 밖에 private으로 선언하였다.
-
07~09
: GUI에서 필요한 컴포넌트 객체를 생성하였다. 두 개의 버튼 객체와 한 개의 라벨 객체
를 생성하였다.
16장. 스윙
-
10
: 생성한 프레임과 연관된 컨테이너 객체를 생성하였다.
-
11
: 컨테이너에 컴포넌트를 배치할 때 사용할 배치관리자를 FlowLayout으로 설정하였다.
-
12~15
: 컨테이너에 컴포넌트를 추가하였다.
16
2 컴포넌트에서의 이벤트 처리
1-2
JComponent 클래스
 프로그램 설명
-
16~17
: 두 개의 버튼에 이벤트 리스너를 등록하였다. 이벤트 리스너를 등록한다는 의미는 해
당 컴포넌트에서 등록한 이벤트가 발생하면 그것을 이벤트 처리 루틴에 보내어 처리한다는 의
미이다. 자바 프로그램에서 컴포넌트에서 발생된 이벤트를 처리하기 위해서는 반드시 컴포넌
트에 관련 이벤트 리스너를 등록하여야 한다.
-
23
: ActionListener 인터페이스에는 actionPerformed(ActionEvent ae) 메소드가 선언되어
있다. 이 메소드를 오버라이딩하여 이벤트 처리 루틴을 작성한다. 이 메소드는 ActionEvent 클
래스의 객체를 매개변수로 받아들이고 있다. 즉 JVM은 이벤트 리스너가 등록된 컴포넌트에써
이벤트가 발생하면, 관련 클래스로부터 객체를 생성하여 이벤트 처리 루틴에게 넘겨주게 된다.
이벤트 처리 루틴은 매개변수로 받은 이벤트 객체 정보를 이용하여 이벤트를 처리한다.
-
24
: getActionCommand() 메소드는 이벤트가 발생한 컴포넌트가 가진 레이블(버튼의 이름)
을 반환하는 메소드이다. 반환된 이름을 출력할 객체의 내용으로 설정하고 있다.
16장. 스윙
17
2 컴포넌트에서의 이벤트 처리
1-2
16장. 스윙
JComponent 클래스
18
3 이미지 아이콘(ImageIcon)과 라벨(Label)
 ImageIcon 클래스
-
이미지를 아이콘화하여 제공하는 클래스
 ImageIcon 클래스 생성자
형식
16장. 스윙
ImageIcon(String filname)
ImageIcon(URL url)
19
3 이미지 아이콘(ImageIcon)과 라벨(Label)
 ImageIcon 클래스의 메소드
메소드
설명
int getIconHeight()
아이콘의 높이를 픽셀 값으로 반환
int getIconWidth()
아이콘의 폭을 픽셀 값으로 반환
void paintIcon(Component comp,
Graphics g, int x, int y)
Graphics 객체 g의 x, y의 위치에 아이콘을 그린다. 아이콘을 그리는 작동에 대한
부가적인 정보는 comp에서 제공
16장. 스윙
20
3 이미지 아이콘(ImageIcon)과 라벨(Label)
 JLabel 클래스 생성자
JLabel(Icon i)
JLabel(String s)
JLabel(String s, Icon i, int align)
형식
 JLabel 클래스의 메소드
메소드
설명
Icon getIcon()
JLabel 객체가 가지고 있는 Icon 객체를 반환
String getText()
JLabel 객체가 가지고 있는 문자열을 문자열 객체로 반환
void setIcon(Icon i)
JLabel 객체에 i로 지정된 아이콘을 설정
void setText(String s)
JLabel 객체에 s로 지정된 문자열을 설정
16장. 스윙
21
3 이미지 아이콘(ImageIcon)과 라벨(Label)
 실습예제
JLabelTest1.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
16장. 스윙
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class JLabelDemo extends JFrame implements ActionListener {
ActionListener 인터페이스 포함
private JLabel result = new JLabel("");
public JLabelDemo() {
ImageIcon ii = new ImageIcon("korea.gif");
국기의 사진을 이용하여 ImageIcon 객체 생성
JButton korea = new JButton("클릭하세요", ii);
ImageIcon 객체를 이용하여
버튼 객체 생성
Container ct = getContentPane();
ct.setLayout(new FlowLayout());
ct.add(korea);
ct.add(result);
korea.addActionListener(this);
버튼(korea) 객체에
이벤트 리스너를 등록
setTitle("JLabel Test");
setSize(500,150);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
22
3 이미지 아이콘(ImageIcon)과 라벨(Label)
 실습예제
JLabelTest1.java
18
19
20
21
22
23
24
25
26
27
16장. 스윙
}
public void actionPerformed(ActionEvent ae) {
result.setText("세계에서 가장 좋은 한국 입니다");
}
문자열을 이벤트의 결과로
(JLabel 객체) 출력
}
public class JLabelTest1 {
public static void main(String[] args) {
new JLabelDemo();
}
}
23
3 이미지 아이콘(ImageIcon)과 라벨(Label)
 프로그램 설명
-
07
: 이 프로그램은 앞 절의 전형적인 이벤트 처리 프로그램과 동일한 형태이다. 다만 국기의
사진을 이용하여 ImageIcon 객체를 생성한 다음, 그 객체를 이용하여 버튼 객체를 생성하였다.
다른 부분은 앞 절의 프로그램 설명 부분을 참조하기 바란다.
16장. 스윙
24
4 텍스트 필드와 텍스트 에리어
 JTextField, JTextArea 클래스 생성자
형식
16장. 스윙
JTextField()
JTextField(int cols)
JTextField(Sting str, int cols)
JTextField(Sting str)
JTextArea()
JTextArea(String str)
JTextArea(int rows, int cols)
JTextArea(String str, int rows, int cols)
25
4 텍스트 필드와 텍스트 에리어
 실습예제
JTFandJTA.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
16장. 스윙
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class JTFandJTADemo extends JFrame implements ActionListener {
private JTextField jtf;
두 개의 텍스트 객체 선언
private JTextArea jta;
public JTFandJTADemo() {
jtf = new JTextField(20);
20개의 문자를 저장할 JTextField 객체 생성
jta = new JTextArea(7,20);
20개의 문자 7줄을 저장할 JTextArea 객체 생성
Container ct = getContentPane();
ct.setLayout(new FlowLayout());
ct.add( jtf);
ct.add( jta);
jtf.addActionListener(this);
텍스트 필드 객체에 이벤트 리스너 등록
setTitle("JTextField,JTextArea Test");
setSize(500,200);
26
4 텍스트 필드와 텍스트 에리어
 실습예제
JTFandJTA.java
17
18
19
20
21
22
23
24
25
26
27
28
29
16장. 스윙
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public void actionPerformed(ActionEvent ae) {
jta.append(ae.getActionCommand()+"\n");
jtf.setText("");
텍스트 필드를 clear
}
텍스트 에리어에 문자열을
추가(append())
}
public class JTFandJTA {
public static void main(String[] args) {
new JTFandJTADemo();
}
}
27
4 텍스트 필드와 텍스트 에리어
 프로그램 설명
-
06~16
: 두 개의 텍스트 관련 객체를 선언하였다. 이벤트 처리 루틴에서도 사용하기 때문에
메소드 외부에 private로 선언하였다.
-
08
: 20개의 문자를 저장할 수 있는 JTextField 객체를 생성하였다.
-
09
: 20개의 문자를 7줄로 나타낼 수 있는 JTextArea 객체를 생성하였다.
-
14
: 텍스트 필드에 입력한 내용을 텍스트 에리어에 나타내기 위해서는 텍스트 필드 이벤트
리스너를 등록해야 한다.
-
21
: 이벤트 처리 루틴에서 텍스트 필드에서 가져온 문자열을 텍스트 에리어에 첨가한다
. append() 메소드는 현재 텍스트 에리어에 추가하는 메소드이다.
-
16장. 스윙
22
: 텍스트 필드의 내용을 clear 한다.
28
4 텍스트 필드와 텍스트 에리어
16장. 스윙
29
5 버튼
 AbstractButton 클래스의 주요 메소드
메소드
설명
String getActionCommand()
버튼이 실행한 명령을 반환
void setActionCommand(String s)
버튼에 대해 새로운 실행 명령을 s로 설정
String getText()
버튼의 텍스트(버튼의 이름으로 지정) 반환
void setText(String text)
버튼의 텍스트를 text로 설정
Icon getIcon()
버튼의 묵시적 아이콘을 반환
void setIcon(Icon icon)
버튼의 묵시적 아이콘을 icon으로 설정
Icon getPressedIcon()
버튼이 눌러졌을 때 나타낼 아이콘을 반환
void setPressedIcon(Icon icon)
버튼이 눌러졌을 때 나타낼 아이콘을 icon으로 설정
Icon getRolloverIcon()
버튼 위로 마우스가 지나갈 때 나타낼 아이콘을 반환
void setRolloverIcon(Icon icon)
버튼 위로 마우스가 지나갈 때 나타낼 아이콘을 icon으로 설정
Boolean isSelected()
버튼의 상태(선택 : true, 비선택 : false)를 반환
void setSelected(Boolean b)
버튼의 선택 상태를 b로 설정
16장. 스윙
30
6 푸시 버튼
 JButton 클래스 생성자
형식
16장. 스윙
JButton(Icon i)
JButton(String s)
JButton(String s, Icon i)
31
6 푸시 버튼
 실습예제
JButtonTest1.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16장. 스윙
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class JButtonDemo1 extends JFrame {
public JButtonDemo1() {
ImageIcon korea = new ImageIcon("korea1.gif");
3개의 국기를 가지고 ImageIcon 객체 생성
ImageIcon usa = new ImageIcon("usa.gif");
ImageIcon germany = new ImageIcon("germany.gif");
JButton nat = new JButton(korea);
한국의 국기를 가지고 JButton 객체 생성
nat.setPressedIcon(usa);
버튼이 눌러졌을 때 나타낼 이미지 아이콘 설정
nat.setRolloverIcon(germany);
마우스가 지나갈 때(rollover) 나타낼 이미지 아이콘 설정
Container ct = getContentPane();
ct.add(nat);
setTitle("JButton Test1");
setSize(500,400);
32
6 푸시 버튼
 실습예제
JButtonTest1.java
16
17
18
19
20
21
22
23
24
16장. 스윙
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
}
public class JButtonTest1 {
public static void main(String[] args) {
new JButtonDemo1();
}
}
33
6 푸시 버튼
 프로그램 설명
-
06~08
: 3개의 국기를 가지고 ImageIcon 객체를 생성하였다.
-
10~11
: 버튼이 눌러졌을 때, 버튼이 지나갈 때를 지정하는 메소드를 사용하여 아이콘을 설정
하였다. 이 프로그램은 이벤트 처리 루틴이 없지만, AbstractButton 클래스의 메소드를 이용하
여 이벤트를 처리한 효과를 나타내고 있다.
16장. 스윙
34
6 푸시 버튼
 실습예제
JButtonTest2.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
16장. 스윙
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class JButtonDemo2 extends JFrame implements ActionListener {
JTextField jtf;
public JButtonDemo2() {
jtf = new JTextField(10);
ImageIcon 사과 = new ImageIcon("사과.jpg");
ImageIcon 바나나 = new ImageIcon("바나나.jpg"); 5개의 과일 사진으로
ImageIcon 감 = new ImageIcon("감.jpg");
ImageIcon 객체 생성
ImageIcon 배 = new ImageIcon("배.jpg");
ImageIcon 포도 = new ImageIcon("포도.jpg");
JButton jb1 = new JButton("사과",사과);
JButton jb2 = new JButton("바나나",바나나); 5개의 ImageIcon 객체를
사용하여 버튼 객체 생성
JButton jb3 = new JButton("감",감);
JButton jb4 = new JButton("배",배);
JButton jb5 = new JButton("포도",포도);
Container ct = getContentPane();
ct.setLayout(new GridLayout(3,2));
ct.add( jb1);
ct.add( jb2);
ct.add( jb3);
35
6 푸시 버튼
 실습예제
JButtonTest2.java
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
16장. 스윙
ct.add( jb4);
ct.add( jb5);
ct.add( jtf);
jb1.addActionListener(this);
jb2.addActionListener(this);
각 버튼에 이벤트 리스너 등록
jb3.addActionListener(this);
jb4.addActionListener(this);
jb5.addActionListener(this);
setTitle("JButton Test2");
setSize(250,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public void actionPerformed(ActionEvent ae) {
jtf.setText(ae.getActionCommand());
각 버튼이 가진 라벨을 텍스트 필드의
내용으로 설정
}
}
public class JButtonTest2 {
public static void main(String[] args) {
new JButtonDemo2();
}
}
36
6 푸시 버튼
 프로그램 설명
-
08~17
: 5개의 과일 사진으로 ImageIcon 객체를 생성하고, 생성된 ImageIcon 객체로 버튼 객
체를 생성하였다.
-
26~30
-
37
: 생성된 각 버튼에 이벤트 리스너를 등록하였다.
: 이벤트 처리 루틴에서 이벤트를 발생한 객체가 가진 문자열을(버튼의 이름) 텍스트 필드
의 내용으로 나타내었다.
16장. 스윙
37
7 체크박스
 JCheckBox 클래스 생성자
형식
JCheckBox(Icon i)
JCheckBox(Icon i, boolean state)
JCheckBox(String s)
JCheckBox(String s, boolean state)
JCheckBox(String s, Icon i)
JCheckBox(String s, Icon i, boolean state)
 JCheckBox 클래스의 메소드
메소드
void setSelected(boolean state)
16장. 스윙
설명
state를 true로 설정하면 체크박스가 처음 나타날 때 선택된 상태로 나타나
게 된다.
38
7 체크박스
 실습예제
JCheckBoxTest1.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
16장. 스윙
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class JCheckBoxDemo extends JFrame implements ItemListener {
JTextField jtf;
public JCheckBoxDemo() {
jtf = new JTextField(10);
JCheckBox jc1 = new JCheckBox("JSP");
JCheckBox jc2 = new JCheckBox("PHP");
JCheckBox jc3 = new JCheckBox("ASP");
JCheckBox jc4 = new JCheckBox("Servlet");
Container ct = getContentPane();
ct.setLayout(new FlowLayout());
ct.add( jc1);
ct.add( jc2);
ct.add( jc3);
ct.add( jc4);
ct.add( jtf);
체크박스의 이벤트 처리를 위해
ItemListener 포함
39
7 체크박스
 실습예제
JCheckBoxTest1.java
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
16장. 스윙
jc1.addItemListener(this);
jc2.addItemListener(this);
jc3.addItemListener(this);
jc4.addItemListener(this);
setTitle("JCheckBox Test1");
setSize(250,100);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public void itemStateChanged(ItemEvent ie) {
jtf.setText(((JCheckBox)ie.getItem()).getText());
}
이벤트를 발생시킨 객체의 이름을 출력
}
public class JCheckBoxTest1 {
public static void main(String[] args) {
new JCheckBoxDemo();
}
}
40
7 체크박스
 프로그램 설명
-
05 : 이 프로그램에서는 체크박스 컴포넌트를 사용하여 이벤트를 처리하고 있다. 체크박스 컴
포넌트의 이벤트를 처리하기 위해서는 ItemListener 인터페이스를 포함해야 한다. 각 컴포넌트
에서 발생 가능한 이벤트와 이벤트 처리를 위한 인터페이스의 선정 방법은 15장에서 설명하였
다.
-
29 : getItem() 메소드는 이벤트를 발생시킨 객체를 Object형으로 반환한다. Object형의 객체
는 하위 클래스의 어떠한 형으로도 형변환이 가능하다. 여기서는 Object형의 객체를
JCheckBox형으로 형변환하였다. getText() 메소드(AbstractButton 클래스 메소드)는 해당하는
객체의 문자열을 반환하는 메소드이다. 반환된 문자열을 텍스트 필드에 출력하고 있다.
16장. 스윙
41
7 체크박스
16장. 스윙
42
8 라디오 버튼
 JRadioButton 클래스 생성자
형식
JRadioButton(Icon i)
JRadioButton(Icon i, boolean state)
JRadioButton(String s)
JRadioButton(String s, boolean state)
JRadioButton(String s, Icon i)
JRadioButton(String s, Icon i, boolean state)
 ButtonGroup 클래스 생성자
형식
ButtonGroup()
 ButtonGroup 클래스 메소드
메소드
void add()
16장. 스윙
설명
버튼 그룹에 버튼을 추가한다. 버튼 그룹에 속한 버튼은 하나만 선택될 수 있다.
43
8 라디오 버튼
 실습예제
JRadioButtonTest1.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
16장. 스윙
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class JRadioButtonDemo extends JFrame implements ActionListener {
JTextField jtf;
public JRadioButtonDemo() {
jtf = new JTextField(10);
JRadioButton jr1 = new JRadioButton("승마");
JRadioButton
JRadioButton jr2 = new JRadioButton("골프");
클래스 객체 생성
JRadioButton jr3 = new JRadioButton("스킨스쿠바");
JRadioButton jr4 = new JRadioButton("페러글라이딩");
Container ct = getContentPane();
ct.setLayout(new FlowLayout());
ButtonGroup gb = new ButtonGroup();
버튼 그룹 객체 생성
44
8 라디오 버튼
 실습예제
JRadioButtonTest1.java
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
16장. 스윙
gb.add( jr1);
각 라디오 버튼을
gb.add( jr2);
하나의 그룹으로 만듦
gb.add( jr3);
gb.add( jr4);
ct.add( jr1);
ct.add( jr2);
ct.add( jr3);
ct.add( jr4);
ct.add( jtf);
jr1.addActionListener(this);
각 버튼에 이벤트
jr2.addActionListener(this);
리스너 등록
jr3.addActionListener(this);
jr4.addActionListener(this);
setTitle("JRadioButtonTest1");
setSize(350,100);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
45
8 라디오 버튼
 실습예제
JRadioButtonTest1.java
31
32
33
34
35
36
37
38
39
40
41
16장. 스윙
setVisible(true);
}
public void actionPerformed(ActionEvent ae) {
jtf.setText(ae.getActionCommand());
}
}
public class JRadioButtonTest1 {
public static void main(String[] args) {
new JRadioButtonDemo();
}
}
46
8 라디오 버튼
 프로그램 설명
16장. 스윙
-
08~11
-
14
-
15~18
: JRadioButton 클래스로부터 4개의 객체를 생성한다.
: 버튼을 하나의 그룹으로 만들기 위한 ButtonGroup 객체를 생성한다.
: 버튼 그룹 객체를 이용하여 각각의 라디오 버튼을 하나의 그룹으로 만든다.
47
9 콤보박스
 JComboBox 클래스 생성자
형식
JComboBox()
JComboBox(Vector v)
 ComboBox 클래스 메소드
메소드
void addItem(Object obj)
16장. 스윙
설명
콤보박스에 obj로 지정된 객체 항목을 추가한다.
48
9 콤보박스
 실습예제
JComboBoxTest1.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
16장. 스윙
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class JComboBoxDemo extends JFrame implements ItemListener {
이벤트 처리를 위해
ItemListener 포함
JLabel jl;
public JComboBoxDemo() {
jl = new JLabel(new ImageIcon("감.jpg"));
이미지를 이용하여 JLabel 객체 생성
JComboBox jc = new JComboBox();
JComboBox 객체 생성
Container ct = getContentPane();
ct.setLayout(new FlowLayout());
ct.add( jl);
컨터이너에 JLabel 객체 추가
jc.addItem("감");
콤보박스 객체에 아이템 추가
jc.addItem("바나나");
jc.addItem("배");
jc.addItem("사과");
jc.addItem("앵두");
jc.addItem("포도");
49
9 콤보박스
 실습예제
JComboBoxTest1.java
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
16장. 스윙
ct.add( jc);
컨테이너에 콤보박스 추가
콤보박스에 이벤트 리스너 등록
jc.addItemListener(this);
setTitle("JComboBox Test1");
setSize(350,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public void itemStateChanged(ItemEvent ie) {
String fruit = (String)ie.getItem();
getItem() 메소드를 이용하여 문자열 생성
jl.setIcon(new ImageIcon(fruit+".jpg"));
문자열과 연관된 이미지를 이용하여
JLabel 객체 설정
}
}
public class JComboBoxTest1 {
public static void main(String[] args) {
new JComboBoxDemo();
}
}
50
9 콤보박스
 프로그램 설명
-
04
: ComboBox 컴포넌트에서 발생되는 이벤트를 처리하기 위해 ItemListener를 포함하였다.
-
07
: 이미지 파일을 이용하여 ImageIcon 객체를 생성한 다음, 그 객체를 이용하여 Jlabel 객체
를 생성하였다.
-
08
: JComboBox 클래스로부터 객체를 생성하였다.
-
12~17
-
18 : 컨테이너에 콤보박스 객체를 추가하였다. 콤보박스는 6개의 아이템을 가지고 있다.
-
19
: 콤보박스 객체에 아이템을 추가하였다. 추가된 아이템은 문자열 객체이다.
: 콤보박스에서 발생하는 이벤트를 처리하기 위해 이벤트 리스너를 콤보박스 객체에 등록
하였다.
-
26
: ItemEvent 클래스의 getItem() 메소드를 이용하여 사용자에 의해 선택된 아이템의 문자
열을 가져온다. 15장의 ItemEvent 클래스 부분을 참조하기 바란다.
-
27
: 문자열을 이용하여 ImageIcon 객체를 생성한 다음, JLabel 객체의 값으로 설정하여 나타
낸다.
16장. 스윙
51
9 콤보박스
16장. 스윙
52
10 리스트
 JList 클래스 생성자
형식
JList()
JList(Object[] items)
 JList 클래스의 주요 메소드
메소드
int getSelectedIndex()
void setSelectedIndex(int index)
int[] getSelectedIndices()
void setSelectedIndices(int[] indices)
Object getSelectedValue()
Object[] getSelectedValues()
16장. 스윙
설명
리스트 중에서 첫 번째 선택된 아이템의 인덱스를 반환
index로 지정된 아이템을 선택
리스트 중에서 선택된 모든 아이템의 인덱스를 배열로 반환
indices 배열에서 지정된 아이템을 모두 선택
리스트 중에서 첫 번째 선택된 아이템을 Object 객체로 반환
리스트에서 선택된 모든 아이템을 Object 객체의 배열로 반환(인덱스 순서)
53
10 리스트
 실습예제
JListTest1.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16장. 스윙
import javax.swing.*;
import java.awt.*;
import javax.swing.event.*;
javax.swing.event.* 패키지 포함
class JListDemo extends JFrame implements ListSelectionListener {
private String[] fruitlist = {"감","바나나","사과","포도", "앵두","배"};
private JList jlst = new JList(fruitlist);
JList 객체 생성
private ImageIcon[] fruiticons = {
new ImageIcon("감.jpg"),
6개의 과일 사진을 이용하여
ImageIcon 객체 배열 생성,
new ImageIcon("바나나.jpg"),
이벤트 처리 루틴에서는 선택
new ImageIcon("사과.jpg"),
된 항목의 인덱스를 사용하여
new ImageIcon("포도.jpg"),
이미지를 나타냄
new ImageIcon("앵두.jpg"),
new ImageIcon("배.jpg")
};
JLabel 객체 배열 선언
private JLabel[] jlicon = new JLabel[6];
ListSelectionListener
인터페이스 포함
54
10 리스트
 실습예제
JListTest1.java
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
16장. 스윙
public JListDemo() {
JPanel p = new JPanel();
패널 객체 생성
p.setLayout(new GridLayout(3,2,5,5));
for (int i = 0 ; i < 6 ; i++ ){
p.add( jlicon[i] = new JLabel());
패널에 JLabel 객체 배열의
모든 항목 추가
}
Container c = getContentPane();
c.add( jlst, BorderLayout.WEST);
컨테이너에 JList와 패널 추가
c.add(p, BorderLayout.CENTER);
jlst.addListSelectionListener(this);
JList에 이벤트 리스너 등록
setTitle("JList Test1");
setSize(300,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
55
10 리스트
 실습예제
JListTest1.java
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
16장. 스윙
public void valueChanged(ListSelectionEvent lse) {
for (int i=1 ; i < 6 ; i++ ){
jlicon[i].setIcon(null);
모든 아이콘을 null 값으로 초기화
}
int[] indices = jlst.getSelectedIndices();
선택된 항목의 인덱스를 정수 배열로 생성
for (int j = 0 ; j < indices.length ; j++ ){
jlicon[ j].setIcon(fruiticons[indices[ j]]);
선택된 항목의 인덱스에
해당하는 이미지를 나타냄
}
}
}
public class JListTest1 {
public static void main(String[] args) {
new JListDemo();
}
}
56
10 리스트
 프로그램 설명
-
03 : ListSelectionListener 인터페이스와 ListSelectionEvent 클래스를 사용하기 위해서는
javax.swing.event.* 패키지에 포함시켜야 한다. 이 두 개의 인터페이스와 클래스는 이 패키지
에 선언되어 있기 때문이다.
-
04
: JList에서 발생하는 이벤트를 처리하기 위해서는 ListSelectionListener 인터페이스를 포
함시켜야 한다.
-
06
: 문자열 배열을 이용하여 JList 객체를 생성하였다.
-
07
: ImageIcon 객체 배열 생성
-
15
: 6개의 요소(각각이 JLabel 객체)를 가지는 JLabel 객체의 배열을 선언하였다.
-
17
: 선택된 과일 그림을 나타낼 패널 객체를 생성하였다.
-
18
: 패널에 레이아웃을 3행 2열로 설정하였다.
-
20
: 반복문을 통하여 6개의 JLabel 객체를 패널에 추가하였다. 지금 상태는 JLabel 객체가 아
무 값도 가지고 있지 않다. 이벤트 처리 루틴에서 JLabel 객체에 이미지를 나타내는 setIcon() 메
소드를 이용하여 선택된 과일 그림만 나타낼 것이다.
16장. 스윙
23~24
: 컨테이너에 JList와 패널을 왼쪽과 가운데에 추가하였다.
57
10 리스트
 프로그램 설명
-
25
: JList 객체에 이벤트 리스너(ListSelectionListener)를 등록하였다.
-
31
: 이벤트 처리 루틴으로 ListSelectionListener 인터페이스에 선언된 valueChanged(List-
SelectionEvent lse) 메소드를 오버라이딩하였다. 일반적으로 이벤트 처리 루틴에서는 매개변
수로 받은 객체의 메소드를 이용하여 이벤트를 처리하는데, 이 프로그램의 매개변수로 받은
ListSelectionEvent 객체를 사용하지 않는다.
-
33
: 모든 아이콘을 null 값으로 초기화시킨다. 즉 사용자가 이 프로그램을 계속 작동시키면,
이벤트가 발생할 때마다 선택된 부분을 나타내기 위해서는 전에 나타낸 그림을 초기화시켜야
한다.
-
35
: getSelectedIndices() 메소드는 JList 클래스에 선언된 메소드이다. 이 메소드는 선택된 항
목의 인덱스를 정수 배열로 반환하는 메소드이다. 즉 사용자에 의해 선택된 모든 항목의 인덱스
가 정수 배열로 반환되게 된다.
-
37
: 선택된 항목의 인덱스에 해당하는 이미지를 나타낸다. 예를 들어 현재 2개의 항목이 선택
되었다면, 선택된 항목의 이미지 아이콘이 JLabel[0], JLabel[1]에 설정되어 나타나게 된다.
16장. 스윙
58
10 리스트
16장. 스윙
59
11 스크롤 바
 JScrollPane 클래스 생성자
형식
JScrollPane(Component comp)
JScrollPane(int vsb, int hsb)
JScrollPane(Component comp, int vsb, int hsb)
 vsb와 hsb는 수직, 수평 스크롤 바를 설정하기 위해 사용되는 상수로서 다음
과 같은 상수가 사용됨
-
HORIZONTAL_SCROLLBAR_ALWAYS : 항상 수평 스크롤 바를 제공
-
HORIZONTAL_SCROLLBAR_AS_NEEDED : 필요한 경우(패널의 크기를 넘어서는 경우)에만
수평 스크롤 바 제공
16장. 스윙
-
VERTICAL_SCROLLBAR_ALWAYS : 항상 수직 스크롤 바를 제공
-
VERTICAL_SCROLLBARAS_NEEDED : 필요한 경우에만 수직 스크롤 바 제공
60
11 스크롤 바
 실습예제
JScrollPaneTest1.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
16장. 스윙
import javax.swing.*;
import java.awt.*;
class JScrollPaneDemo extends JFrame {
public JScrollPaneDemo() {
JPanel jp = new JPanel();
JPanel 객체를 생성
jp.setLayout(new GridLayout(20,5));
JPanel 객체를 생성
Container ct = getContentPane();
int b = 1;
for (int i = 1 ; i <=10 ; i++ ) {
for (int j = 1 ; j <=10 ; j++ ) {
jp.add(new JButton(b + "번"));
두 개의 반복문으로 100개의
버튼 객체 생성
b++;
}
}
61
11 스크롤 바
 실습예제
JScrollPaneTest1.java
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
16장. 스윙
int v =
ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED;
객체 생성을 위한 상숫값 지정
int h =
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED;
JScrollPane jsp = new JScrollPane( jp, v, h);
JScrollPane 객체를
생성(스크롤 바 포함)
ct.add( jsp, BorderLayout.CENTER);
setTitle("JScrollPaneTest1");
setSize(300,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
}
public class JScrollPaneTest1 {
public static void main(String[] args) {
new JScrollPaneDemo();
}
}
62
11 스크롤 바
 프로그램 설명
-
05
: JPanel 객체를 생성하였다.
-
06
: 생성된 패널 객체에 레이아웃으로 20행 5열로 배치하는 레이아웃을 설정하였다.
-
11
: 두 개의 반복문을 사용하여 패널에 100개의 버튼 객체를 생성하여 추가하였다.
-
15~18
: 객체 생성을 위한 상숫값을 지정하였다. 객체가 패널의 크기보다 크면 자동적으로 스
크롤 바가 나타나도록 설정하였다.
-
16장. 스윙
19
: JScrollPane 객체를 생성하였다.
63
11 스크롤 바
16장. 스윙
64
12 그룹 홀더
 JTabbedPane 클래스 생성자
형식
JTabbedPane()
 그룹 홀더 메소드
메소드
void addTab
(String str,Component comp)
설명
그룹 홀더에 각각의 그룹들을 추가한다. 위 메소드에서 str은 홀더
의 제목을 의미하고, comp는 Component 객체로서 폴더의 내용을
가지고 있는 객체이다.
 그룹 홀더를 사용하기 위한 일반적인 과정
16장. 스윙
-
JTabbedPane 클래스를 이용하여 그룹 홀더 객체를 생성
-
그룹 홀더에 추가할 각각의 홀더 객체를 JPanel 클래스를 이용하여 작성
-
생성된 JPanel 객체를 JTabbedPane 객체에 추가(addTab() 메소드 이용)
-
모든 홀더가 완성될 때까지 1-3번을 반복
-
완성된 그룹 홀더를 프레임에 추가
65
12 그룹 홀더
 실습예제
JTabbedPaneTest1.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
16장. 스윙
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
이벤트 처리를 위해 리스너 포함
class RadioPanel extends JPanel implements ActionListener {
JLabel jl1 = new JLabel("당신의 성별은? ");
JLabel jl2 = new JLabel("");
public RadioPanel() {
JRadioButton jrb1 = new JRadioButton("남자");
JRadioButton jrb2 = new JRadioButton("여자");
add( jl1);
add( jl2);
add( jrb1);
add( jrb2);
jrb1.addActionListener(this);
컴포넌트에 이벤트 리스너 등록
jrb2.addActionListener(this);
}
public void actionPerformed(ActionEvent ae) {
이벤트 처리 루틴
66
12 그룹 홀더
 실습예제
JTabbedPaneTest1.java
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
16장. 스윙
String s = ae.getActionCommand();
jl2.setText(s);
}
}
class ComboPanel extends JPanel implements ItemListener {
JLabel jl1 = new JLabel("당신의 혈액형은? ");
JLabel jl2 = new JLabel("");
public ComboPanel() {
JComboBox jcb = new JComboBox();
jcb.addItem("A형");
jcb.addItem("B형");
jcb.addItem("AB형");
jcb.addItem("O형");
add( jl1);
add( jl2);
add( jcb);
jcb.addItemListener(this);
이벤트 처리를 위해 리스너 포함
67
12 그룹 홀더
 실습예제
JTabbedPaneTest1.java
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
16장. 스윙
}
public void itemStateChanged(ItemEvent ie) {
Object s = ie.getItem();
jl2.setText(s.toString());
}
이벤트 처리 루틴
}
class JTabbedPaneFrame extends JFrame {
public JTabbedPaneFrame() {
JTabbedPane jtp = new JTabbedPane();
JTabbedPane 객체 생성
RadioPanel rp = new RadioPanel();
ComboPanel cp = new ComboPanel();
jtp.addTab("성별", rp);
성별 패널을 JTabbedPane 객체에 추가
jtp.addTab("혈액형", cp);
혈액형 패널을 JTabbedPane 객체에 추가
getContentPane().add( jtp);
JTabbedPane 객체를 컨테이너에 추가
setTitle("JTabbedPaneTest1");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(500,150);
68
12 그룹 홀더
 프로그램 설명
-
04-40
: 두 개의 패널 객체를 생성하였다. 패널에서 처리할 이벤트 리스너를 포함하여 작성하
였으며, 각각의 패널에서 이벤트 처리 루틴을 작성하였다.
16장. 스윙
-
43
: JTabbedPane 객체를 생성하였다.
-
46~47
-
48
: addTab() 메소드를 이용하여 두 개의 패널 객체를 JTabbedPane 객체에 추가하였다.
: JTabbedPane 객체를 프레임의 컨테이너 객체에 추가하였다.
69
12 그룹 홀더
16장. 스윙
70
13 테이블
 JTable 클래스 생성자
형식
JTable(Object data[][], Object colHeads[])
 테이블을 사용하기 위한 절차
16장. 스윙
-
JTable 객체를 생성
-
생성된 JTable 객체를 이용하여 JScrollPane 객체를 생성
-
프레임의 컨테이너에 JScrollPane 객체를 추가
71
13 테이블
 실습예제
JTableTest1.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16장. 스윙
import javax.swing.*;
import java.awt.*;
class JTableDemo extends JFrame {
public JTableDemo() {
Container c = getContentPane();
c.setLayout(new BorderLayout());
String[] colHeads = { "학과", "학번", "이름" };
테이블의 내용을 작성
Object[][] data = {
{ "IT응용공학전공", "201095029", "김지연" },
{ "컴퓨터응용공학전공", "201195007", "김대연"
{ "인터넷응용공학전공", "201195072", "이현덕"
{ "멀티미디어공학전공", "201096041", "김기창"
{ "IT응용공학전공", "201198001", "이명찬" },
{ "정보통신공학전공", "201198074", "강재근" },
{ "인터넷응용공학전공", "201195012", "임자용"
테이블의 헤더를 작성
},
},
},
},
72
13 테이블
 실습예제
JTableTest1.java
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
16장. 스윙
{
{
{
{
{
{
"멀티미디어공학전공", "201196025", "문정숙" },
"IT응용공학전공", "201198016", "하종섭" },
"데이타베이스공학전공", "201197011", "안진숙" },
"IT응용공학전공", "201198009", "서은실" },
"데이타베이스공학전공", "201197008", "장희숙" },
"멀티미디어공학전공", "201196033", "장현석" }
};
헤더와 내용으로 JTable 객체 생성
JTable table = new JTable(data, colHeads);
int v =
ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED;
int h =
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED;
JScrollPane jsp = new JScrollPane(table, v, h);
JTable 객체를 이용하여 JScrollPane 객체를 생성
c.add( jsp, BorderLayout.CENTER);
프레임의 컨테이너에 JScrollPane 객체를 추가
setTitle("JTableTest1");
73
13 테이블
 실습예제
JTableTest1.java
31
32
33
34
35
36
37
38
39
40
16장. 스윙
setSize(400,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
}
public class JTableTest1 {
public static void main(String[] args) {
new JTableDemo();
}
}
74
13 테이블
 프로그램 설명
-
07
: 테이블의 헤더를 작성하기 위해 문자열의 배열을 생성한다.
-
08
: 테이블의 내용을 작성하기 위해 Object 클래스의 2차원 배열을 생성한다. Object 클래스
의 내용으로는 어떤 형태의 객체도 삽입할 수 있다.
-
23
: 헤더와 내용으로 JTable 객체를 생성한다.
-
28
: JTable 객체를 이용하여 JScrollPane 객체를 생성한다. 즉 테이블에 스크롤을 붙인 형태가
된다.
-
29
: 프레임의 컨테이너에 JScrollPane 객체를 추가시키면, 테이블에 컨테이너에 추가된 형태
가 된다.
16장. 스윙
75
13 테이블
16장. 스윙
76
14 메뉴
 메뉴 관련 클래스
-
JMenuBar, JMenu, JMenuItem, JCheckBoxMenuItem, JradioButtonMenuItem 등
 스윙의 메뉴의 작성 순서
16장. 스윙
-
JMenuBar 객체를 생성
-
메뉴바에 나타낼 JMenu 객체를 생성
-
각각의 메뉴에 매달리는 서브 메뉴를 JMenuItem 객체로 생성하여 메뉴에 추가
-
메뉴가 완성될 때까지 2-3번을 반복
-
메뉴가 완성되면 모든 메뉴를 JMenuBar에 추가
-
setJMenuBar() 메소드를 이용하여 메뉴바를 프레임에 추가
77
14 메뉴
 실습예제
JMenuTest1.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
16장. 스윙
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
class JMenuDemo extends JFrame implements ActionListener {
이벤트 처리를 위한 리스너 포함
JTextField jtf;
public JMenuDemo() {
Container c = getContentPane();
c.setLayout(new BorderLayout());
JMenuBar jmb = new JMenuBar();
이벤트 처리를 위한 리스너 포함
JMenu menu1 = new JMenu("파일");
각 메뉴 객체 생성
JMenu menu2 = new JMenu("편집");
JMenuItem jmi = new JMenuItem("새파일");
서브 메뉴를 위한 JMenuItem 객체 생성
jmi.addActionListener(this);
서브 메뉴에 리스너 등록
menu1.add( jmi);
서브 메뉴를 메뉴에 추가
jmi = new JMenuItem("저장하기");
jmi.addActionListener(this);
menu1.add( jmi);
jmb.add(menu1);
메뉴바에 메뉴 추가
78
14 메뉴
 실습예제
JMenuTest1.java
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
16장. 스윙
jmi = new JMenuItem("열기");
서브 메뉴 작성 및 추가
jmi.addActionListener(this);
menu2.add( jmi);
jmi = new JMenuItem("잘라내기");
jmi.addActionListener(this);
menu2.add( jmi);
jmi = new JMenuItem("복사");
jmi.addActionListener(this);
menu2.add( jmi);
이벤트 처리를 위한 리스너 포함
JCheckBoxMenuItem jcbmi = new JCheckBoxMenuItem("눈금자");
jcbmi.addActionListener(this);
menu2.add( jcbmi);
JRadioButtonMenuItem jrbmb =
new JRadioButtonMenuItem("수정가능상태");
jrbmb.addActionListener(this);
menu2.add( jrbmb);
jmb.add(menu2);
메뉴바에 메뉴 추가
setJMenuBar( jmb);
메뉴를 프레임에 추가
79
14 메뉴
 실습예제
JMenuTest1.java
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
16장. 스윙
jtf = new JTextField();
이벤트 결과를 나타낼 텍스트 박스 생성
c.add( jtf, BorderLayout.SOUTH);
setTitle("JMenuTest1");
setSize(300,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public void actionPerformed(ActionEvent ae) {
jtf.setText(ae.getActionCommand());
}
}
public class JMenuTest1 {
public static void main(String[] args) {
new JMenuDemo();
}
}
80
14 메뉴
 프로그램 설명
-
04
: 이벤트 처리하기 위해 ActionListener를 포함시켜 클래스를 작성한다.
-
09
: JMenuBar 클래스를 이용하여 메뉴바 객체를 생성한다.
-
10~11
: 메뉴바에 나타낼 각 메뉴 객체를 JMenu 클래스를 이용하여 생성한다.
-
12~14
: 서브 메뉴를 위한 JMenuItem 객체를 생성하고, 그 객체에서의 이벤트를 처리하기 위
한 리스너를 등록한다. 생성된 메뉴 아이템 객체를 1011에서 생성된 메뉴 객체에 추가한다. 위
와 같은 부분이 메뉴가 완성될 때까지 반복된다.
-
18
: 메뉴가 완성되면 메뉴바에 메뉴를 추가한다.
-
36
: 다 작성된 메뉴바를 프레임에 추가한다. setJMenuBar() 메소드는 JFrame 클래스에서 제
공되는 메소드이다. 프레임의 메뉴바를 나타낸다. 메뉴바는 메뉴를 가지고 있고, 메뉴는 메뉴
아이템을 가지고 있어, 모든 메뉴가 나타나게 된다.
-
37
: 메뉴가 선택되었을 때(이벤트 발생) 그 메뉴를 나타낼 텍스트 박스를 생성하였다. 이벤트
처리 루틴에서 사용한다.
16장. 스윙
81
14 메뉴
16장. 스윙
82
 학습정리
 스윙(Swing) 컴포넌트
① javax.swing 패키지는 가장 상위 클래스로 JComponent 클래스를 가진다. 그 의미는
JComponent 클래스에 제공되는 모든 메소드를 사용할 수 있다는 의미이다.
② JComponent 클래스는 java.awt 패키지의 Component, Container 클래스를 상위 클
래스로 가진다.
 컴포넌트에서의 이벤트 처리
컴포넌트에서 전형적인 이벤트 처리는 다음과 같은 순서로 이루어진다.
① 받아들일 이벤트와 연관된 인터페이스를 사용하여 클래스 생성
② GUI 구축을 위한 컴포넌트 객체를 생성
③ 이벤트를 받아들인 컴포넌트 객체(여기서는 버튼 객체)에 리스너를 등록
④ add() 메소드를 사용하여 컴포넌트를 패널(또는 프레임)에 추가
⑤ 이벤트를 처리할 이벤트 처리 루틴 작성(예 : action 이벤트)
83
 학습정리
 스윙 컴포넌트의 사용과 이벤트 처리
① 다양한 컴포넌트를 사용하여 사용자 인터페이스를 구축할 수 있다.
② 대부분의 컴포넌트에서 이벤트 처리는 같은 형태로 처리된다.
③ 이벤트를 처리하기 위해서는 우선 컴포넌트에서 발생하는 이벤트가 어떤 종류가
있는지를 판별해야 하고, 그 종류의 이벤트를 처리하기 위해서 사용하는 이벤트 리
스너를 선택해야 한다.
④ 이벤트를 처리할 클래스를 작성할 때에는 선별된 이벤트 리스너를 포함하여 작성
하여야 하며, 리스너 인터페이스에서 선언된 모든 메소드를 오버라이딩하여 이벤트
처리 루틴을 작성하여야 한다.
84
16장. 스윙
85