GUI
Graphic User Interface의 약자로, 화면에 정보를 시각적으로 표현한, 사용자와 컴퓨터 간의 상호작용 방식이다. 우리가 당연 시 여기는 노트북을 켰을 때의 화면이 그것이다! 오늘은 이러한 GUI를 Java에서 어떻게 다루는지에 대해 공부한 내용을 정리하려 한다.
GUI 프로그래밍을 하려면 아래 두 가지 라이브러리를 다룰 수 있다.
AWT (abstract windows toolkit) : 운영체제가 제공하는 UI 컴포넌트 java 라이브러리다! 중량 컴포넌트라고도 하며, 운영체제에 따라 외형이 다르다.
Swing : 순수 자바로 작성된 경량 컴포넌트다! 모든 스윙 컴포넌트는 AWT 컴포넌트와 완전 호환한다.
AWT | Swing | |
구성 요소 | 무거운 컴포넌트 (운영 체제 객체의 래퍼) | 가벼운 컴포넌트 (AWT 위에 구축됨) |
플랫폼 독립성 | 특정 운영 체제에 종속적 | 100% 플랫폼 독립적 |
성능 | 초기에는 AWT보다 느렸으나 최적화로 인해 성능 향상 | 현재는 거의 차이 없음 |
스킨 가능성 | 제한적 | 플러그 가능한 룩 앤 필 (다양한 스킨 지원) |
믹싱 | AWT와 Swing 혼합은 지원되지 않음 | Swing 위젯과 AWT 위젯 혼합은 지원되지 않음 |
컴포넌트와 컨테이너
GUI의 기본적인 단계는 1. 컨테이너를 생성하고, 2. 컴포넌트를 추가해야 한다.
컴포넌트는 다양한 버튼이나 레이블, 텍스트 등 기본적인 빌딩 블록를 의미한다. 즉 창을 꾸미는 하나의 요소라고 이해하면 편하다.
컨테이너는 컴포넌트를 부착하는 프레임이나 패널을 의미한다. 다양한 컴포넌트가 컨테이너에 포함돼 하나의 창을 이루고 사용자와 상호작용한다.
//객체를 생성하거나
public static void main(String[] args) {
JFrame f = new JFrame();
f.setTitle("안녕, 스윙");
f.setSize(300, 100);
f.setVisible(true); //창이 보이도록 하는 설정
}
//JFrame 클래스를 상속한다.
public class Demo extends JFrame {
Demo() {
setTitle("안녕, 스윙!");
JButton b = new JButton("버튼");
add(b);
}
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300, 100);
setVisible(true);
}
public static void main(String[] args) {
new Demo();
}
위와 같은 JFram 클래스를 작성해 컨테이너를 하나 만들었다. 그러면 실행했을 때 다음과 같은 창이 생성된다.
JFrame 클래스에서 사용할 수 있는 메서드는 다음과 같다.
add(Component comp) | 컴포넌트를 프레임에 추가합니다. |
remove(Component comp) | 컴포넌트를 프레임에서 제거합니다. |
setLayout(LayoutManager mgr) | 레이아웃 매니저를 설정합니다. |
setDefaultCloseOperation(int operation) | 프레임이 닫힐 때의 동작을 설정합니다. |
setVisible(boolean b) | 프레임의 가시성을 설정합니다. |
pack() | 프레임의 크기를 자동으로 조정합니다. |
setTitle(String title) | 프레임의 제목을 설정합니다. |
setSize(int width, int height) | 프레임의 크기를 설정합니다. |
setLocation(int x, int y) | 프레임의 위치를 설정합니다. |
여기서 setLayOut()과 setDefaultCloseOperation() 설정 메소드는 꽤 중요한 부분이다.
컨테이너는 내부의 배치 관리자 LayOut를 사용해 컴포넌트 위치를 결정한다. 따라서 LayOut 관련 설정 메소드는 중요하다. setDefaultCloseOperation() 는 어플리케이션 종료 시 수행할 동작을 설정한다. 사용형태와 상수들은 다음과 같다.
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
EXIT_ON_CLOSE | 프레임이 닫힐 때 프로그램을 종료합니다. |
DO_NOTHING_ON_CLOSE | 프레임이 닫힐 때 아무 동작도 수행하지 않습니다. |
HIDE_ON_CLOSE | 프레임이 닫힐 때 프레임을 숨깁니다. |
DISPOSE_ON_CLOSE | 프레임이 닫힐 때 프레임을 제거합니다. |
패널 안에 각 컴포넌트를 붙여서 하나의 컴포넌트로 만들어서 프레임에 추가할 수도 있다.
public class Demo extends JFrame {
Demo() {
setTitle("안녕, 스윙!");
JPanel p = new JPanel();
JLabel l = new JLabel("안녕, 스윙!");
JButton b = new JButton("버튼");
p.add(l);
p.add(b);
add(p);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300, 100);
setVisible(true);
}
public static void main(String[] args) {
new Demo();
}
}
컴포넌트 배치 관리자 Layout Manager
위에서 말했다시피 컴포넌트의 위치를 결정해 적절히 배치할 수 있다. 배치관리를 하는 법은 각각 다음과 같다.
생성자 이용
JPanel panel = new JPanel(new BorderLayout());
setLayout() 메소드 이용
panel.setLayout(new FlowLayout());
- FlowLayout
원하는 방향으로 순서배치가 가능하다. 갯수가 넓이를 초과할 시에는 아래로 배치한다. 배치 방향은 setComponentOrientation() 메소드로 정할 수 있다. 오른쪽에서 왼쪽으로 배치하고자하면 다음과 같다!
p.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
- BorderLayout
동서남북 그리고 중앙에 하는 배치다. add 메소드는 다음과 같이 사용한다. 상수도 아래 표를 보자.
BorderLayout.NORTH | 북쪽(위)에 컴포넌트를 배치합니다. |
BorderLayout.SOUTH | 남쪽(아래)에 컴포넌트를 배치합니다. |
BorderLayout.EAST | 동쪽(오른쪽)에 컴포넌트를 배치합니다. |
BorderLayout.WEST | 서쪽(왼쪽)에 컴포넌트를 배치합니다. |
BorderLayout.CENTER | 중앙에 컴포넌트를 배치합니다. |
add("East", new JButton("동"));
add("West", new Jbutton("서"));
add("South", new Jbutton("남"));
add(new Jbutton("북"), BorderLayout.NORTH);
add(new Jbutton("중앙"), BorderLayout.CENTER);
- GridLayout
행과 열로 구성된 배치다. 아래 코드와 사진을 보면 더 직관적인 이해가 가능할 것이다!
setLayout(new GridLayout(0, 3)); //행 row는 0이면, 필요한 만큼 행을 생성, 열이 3이면 3개의 열만 생성
add(new Jbutton("B 1"));
add(new Jbutton("버튼2"));
add(new JButton("Button 3"));
add(new JButton("Button Four"));
이외에도 여러가지 Layout이 있다. 하지만 배치 관리자 없이 컴포넌트를 배치한다면 절대좌표로 컴포넌트를 배치해야 한다. 그런데 플랫폼에 따라 크기가 변경되는 등 원하지 않는대로 나타날 수 있으니 자제해야 한다.
스윙 컴포넌트
- JLabel 레이블
텍스트나 이미지, 혹은 둘 다를 표현할 수 있는 공간이다.
- JTextField
사용자가 한 줄의 텍스트를 입력할 수 있는 공간이다.
- JComboBox
다수의 항목 중에 하나를 선택하며, 컴포넌트에 텍스트와 이미지를 추가 가능한 공간이다.
'기록 > Programming Language' 카테고리의 다른 글
Java - 파일 관리 (0) | 2024.06.06 |
---|---|
Java - 스트림 Stream (2) (1) | 2024.06.05 |
Java - 스트림 Stream (0) | 2024.04.24 |
Java - 컬렉션 프레임워크 Collection Framework (0) | 2024.04.20 |
Java - 람다식과 함수형 인터페이스(Predicate, Consumer, Supplier, Function, Operator) (0) | 2024.04.17 |