JFrame 을 상속 받은 컨테이너 객체를 생성함 ( Window 창의 역할 )Layout 컨테이너에 할당JComponent 객체를 생성 ( 버튼, 라벨, 체크박스 ... )Layout 배치 방식에 따라 컨테이너에 컴포넌트를 배치 ( add() 메서드 )JFrame 을 상속받은 클래스르 생성한다.
해당 클래스가 윈도우 창의 역할을 하는 클래스가 된다.
package sample;
import javax.swing.JFrame;
// JFrame 상속
public class MakeGUI extends JFrame {
	
	// 생성자를 활용해 초기화 진행
	public MakeGUI() {
		/*
		 * 구현할 GUI 코드
		 */
	}
	
	public static void main(String[] args) {
		new MakeGUI(); // 인스턴스 생성을 통해 생성
	}
	
}생성자 안에 윈도우 창과 관련된 세부 내용을 설정한 후 main() 메서드를 통해 생성자를 호출하여 구동시키는 방법이다. 윈도우 창을 구성하는 내용이 복잡할 경우 코드 관리상 불편한 방법이 될 수 있다.
main() 메서드 안에 JFrame 타입 래퍼런스를 통해 직접 구현하는 방법
package sample;
import javax.swing.JFrame;
public class MakeGUI {
	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setTitle("main 메서드에서 직접 구현");
		/*
		 * 구현할 GUI 코드
		 */
		
	}
}메인 메서드 안에 소스코드가 많아지면서 실행이 무거워지는 단점이 생길 수 있어 권장하는 방법은 아니다.
프레임을 상속 받은 윈도우 창의 역할을 할 클래스를 만들어 둔 뒤 실행용 클래스에서 실행한다.
package sample;
import javax.swing.JFrame;
// JFrame 상속 클래스
public class MakeGUI extends JFrame {
	
	// 생성자를 통해 화면 구현
	public MakeGUI() {
		/*
		 * 구현할 GUI 코드
		 */
	}
	
}
package sample;
import sample.MakeGUI;
// 실행용 클래스
public class Run() {
	
	public static void main(String[] args) {
		// 객체 생성을 통해 실행
		MakeGUI gui = new MakeGUI();
	}
	
}세부 구성이 변경될 경우 프레임을 상속 받은 클래스만 수정하면 되며 실행 클래스는 수정할 필요가 없어 실제 권장하는 방법이다.
setLocation(int x, int y)
프레임의 위치를 지정하는 메서드. 왼쪽 최상단 부터 0 . 0 의 좌표를 가지고 있다.
매개변수로 좌표를 가져와 해당 좌표에 구현한다.
setSize(int width, int height)
프레임의 크기, 사이즈를 설정하는 메서드.
위 Loaction 의 좌표 부터 오른쪽으로 넓이, 아래쪽으로 길이를 설정한다.
setBounds(int x, int y, int width, int height)
좌표와 크기를 한번에 지정

setTitle(String title)
프레임의 제목을 설정
setIconImage(IconImage)
프레임 아이콘 이미지 설정
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
창 종료 시 프로그램 종료
setVisiable(true)
윈도우 창을 화면에 보여지게 하는 메서드
모든 설정이 끝난 후 맨 마지막에 반드시 설정해야 함
setResizable(true)
프레임 사이즈 조정 활성화, 비활성화는 false
상하좌우와 중앙, 모두 5개 영역으로 나누고 각 영역에 하나의 컴포넌트를 배치할 수 있다.
한 영역에 하나 이상의 컴포넌트를 배치할 경우 Panel 을 이용하여 배치한다.
package sample;
import java.awt.BorderLayout;
import java.awt.Container;
import javax.swing.JButton;
import javax.swing.JFrame;
public class TestBorderLayout extends JFrame {
	public TestBorderLayout() {
		setTitle("BorderLayout");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// 기본 Layout 이 BorderLayout 이므로 생략 가능
		Container c = getContentPane();
		c.setLayout(new BorderLayout());
		
		JButton east = new JButton("동");
		JButton west = new JButton("서");
		JButton south = new JButton("남");
		JButton north = new JButton("북");
		JButton center = new JButton("중앙");
		add(east, "East");
		add(BorderLayout.WEST, west);
		add(south, BorderLayout.SOUTH);
		add("North", north);
		add(center, BorderLayout.CENTER);
		setSize(300, 300);
		setVisible(true);
	}
	public static void main(String[] args) {
		new TestBorderLayout();
	}
}
기본적으로 왼쪽에서 오른쪽으로 배치하며 자리가 부족할 경우 밑에서 부터 다시 왼쪽에서 오른쪽으로 배치한다. 3가지 정렬 방식 ( 좌, 우, 중앙 ) 을 지원한다.
package sample;
import java.awt.Container;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
public class TestFlowLayout extends JFrame {
	public TestFlowLayout() {
		setTitle("FlowLayout");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = getContentPane();
		c.setLayout(new FlowLayout(FlowLayout.RIGHT)); // 우측 부터 채움
		c.setLayout(new FlowLayout(FlowLayout.LEFT)); // 좌측 부터 채움
		c.setLayout(new FlowLayout(FlowLayout.CENTER)); // 가운데 정렬
		for (int i = 0; i < 5; i++) {
			add(new JButton("Button"));
		}
		setSize(300, 300);
		setVisible(true);
	}
	public static void main(String[] args) {
		new TestFlowLayout();
	}
}
컴포넌트를 가로, 세로의 일정 수 만큼 배치하고자 할 때 주로 사용한다.
행과 열을 지정하며 각 컴포넌트는 동일한 사이즈를 가진다.
package sample;
import java.awt.Container;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
public class TestGirdLayout extends JFrame {
	public TestGirdLayout() {
		setTitle("GridLayout");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = getContentPane();
		c.setLayout(new GridLayout(3, 2)); // 3행 2열의 그리드 레이아웃 배치
		for (int i = 0; i < 6; i++) {
			add(new JButton("Button"));
		}
		setSize(300, 300);
		setVisible(true);
	}
	public static void main(String[] args) {
		new TestGirdLayout();
	}
}
여러 컨테이너를 슬라이드처럼 바꿔가며 보여줄 수 있는 레이아웃.
앨범이나 퀴즈 또는 설치프로그램에 주로 사용된다.
package sample;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class TestCardLayout extends JFrame {
	public TestCardLayout() {
		setTitle("CardLayout");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = getContentPane();
		CardLayout card = new CardLayout();
		c.setLayout(card);
		// 3개의 카드 생성
		JPanel card1 = new JPanel();
		JPanel card2 = new JPanel();
		JPanel card3 = new JPanel();
		// 카드에 색상 지정
		card1.setBackground(Color.RED);
		card2.setBackground(Color.ORANGE);
		card3.setBackground(Color.GREEN);
		// 카드에 라벨 추가
		card1.add(new JLabel("Card 1"));
		card2.add(new JLabel("Card 2"));
		card3.add(new JLabel("Card 3"));
		// 카드에 이벤트 추가
		card1.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				if (e.getButton() == 1) // 마우스 왼쪽 버튼
					card.next(card1.getParent());
				if (e.getButton() == 3) // 마우스 우측 버튼
					card.previous(card1.getParent());
			}
		});
		card2.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				if (e.getButton() == 1) // 마우스 왼쪽 버튼
					card.next(card2.getParent());
				if (e.getButton() == 3) // 마우스 우측 버튼
					card.previous(card2.getParent());
			}
		});
		card3.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				if (e.getButton() == 1) // 마우스 왼쪽 버튼
					card.next(card3.getParent());
				if (e.getButton() == 3) // 마우스 우측 버튼
					card.previous(card3.getParent());
			}
		});
		
		// 프레임에 카드 추가
		add(card1);
		add(card2);
		add(card3);
		setSize(300, 200);
		setVisible(true);
	}
	public static void main(String[] args) {
		new TestCardLayout();
	}
	
}
컴포넌트의 위치와 크기를 자유롭게 만들 수 있는 레이아웃.
실제로 사용하기 매우 복잡하다.