Language/JAVA

[JAVA] JAVA의 GUI 기초, awt, swing 작성 절차, 컨테이너와 컴포넌트, 배치 관리자 | Yoon's Dev

Yooniron 2021. 4. 19. 22:44

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

 

Swing 패키지 계층구조

 

■ 컨테이너와 컴포넌트

✓ 컨테이너

- 다른 컴포넌트를 포함할 수 있는 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(300200); //크기 설정
        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(300150); // 프레임 크기 300 x 150
        setVisible(true); // 화면에 프레임 출력
        
    }
    public static void main(String[] args) {
        new ContentPaneEx();
 
    }
 
}
 
cs

ContentPane과 JFrame의 예제

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");

 

label

 

✓ 버튼(Button)

- 편집이 불가능한 텍스트를 표시

ex) JButton btn = new JButton("클릭");

Button

버튼의 종류

  • JButton
  • JCheckBox
  • JRadioButton

 

✓ 텍스트 필드(TextField)

- 입력이 가능한 한 줄의 텍스트 필드

ex) JTextField text = new JTextField(20);

 

TextField

텍스트 필드의 종류

  • 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, 3040));
        
        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(300200);
        setVisible(true);
    }
    public static void main(String[] args) {
        new FlowLayoutEx();
 
    }
 
}
 
cs

 

FlowLayout

 

 

■ 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(3020));
        
        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(300200);
        setVisible(true);
    }
    public static void main(String[] args) {
        new BorderLayoutEx();
 
    }
 
}
 
cs

BorderLayout

■ 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(110));
        
        for(int i=0; i<10; i++) {
            String text = Integer.toString(i);
            JButton btn = new JButton(text);
            this.add(btn);
        }
        
        setSize(300200);
        setVisible(true);
    }
    public static void main(String[] args) {
        new GridLayoutEx();
 
    }
 
}
 
cs

GridLayout

 

 

■ 배치 관리자 선택 기준

✓ 컴포넌트를 가능한 크게 나타내고 싶은 경우

  - 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(13050);
        la.setSize(20020);
        
        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(5020);
            this.add(btn);
        }
        
        setSize(300200);
        setVisible(true);
        
    }
    public static void main(String[] args) {
        new NullContainerEx();
    }
 
}
 
cs

 

 

NullContainerEx