본문 바로가기

STUDY/국비과정

[JAVA 웹 개발 공부] 국비지원 23일차 - 배치 관리자, 레이아웃, GUI 활용

배치 관리자

 

1. 배치 관리자의 종류

종류 설명
FlowLayout 컨테이너에 추가되는 순서대로 컴포넌트를 부착한다.
위쪽에서 아래쪽으로, 왼쪽에서 오른쪽으로 배치한다. 패널의 기본 배치 관리자이다.
BorderLayout 컨테이너의 영역을 동서남북, 중앙의 5개의 영역으로 구분하여 이 영역에 컴포넌트를 배치한다.
프레임의 기본 배치 관리자이다.
GridLayout 컨테이너의 공간을 동일한 크기의 격자로 나누고 이 격자에 컴포넌트를 배치한다.
CardLayout 컨테이너에 컴포넌트를 카드처럼 겹치게 쌓아서 배치한다.
BoxLayout 컨테이너에 컴포넌트를 상자 쌓듯이 가로 또는 세로 방향 차례로 배치한다.

 

2. 배치 관리자를 설정하기

컨테이너에 배치 관리자를 설정하려면 먼저 new 연산자를 이용하여 배치 관리자 객체를 만들고 이 객체를 컨테이너의 setLayout() 메소드를 사용하여 배치 관리자로 지정한다.

panel.setLayout(new BorderLayout()); // 패널의 배치 관리자 설정

 

컴포넌트의 크기와 힌트를 배치 관리자에게 주고 싶은 경우에는 setMinimumSize(), setPreferredSize(), setMaximumSize() 메소드를 사용할 수 있다.

정렬에 대한 힌트를 주려면 setAlignmentX()와 setAlignmentY() 메소드를 이용한다.

button.setMaximumSize(new Dimension(300, 200)); // 최대 크기 힌트
button.setAlignmentX(JComponent.CENTER_ALIGNMENT); // 중앙 정렬 힌트

 

 

 

FlowLayout

 

컴포넌트들을 왼쪽에서 오른쪽으로 버튼을 배치한다. FlowLayout으로 지정하면, 각 컴포넌트들은 하나의 줄에서 차례로 배치되고 더 이상 공간이 없으면 다음 줄에 배치된다.

 

*FlowLayout 생성자

FlowLayout() 
FlowLayout(int align) // align은 정렬 방법을 지정한다.
FlowLayout(int align, int hGap, int vGap) // 간격을 지정한다.

 

 

 

BorderLayout

 

BorderLayout은 컨테이너를 5개의 영역(상, 하, 좌, 우, 중앙)으로 구분하고 각각의 영역에 컴포넌트를 배치할 수 있는 배치관리자이다. JFrame, JDialog와 같은 최상위 컨테이너의 디폴트 배치 관리자이다.

영역을 지정할 때는 "North", "South", "East", "West", "Center"의 문자열을 사용한다.

add(button, "South"); // 버튼을 남쪽에 배치

 

*BorderLayout 생성자

BorderLayout()
BorderLayout(int hGap, int vGap)

 

import java.awt.BorderLayout;

import javax.swing.JButton;
import javax.swing.JFrame;

class MyFrame extends JFrame {
	public MyFrame() {
		JButton btn = new JButton("중앙");
		add(btn);
		
		JButton btnNorth = new JButton("북쪽");
		add(btnNorth, "North");
		
		JButton btnSouth = new JButton("남쪽");
		add(btnSouth, BorderLayout.SOUTH);
		
		JButton btnWest = new JButton("서쪽");
		add(btnWest, "West");
		
		JButton btnEast = new JButton("동쪽");
		add(btnEast, "East");
		
		setSize(500, 500);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
	public void showGUI() {
		setVisible(true);
	}
}

public class Main {
	public static void main(String[] args) {
		new MyFrame().showGUI();
	}
}

 

 

 

GridLayout

 

GridLayout은 컨테이너 공간을 격자(grid) 모양으로 나눈 후에 각 셀에 하나씩 컴포넌트들을 배치한다. 컴포넌트들이 추가되는 순서대로 격자의 셀을 채우게 된다. GridLayout은 상당히 깔끔하게 컴포넌트들을 배치할 수 있어서 자주 사용된다.

 

*GridLayout 생성자

GridLayout() // 1행과 1열의 격자
GridLayout(int rows, int cols) // rows 행과 cols 열
GridLayout(int rows, int cols, int hGap, int vGap) // 간격 지정

 

import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;

class TestGridLayout extends JFrame {
	public TestGridLayout() {
		setLayout(new GridLayout(3, 3));
		
		add(new JButton("버튼"));
		add(new JButton("버튼"));
		add(new JButton("버튼"));
		add(new JButton("버튼"));
		add(new JButton("버튼"));
		add(new JButton("버튼"));
		add(new JButton("버튼"));
		add(new JButton("버튼"));
		add(new JButton("버튼"));
		
		setSize(500, 500);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
	}
	public void showGUI() {
		setVisible(true);
	}
}
public class Main5 {
	public static void main(String[] args) {
		new TestGridLayout().showGUI();
	}
}

 

 

 

CardLayout

 

CardLayout은 한 번에 하나의 컴포넌트만 볼 수 있게 배치하는 관리자이다. 각 컴포넌트들을 카드처럼 취급하므로 CardLayout이라고 한다. 

 

*CardLayout 메소드

next(container) : 주어진 컨테이너의 다음 카드로 이동한다.
previous(container) : 주어진 컨테이너의 이전 카드로 이동한다.
first(container) : 주어진 컨테이너의 첫 번째 카드로 이동한다.
last(container) : 주어진 컨테이너의 마지막 카드로 이동한다.

 

 

 

BoxLayout

 

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

class TestBoxLayout extends JFrame {
	public TestBoxLayout() {
		JPanel pnl = new JPanel();
		BoxLayout box = new BoxLayout(pnl, BoxLayout.Y_AXIS);
		pnl.setLayout(box);
		
		JButton btn1 = new JButton("버튼1");
		JButton btn2 = new JButton("버튼2");
		JButton btn3 = new JButton("~~~~ 버튼3 ~~~~");
		
		pnl.add(btn1);
		pnl.add(btn2);
		pnl.add(btn3);
		
		add(pnl);
		
		setSize(500, 500);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
	public void showGUI() {
		setVisible(true);
	}
}

public class Main4 {
	public static void main(String[] args) {
		new TestBoxLayout().showGUI();
	}
}

 

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingConstants;

class TestBoxLayout extends JFrame {

	public TestBoxLayout() {
		JPanel pnl = new JPanel();
		BoxLayout box = new BoxLayout(pnl, BoxLayout.Y_AXIS);
		pnl.setLayout(box);
		
		JButton btn1 = new JButton("버튼1");
		btn1.setAlignmentX(0.5F); // 왼쪽은 0, 가운데는 0.5, 오른쪽은 1, F는 float타입 상수
		JButton btn2 = new JButton("버튼2");
		btn2.setAlignmentX(0.5F);
		JButton btn3 = new JButton("~~~~ 버튼3 ~~~~");
		btn3.setAlignmentX(0.5F);
		
		pnl.add(Box.createGlue());
		pnl.add(btn1);
		pnl.add(Box.createGlue());
		pnl.add(btn2);
		pnl.add(Box.createGlue());
		pnl.add(btn3);
		pnl.add(Box.createGlue());
		
		add(pnl);
		
		setSize(500, 500);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
	}
	public void showGUI() {
		setVisible(true);
	}
}

public class Main4 {
	public static void main(String[] args) {
		new TestBoxLayout().showGUI();
	}
}

 

 

 

절대 위치로 배치하기

 

배치 관리자를 사용하는 것이 권장되지만, 특별한 경우에는 컴포넌트들을 배치 관리자 없이 배치해야만 하는 경우도 있다.

즉 컨테이너 안의 컴포넌트들의 크기와 위치가 외부의 영향을 받지 않는 경우가 그렇다. 또 어떤 특수한 효과를 주고자 하는 경우에도 그렇다. 예를 들어서 의도적으로 컴포넌트와 컴포넌트가 겹치게 하고자 하는 경우에는 절대 위치를 사용하여 배치해야 한다. 

배치 관리자를 사용하지 않으려면 배치 관리자를 null로 설정하고 setBounds() 메소드를 사용하여 위치와 크기를 설정하면 된다.

 

import javax.swing.JButton;
import javax.swing.JFrame;

class NonLayoutFrame extends JFrame {
	public NonLayoutFrame() {
		setLayout(null);
		
		JButton btn = new JButton("버튼입니다.");
		btn.setBounds(185, 150, 130, 40);
		
		JButton btn2 = new JButton("아래 버튼");
		btn2.setBounds(185, 200, 130, 40);
		
		add(btn);
		add(btn2);
		
		setSize(500, 500);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
	
	public void showGUI() {
		setVisible(true);
	}
}

public class Main2 {
	public static void main(String[] args) {
		new NonLayoutFrame().showGUI();
	}
}

 

 

 

글자와 버튼이 있는 창 만들기

 

카운트 버튼 숫자 1증가, 감소 버튼 숫자 1감소, 리셋 버튼 숫자 1로 초기화

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

class MyFrame extends JFrame implements ActionListener {
	public JLabel lblNumber;
	private int number;
	
	public MyFrame() {
		number = 1;
		
		JPanel pnl = new JPanel();
		add(pnl);
		
		JLabel lbl = new JLabel("안녕하세요~");
		pnl.add(lbl);
		
		lblNumber = new JLabel(String.valueOf(number));
		pnl.add(lblNumber);
		
		JButton btnIncrese = new JButton("카운트");
		btnIncrese.addActionListener(this);
		pnl.add(btnIncrese);
		
		JButton btnDecrease = new JButton("감소");
		btnDecrease.addActionListener(this);
		pnl.add(btnDecrease);
		
		JButton btnReset = new JButton("리셋");
		btnReset.addActionListener(this);
		pnl.add(btnReset);
		
		setSize(500, 500);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
	
	public void showGUI() {
		setVisible(true);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		String command = e.getActionCommand();
		if (command.equals("카운트")) {
			number++;
		} else if (command.equals("감소")) {
			number--;
		} else if (command.equals("리셋")) {
			number = 1;
		}
		lblNumber.setText(String.valueOf(number));
	}
}
public class Main {
	public static void main(String[] args) {
		MyFrame f = new MyFrame();
		f.showGUI();
	}
}

 

 

 

계산해주는 창 만들기

 

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

class TextInputFrame extends JFrame implements ActionListener {
	private JTextField left;
	private JTextField right;
	private JButton btnSum;
	private JLabel lblResult;

	public TextInputFrame() {
		JPanel pnl = new JPanel();
		left = new JTextField(3);
		right = new JTextField(3);
		btnSum = new JButton("+");
		lblResult = new JLabel("0");
		
		pnl.add(left);
		pnl.add(right);
		pnl.add(btnSum);
		pnl.add(lblResult);

		add(pnl);
		
		btnSum.addActionListener(this);
		
		setSize(500, 500);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
	
	public void showGUI() {
		setVisible(true);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		System.out.println("버튼 동작 확인");
		try { // 예외 처리
			int leftNumber = Integer.parseInt(left.getText());
			int rightNumber = Integer.parseInt(right.getText());
			int sum = leftNumber + rightNumber;
			lblResult.setText(String.valueOf(sum));
		} catch (NumberFormatException excep) {
			lblResult.setText("정수를 입력해야합니다.");
		}
	}
}

public class Main2 {
	public static void main(String[] args) {
		TextInputFrame f = new TextInputFrame();
		f.showGUI();
	}
}

 

 

 

로그인 창 만들기

 

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

class LoginFrame extends JFrame implements ActionListener {
	private JTextField tfId;
	private JTextField tfPw;
	private JLabel lblResult;
	
	private final String USER_ID = "Admin";
	private final String USER_PASSWORD = "1234";

	public LoginFrame() {
		super("로그인");
		
		JPanel pnl = new JPanel();
		JLabel lblId = new JLabel("아이디");
		tfId = new JTextField(10);
		JLabel lblPw = new JLabel("비밀번호");
		tfPw = new JTextField(10);
		JButton btnLogin = new JButton("로그인");
		lblResult = new JLabel("결과확인");
		
		pnl.add(lblId);
		pnl.add(tfId);
		pnl.add(lblPw);
		pnl.add(tfPw);
		pnl.add(btnLogin);
		pnl.add(lblResult);
		
		add(pnl);
		
		tfId.addActionListener(this);
		tfPw.addActionListener(this);
		btnLogin.addActionListener(this);
		
		setSize(500, 500);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	}

	@Override
	public void actionPerformed(ActionEvent e) {

		if (tfId.getText().equals(USER_ID) && tfPw.getText().equals(USER_PASSWORD)) {
			lblResult.setText("로그인 완료");
		} else {
			lblResult.setText("로그인 실패");
		}
		System.out.println(lblResult.getText());
	}
	
	public void showGUI() {
		setVisible(true);
	}
}

public class Main4 {
	public static void main(String[] args) {
		LoginFrame f = new LoginFrame();
		f.showGUI();
	}
}