넘어졌으면 일어서서 다시 걷자 🐈My GitHub🐈

기록/Programming Language

Java - GUI

YongE 2024. 6. 6. 18:46

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

 

위 설정대로 만든 GridLayout 창

 

 

이외에도 여러가지 Layout이 있다. 하지만 배치 관리자 없이 컴포넌트를 배치한다면 절대좌표로 컴포넌트를 배치해야 한다. 그런데 플랫폼에 따라 크기가 변경되는 등 원하지 않는대로 나타날 수 있으니 자제해야 한다.

 

 

 

스윙 컴포넌트

  • JLabel 레이블

텍스트나 이미지, 혹은 둘 다를 표현할 수 있는 공간이다. 

  • JTextField

사용자가 한 줄의 텍스트를 입력할 수 있는 공간이다.

  • JComboBox

다수의  항목  중에  하나를  선택하며, 컴포넌트에  텍스트와  이미지를  추가  가능한 공간이다.

 

728x90
반응형