새소식

Java

[JAVA] Swing GUI 기초(2) - 컴포넌트

  • -

 

컴포넌트(Component) 란?

컴포넌트는 GUI에서 버튼, 텍스트 상자, 레이블 등의 요소들을 뜻하는 단어입니다. GUI를 구성하는 것이라면 모두 포함되기 때문에 JFrame도 컴포넌트 중에 하나입니다. 다만 JFrame처럼 다른 컴포넌트를 포함할 수 있는 컴포넌트는 컨테이너라고 불리며 그렇지 못하는 컴포넌트를 순수 컴포넌트라고 합니다. 

 

컴포넌트 상속 관계

AWT와 Swing의 모든 GUI 컴포넌트들은 반드시 Component 클래스를 상속받습니다. 아래 표에서 JComponent 클래스를 상속받는 Swing 컴포넌트의 일부 종류와 관계를 알아볼 수 있습니다. 눈여겨 보시면 이 다이어그램에서 대표적인 컴포넌트인 JFrame은 보이지 않는데요, 그 이유는 JFrame, JApplet, JDialog는 JComponent를 상속받지 않기 때문입니다. 3개의 컴포넌트를 제외한 모든 Swing 컴포넌트는 JComponent를 상속받습니다.

 

JComponent를 상속받는 일부 Swing 컴포넌트

 

 

JFrame의 구조

컴포넌트를 JFrame에 붙이기에 앞서 JFrame의 구조에 대해서 알아보겠습니다. JFrame은 대표적으로 Frame, MenuBar, Content Pane, 이렇게 총  3가지 영역으로 분리되어 있는데요, 이 중 Content Pane에 해당하는 JFrame의 ContentPane 필드는 화면에 출력되는 모든 컴포넌트들을 담을 수 있는 Container 클래스입니다. 여기에 또 다른 컨테이너 컴포넌트인 JPanel을 붙여서 다층 구조의 화면을 제작할 수도 있습니다.

JFrame 영역 구분과 JPanel을 이용한 다층 구조 예시

 

구조에 대해 주의할 점은 컴포넌트를 붙이는 곳이 JFrame이 아니라 JFrame의 필드 중 하나인 ContentPane이라는 점입니다. JFrame은 ContentPane이라는 Container 클래스를 가지고 있는 클래스이지, Container 클래스가 아니기 때문입니다. 따라서 생성된 JFrame의 ContentPane의 레퍼런스를 가져와서 그곳에서 컴포넌트를 넣어주는 add() 함수를 쓰는 것이 바람직합니다.

 

JFrame.add(new JButton( "Click me!" )); 올바른 방법이 아님. 하지만 동작함
Container c = JFrame.getContentPane();
c.add(new JButton( "Click me!" ));
올바른 방법

* JFrame에서 add() 함수 이용이 올바르지 않아도 가능한 이유는 개발자들의 실수를 어느정도 고려해서 용인해줬기 때문입니다.

 

컨테이너에 컴포넌트 붙여보기

그럼 본격적으로 다음 과정을 통해 JFrame의 ContentPane에 컴포넌트들을 붙여보겠습니다.

  1. getContentPane() 으로 JFrame의 ContentPane 필드 가져오기
  2. ContentPane 레이아웃 설정하기 (3번째 포스팅에서 추가적으로 다룰 예정)
  3. 컴포넌트 객체 생성하기
  4. ContentPane 의 add() 함수를 이용하여 생성한 컴포넌트 붙이기
package swing;

import java.awt.*;
import javax.swing.*;

public class JComponentEx{

	public static void main(String[] args) {
		// 프레임 객체 생성
		JFrame jf = new JFrame("Component Demo");
		// ContentPane 가져오기
		Container c = jf.getContentPane();
		// FlowLayout으로 레이아웃 설정
		c.setLayout(new FlowLayout());
		// 컴포넌트 객체 생성
		JButton btn = new JButton("Click Me!");
		JLabel l = new JLabel("Hello World!");
		JTextField tf = new JTextField(10);
		// add() 함수로 컴포넌트 붙이기
		c.add(btn);
		c.add(l);
		c.add(tf);
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jf.setSize(500, 300);
		jf.setVisible(true);
	}

}

 

실행 화면

 

 

<참고 문헌>

[JFrame 공식 문서]

https://docs.oracle.com/javase%2F7%2Fdocs%2Fapi%2F%2F/javax/swing/JFrame.html#getContentPane()

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.