JAVA의 GUI 기초, awt, swing 작성 절차, 컨테이너와 컴포넌트, 배치 관리자
학습 목표
1. JAVA의 GUI
■ 그래픽 사용자 인터페이스
✓ Graphical User Interface, 간단히 GUI
- 사용자가 편리하게 입출력할 수 있도록 그래픽으로 화면을 구성하고, 마우스나 키보드로 입력받을 수 있도록 지원하는 사용자 인터페이스
✓ 자바 언어에서 GUI 프로그램 작성
- 컴포넌트들로 구성
■ 자바 GUI 특징
✓ 강력한 GUI 컴포넌트 제공
✓ 쉬운 GUI 프로그래밍
■ 자바의 GUI 프로그래밍 방법
✓ GUI 컴포넌트 이용
- AWT 패키지와 Swing 패키지
- AWT
. java.awt패키지
- Swing
.javax.swing 패키지
- JavaFX
. JAVA 11에서 제거 (CORBA, Java EE, Java FX, 애플릿, 자바 웹 스타트 기능)
GUI | 설명 |
AWT | AWT는 운영 체제가 제공하는 자원을 이용하여서 컴포넌트를 생성 |
Swing | 컴포넌트가 자바로 작성되어 있기 때문에 어떤 플랫폼에서도 일관된 화면 작성 가능 |
■ Swing 컴포넌트 예시
- JButton
- JCheckBox
- JRadioButton
- JTextField
- JPassewordField
- JTextArea
- JComboBox
- JList
- JProgeressBar
- JTooTip
- JScrollPane
- JMenu
- JDialog
- JFrame
이 밖에도 JApplet, JTable, JTree, JEditorPane, JTextPane, JToolBar, JSplitPane, JTabbedPane 등 여러 가지의 컴포넌트가 있다.
■ Swing의 특징
✓ 스윙 GUI 컴포넌트
- 형식화된 텍스트 입력이나 패스워드 필드 동작과 같은 복잡한 기능들이 제공
✓ 자바 2D API
- 그림이나 이미지, 애니메이션 기능을 제공
- 교체 가능한 룩앤필(Look-and-Feel) 지원
✓ 데이터 전송
- 자르기, 복사, 붙이기, 드래그 앤 드롭 등의 데이터 전송 기능 제공
대부분의 프로그램은 스윙 API 중에서 아주 작은 부분 집합만을 사용한다. 따라서 대부분의 경우 다음의 두 가지 패키지만 포함하면 된다.
* javax.swing
* javax.swing.event
■ 컨테이너와 컴포넌트
✓ 컨테이너
- 다른 컴포넌트를 포함할 수 있는 GUI 컴포넌트
- 다른 컨테이너에 포함될 수 있음
. AWT 컨테이너: Panel, Frame, Applet, Dialog, Window
. Swing 컨테이너: JPanel, JFrame, JApplet, JDialog, JWindow
✓ 컴포넌트
- 컨테이너에 포함되어야 비로소 화면에 출력될 수 있는 GUI 객체
- 다른 컴포넌트를 포함할 수 없는 순수 컴포넌트
- 모든 GUI 컴포넌트가 상속받는 클래스: java.awt.Compnent
- 스윙 컴포넌트가 상속받는 클래스: javax.swing.JComponent
■ GUI 작성 절차
1) 컨테이너를 생성한다.
2) 컴포넌트를 추가한다.
GUI 작성 절차를 코드로 보도록 하자.
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
|
package practice;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
public class MyFrame extends JFrame {
//생성자
public MyFrame() {
setSize(300, 200); //크기 설정
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("프레임 작성예시");
setLayout(new FlowLayout()); //배치 관리자 설정
JButton button = new JButton("버튼");
//컴포넌트 생성 및 추가
this.add(button);
setVisible(true);
}
public static void main(String[] args) {
new MyFrame();
}
}
|
cs |
2. 기초 컨테이너와 컴포넌트
■ JFrame 컨테이너 클래스
✓ Swing 클래스 계층구조
- Component
. 화면에 표시되어서 사용자와 상호 작용하는 시각적인 객체를 나타냄.
- Container
. 내부에 다른 컴포넌트를 추가할 수 있는 기능을 제공
. 이 클래스의 add()를 사용하면 컨테이너 안에 컴포넌트를 추가
- Window
. 경계선, 타이틀 바, 버튼을 가지고 있는 윈도우를 정의
- Frame
. 자바 GUI 애플리케이션의 기초(AWT)
- JFrame
. Frame 클래스를 스윙의 출시에 맞추어 변경
✓ 중요한 메소드
- setLocation(x, y), setBounds(x, y, width, height), setSize(width, height) // 프레임의 위치와 크기를 설정
- setIconImage(IconImage) // 윈도우 시스템에 타이틀 바, 태스크 스위처에 표시할 아이콘을 알려줌
- setTitle() //타이틀 바의 제목 변경
- setResizable(boolean) //사용자가 크기를 조절할 수 있는지를 설정
ContentPane과 JFrame의 예제
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
32
33
34
|
package practice;
import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
public class ContentPaneEx extends JFrame {
public ContentPaneEx() {
setTitle("ContentPane과 JFrame 예제"); //프레임 타이틀
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = getContentPane(); // 컨텐트팬 알아내기
contentPane.setBackground(Color.orange); // 배경색 : oragne
contentPane.setLayout(new FlowLayout()); // 컨텐트팬에 FlowLayout 배치관리자 달기
contentPane.add(new JButton("OK")); // OK버튼
contentPane.add(new JButton("Cancel")); // Cancel 버튼
contentPane.add(new JButton("Ignore")); // Ignore 버튼
setSize(300, 150); // 프레임 크기 300 x 150
setVisible(true); // 화면에 프레임 출력
}
public static void main(String[] args) {
new ContentPaneEx();
}
}
|
cs |
18번째 줄의 FlowLayout의 배치 관리자는 컴포넌트를 순서대로 부착하는 일을 맡은 객체이다.
✓ 스윙 응용프로그램의 종료
- System.exit(0); //언제 어디서나 무조건 종료, 응용 프로그램 내에서 스스로 종료
- 프레임의 오른쪽 상단의 종료 버튼(x)이 클릭되면?????
---> 프레임 종료, 프레임 윈도우를 닫음(프레임이 화면에서 보이지 않게 됨)
But 프레임이 보이지 않게 되지만 응용프로그램이 종료한 것 아님
---> 키보드나 마우스 입력을 받지 못함
---> 다시 setVisible(true)를 호출하면, 보이게 되고 이전처럼 작동함
이를 해결하기 위해 프레임 종료 버튼이 클릭될 때, 프레임과 함께 프로그램을 종료시키는 방법이
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 를 사용하는 것이다.
■ 기초 컴포넌트
- 레이블(label)
- 버튼(button)
- 텍스트 필드(TextField)
✓ 레이블(label)
- 편집이 불가능한 텍스트를 표시
ex) JLabel label = new JLabel("Hello World");
✓ 버튼(Button)
- 편집이 불가능한 텍스트를 표시
ex) JButton btn = new JButton("클릭");
버튼의 종류
- JButton
- JCheckBox
- JRadioButton
✓ 텍스트 필드(TextField)
- 입력이 가능한 한 줄의 텍스트 필드
ex) JTextField text = new JTextField(20);
텍스트 필드의 종류
- JTextField // 기본적인 텍스트 필드
- JFormattedTextField // 사용자가 입력할 수 있는 문자를 제한
- JPasswordField // 사용자가 입력하는 내용이 보이지 않음
- JComboBox // 사용자가 직접 입력할 수도 있지만 항목 중에서 선택할 수 있음
- Jspinner // 텍스트 필드와 버튼이 조합된 것
3. 배치 관리자
■ 컨테이너와 배치 개념
✓ 컴포넌트는 컨테이너에 부착되지 않으면 화면상 나타날 수 없음
✓ 컨테이너마다 하나의 배치 관리자가 존재하며, 삽입되는 모든 컴포넌트의 위치와 크기를 결정하고 적절히 배치
✓ 컨테이너의 크기가 변하면 내부 컴포넌트들의 위치와 크기를 모두 재 조절하고 재배치해야 함
■ 배치 관리자 대표 유형 3가지
AWT와 스윙의 컨테이너 | 디폴트 배치관리자 |
Window | BorderLayout |
Frame, JFrame | BorderLayout |
Dialog, JDialog | BorderLayout |
Panel, JPanel | FlowLayout |
Applet, JApplet | FlowLayout |
JPanel 패널에 BorderLayout 배치 관리자를 설정하는 예시
JPanel p = new JPanel();
p.setLayout(new BorderLayout());
■ FlowLayout 배치 관리자
✓ 배치관리자를 지정하지 않으면 묵시적으로 FlowLayout으로 지정한다.
✓ 컴포넌트를 수평 방향으로 배치하는 관리자
- 왼쪽에서 오른쪽, 위에서 아래로 순차적으로 배열
- if) 한 줄에 모두 배치하지 못한다면 다음 줄에 연속하여 배열
✓ 생성자
- FlowLayout()
- FlowLayout(int align)
- FlowLayout(int align, int hgap, int vgap)
align: 정렬 방식
ex) LEFT, CENTER, RIGHT
hgap, vgap: 컴포넌트 사이의 수직, 수평 간격을 지정하는 값 --> 픽셀 단위
FlowLayoutEx.java
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
32
33
34
|
package practice;
import java.awt.Container;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
public class FlowLayoutEx extends JFrame {
public FlowLayoutEx() {
setTitle("FlowLayout 예제");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = getContentPane();
contentPane.setLayout(new FlowLayout(FlowLayout.LEFT, 30, 40));
contentPane.add(new JButton("버튼 1"));
contentPane.add(new JButton("버튼 2"));
contentPane.add(new JButton("버튼 3"));
contentPane.add(new JButton("버튼 4"));
contentPane.add(new JButton("버튼 5"));
contentPane.add(new JButton("버튼 6"));
setSize(300, 200);
setVisible(true);
}
public static void main(String[] args) {
new FlowLayoutEx();
}
}
|
cs |
■ BorderLayout 배치 관리자
✓ 컴포넌트를 추가할 때 방향을 지정하여 추가할 수 있는 기능을 제공
✓ 배치 방향: 동, 서, 남, 북, 중앙
- East(LINE_END), West(LINE_START)
- South(PAGE_END), North(PAGE_START), Center
✓ 배치 방법
- add(Component comp, int index) //comp를 index의 공간에 배치
✓ 생성자
- BorderLayout()
- BorderLayout(int hGap, int vGap)
✓ add() 메소드
- void add(Component comp, int index)
BorderLayoutEx.java
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
32
33
|
package practice;
import java.awt.BorderLayout;
import java.awt.Container;
import javax.swing.JButton;
import javax.swing.JFrame;
public class BorderLayoutEx extends JFrame {
public BorderLayoutEx() {
setTitle("FlowLayout 예제");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = getContentPane();
contentPane.setLayout(new BorderLayout(30, 20));
contentPane.add(new JButton("버튼 1"), BorderLayout.CENTER);
contentPane.add(new JButton("버튼 2"), BorderLayout.NORTH);
contentPane.add(new JButton("버튼 3"), BorderLayout.SOUTH);
contentPane.add(new JButton("버튼 4"), BorderLayout.EAST);
contentPane.add(new JButton("버튼 5"), BorderLayout.WEST);
setSize(300, 200);
setVisible(true);
}
public static void main(String[] args) {
new BorderLayoutEx();
}
}
|
cs |
■ GridLayout 배치 관리자
✓ 컴포넌트를 행과 열을 가진 배열 형태로 배치
✓ 컨테이너 공간을 동일한 사각형 격자(그리드)로 분할하고 각 셀에 컴포넌트 하나씩 배치
- 생성자에 행수와 열수 지정
- 셀에 왼쪽에서 오른쪽으로, 다시 위에서 아래로 순서대로 배치
✓ 생성자
- GridLayout()
- GridLayout(int row, int cols)
- GridLayout(int rows, int cols, int hgap, int vgap)
rows, cols: 배치할 행과 열(Default: 1)
hgap, vgap: 컴포넌트 사이의 간격, 픽셀 단위
----> rows x cols 만큼의 셀을 가진 격자로 컨테이너 공간을 분할 배치
GridLayoutEx.java
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
32
33
34
|
package practice;
import java.awt.Container;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
public class GridLayoutEx extends JFrame {
public GridLayoutEx() {
setTitle("GridLayout 예제");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = getContentPane();
contentPane.setLayout(new GridLayout(1, 10));
for(int i=0; i<10; i++) {
String text = Integer.toString(i);
JButton btn = new JButton(text);
this.add(btn);
}
setSize(300, 200);
setVisible(true);
}
public static void main(String[] args) {
new GridLayoutEx();
}
}
|
cs |
■ 배치 관리자 선택 기준
✓ 컴포넌트를 가능한 크게 나타내고 싶은 경우
- GridLayout, BorderLayout 사용
✓ 몇 개의 컴포넌트를 자연스러운 크기로 한줄로 나타내고 싶은 경우
- FlowLayout
✓ 몇개의 컴포넌트를 행과 열로 동일한 크기로 나타내고 싶은 경우
- GridLayout
■ 절대 위치로 배치하기
✓ 배치 관리자가 없는 컨테이너에 컴포넌트를 삽입할 때
- 프로그램에서 컴포넌트의 절대 크기와 위치 설정
- 컴포넌트들이 서로 겹치게 할 수 있음
✓ 컴포넌트의 크기와 위치 설정 메소드
- void setSize(int width, int height) // 컴포넌트 크기 설정
- void setLocation(int x, int y) // 컴포넌트 위치 설정
- void setBounds(int x, int y, int width, int height) // 위치와 크기 동시 설정
NullCotainerEx.java
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
32
33
34
35
36
37
38
39
40
41
|
package practice;
import java.awt.Container;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class NullContainerEx extends JFrame {
public NullContainerEx() {
setTitle("배치관리자 없이 절대 배치");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = getContentPane();
contentPane.setLayout(null);
JLabel la = new JLabel("Yoon's Dev!");
la.setLocation(130, 50);
la.setSize(200, 20);
this.add(la);
// 9개의 버튼 컴포넌트 생성하고 동일한 크기로 설정, 위치는 겹치게
for(int i=0; i<10; i++) {
JButton btn = new JButton(Integer.toString(i));
btn.setLocation(i*15, i*15);
btn.setSize(50, 20);
this.add(btn);
}
setSize(300, 200);
setVisible(true);
}
public static void main(String[] args) {
new NullContainerEx();
}
}
|
cs |
'Language > JAVA' 카테고리의 다른 글
[JAVA] 문자(Text) 스트림, 버퍼(Buffer) 스트림, File 클래스 | Yoon's Dev (0) | 2021.04.26 |
---|---|
[JAVA] JAVA의 입출력, 바이트 스트림(ByteStream) | Yoon's Dev (0) | 2021.04.24 |
[JAVA] JAVA의 입출력 스트림(Stream) | Yoon's Dev (0) | 2021.04.23 |
[JAVA] JAVA의 람다식 사용법 및 다양한 작성 예제 | Yoon's Dev (1) | 2021.04.21 |
[JAVA] JAVA의 5가지 리스너 이벤트 처리 방법 (독립, 내부, 프레임, 익명, 람다식) | Yoon's Dev (0) | 2021.04.20 |