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();
}
}
컴포넌트의 위치와 크기를 자유롭게 만들 수 있는 레이아웃.
실제로 사용하기 매우 복잡하다.