Java GUI #2

HH_Nebula·2022년 9월 21일
0

GUI 작업 순서

  1. JFrame 을 상속 받은 컨테이너 객체를 생성함 ( Window 창의 역할 )
  2. 배치 방식 Layout 컨테이너에 할당
  3. 컴포넌트 JComponent 객체를 생성 ( 버튼, 라벨, 체크박스 ... )
  4. 지정된 배치 방식 Layout 배치 방식에 따라 컨테이너에 컴포넌트를 배치 ( add() 메서드 )
  5. 컴포넌트에 마우스나 키보드 입력에 대한 이벤트를 연결
  6. 이벤트 동작에 대한 코드를 구현하여 완성

1. 컨테이너 객체 생성하기

방법 1. JFrame 상속을 이용한 방법

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() 메서드를 통해 생성자를 호출하여 구동시키는 방법이다. 윈도우 창을 구성하는 내용이 복잡할 경우 코드 관리상 불편한 방법이 될 수 있다.

방법 2. 상속 받지 않고 객체 생성하기

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 코드
		 */
		
	}

}

메인 메서드 안에 소스코드가 많아지면서 실행이 무거워지는 단점이 생길 수 있어 권장하는 방법은 아니다.

방법 3. JFrame 상속 클래스를 실행용 클래스에서 실행

프레임을 상속 받은 윈도우 창의 역할을 할 클래스를 만들어 둔 뒤 실행용 클래스에서 실행한다.

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


2. 컨테이너 배치 방식 지정

#1 BorderLayout

상하좌우와 중앙, 모두 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();
	}

}

#2 FlowLayout

기본적으로 왼쪽에서 오른쪽으로 배치하며 자리가 부족할 경우 밑에서 부터 다시 왼쪽에서 오른쪽으로 배치한다. 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();
	}

}

#3 GridLayout

컴포넌트를 가로, 세로의 일정 수 만큼 배치하고자 할 때 주로 사용한다.
행과 열을 지정하며 각 컴포넌트는 동일한 사이즈를 가진다.

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();
	}

}

#4 CardLayout

여러 컨테이너를 슬라이드처럼 바꿔가며 보여줄 수 있는 레이아웃.
앨범이나 퀴즈 또는 설치프로그램에 주로 사용된다.

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();
	}
	
}

#5 GridbagLayout

컴포넌트의 위치와 크기를 자유롭게 만들 수 있는 레이아웃.
실제로 사용하기 매우 복잡하다.

profile
공부하고 기록하고 복습하고

0개의 댓글