KH/JAVA

# 41 Layout

오늘의 진 2022. 8. 3. 14:20

지금까지 컴포넌트를 생성하고 컨테이너에 등록해 출력하는 방법을 알아보았다. 

그런데 문제가 있다. 컨테이너에 컴포넌트를 출력할 때 어떻게 배치할 것인지를 지정하지 않았었다. 

자바는 일정한 모양으로 컴포넌트를 재배치할 수 있도록 하기 위해 Layout Manager를 제공한다. 

레이아웃은 컴포넌트를 어떻게 배치할 것인가를 정하는 규격이고 이를 설정하는 것이 레이아웃 매니저이다. 

 

자바에서 컴포넌트 위치를 결정하는 방법은 두 가지가 있다. 

1. 컨테이너에 add( )메소드를 사용하는 순서에 따라 위치가 결정된다.

2. 레이아웃 매니저에 따라 위치가 정해진다. 

 

자바의 Container는 컴포넌트의 일종이기 때문에 컨테이너에 또 다른 컨테이너를 등록할 수 있다. 

컨테이너는 프레임, 패널, 윈도우, 애플릿 등이 있다. 

결국 레이아웃 매니저는 컨테이너를 포함한 모든 컴포넌트의 배치에 관여한다. 

 

자바에서 제공하는 레이아웃 관리자는 

FlowLayout, GridLayout, BorderLayout, CardLayout 등이 있다. 

레이아웃 매니저는 컴포넌트를 어떻게 배치하는지를 결정하는 클래스이다. 

그렇기 때문에 컨테이너를 제외한 모든 컴포넌트의 위치에 관여한다.

컨테이너에 또 다른 컨테이너가 등록되어 있다면 서브 컨테이너도 레이아웃 매니저에 의해 위치가 결정된다. 

 

 

 

BorderLayout

 

보더레이아웃은 동(East),서(West),남(South),북(North),중앙(Center)으로 화면을 분할한다.

중앙에는 중요한 컴포넌트를 두고, 그 주변에 보조 컴포넌트를 배치할때 사용한다. 

Frame컨테이너의 기본레이아웃이다. 

BorderLayout bb = new BorderLayout();

package ja_0803;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Frame;

public class BorderLayout_1 extends Frame {

	BorderLayout bbl = new BorderLayout();
	// 프레임을 상속받았음으로 쓰지 않아도 기본으로 보더레이아웃이다.

	public BorderLayout_1(String title) {
		super(title);
		setLayout(bbl);

		add("North", new Button("북쪽")).setBackground(new Color(163, 245, 182));
		add("West", new Button("서쪽")).setBackground(new Color(215, 188, 242));
		add("East", new Button("동쪽")).setBackground(new Color(10, 100, 250));
		add("Center", new Button("중앙")).setBackground(new Color(255, 255, 90));
		add("South", new Button("남쪽")).setBackground(new Color(50, 230, 80));

		setSize(300, 300);
		setVisible(true);

	}

	public static void main(String[] args) {
		new BorderLayout_1("Test");
	}

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

GridLayout

GridLayout(3, 1) : 3행 1열의 공간을 만들어서 채우겠다 라는말. 

1행부터 시작해서 하나씩 채우고 다음 행으로 넘어감

package ja_0803;

import java.awt.Button;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextField;

public class BorderLayout_2 extends Frame {

	public BorderLayout_2(String str) {
		super(str);

		Panel p = new Panel();

		p.setLayout(new GridLayout(3, 1));
		p.add(new Button("버튼 1"));
		p.add(new Button("버튼 2"));
		p.add(new Button("버튼 3"));

		add("North", new Label("레이아웃"));
		add("Center", p);
		add("South", new TextField("레이아웃 관리자 혼합", 15));

		setSize(300, 300);
		setVisible(true);

	}

	public static void main(String[] args) {

		new BorderLayout_2("BorderLayput 예제");

	}

}

 

GridLayout(1,3) 기본배열(플로우레이아웃) GridLayout(3,1)

 

package ja_0803;

import java.awt.Button;
import java.awt.Frame;
import java.awt.GridLayout;

public class GridLayout_1 extends Frame {

	Button[] btn = new Button[6];

	public GridLayout_1(String title) {
		super(title);
		setLayout(new GridLayout(3, 2));

		for (int i = 0; i < 5; i++) {
			btn[i] = new Button(i + "Button");
			add(btn[i]);
		}

		setSize(200, 200);
		setVisible(true);

	}

	public static void main(String[] args) {
		new GridLayout_1("Test");
	}

}
출력 결과 각행을 채우고 넘어간다. 빈공간이 있으면 그냥둠 

 

 

(예) 색상파레트 만들기

package ja_0804;

import java.awt.Color;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Panel;

public class GridLayout_3 {
	
	public static void main(String[] args) {
		//파레트 만들기
		
	   Frame ff = new Frame();
	   ff.setLayout(new GridLayout(17,2));
	   
	   Panel p1 = new Panel();  p1.setBackground(Color.black);
	   Panel p2 = new Panel();  p2.setBackground(Color.blue);
	   Panel p3 = new Panel();  p3.setBackground(Color.cyan);
	   Panel p4 = new Panel();  p4.setBackground(Color.DARK_GRAY);
	   Panel p5 = new Panel();  p5.setBackground(Color.gray);
	   Panel p6 = new Panel();  p6.setBackground(Color.green);
	   Panel p7 = new Panel();  p7.setBackground(Color.LIGHT_GRAY);
	   Panel p8 = new Panel();  p8.setBackground(Color.magenta);
	   Panel p9 = new Panel();  p9.setBackground(Color.orange);
	   Panel p10 = new Panel();  p10.setBackground(Color.pink);
	   Panel p11 = new Panel();  p11.setBackground(Color.red);
	   Panel p12 = new Panel();  p12.setBackground(Color.white);
	   Panel p13 = new Panel();  p13.setBackground(Color.yellow);
	   Panel p14 = new Panel();  p14.setBackground(new Color(50,100,100));
	   Panel p15 = new Panel();  p15.setBackground(new Color(163,245,182));
	   Panel p16 = new Panel();  p16.setBackground(new Color(215,188,242));
	   Panel p17 = new Panel();  p17.setBackground(new Color(50,200,240));
	   
	   ff.add(new Label("Color.black"));   ff.add(p1);
	   ff.add(new Label("Color.blue"));     ff.add(p2);
	   ff.add(new Label("Color.cyan"));     ff.add(p3);
	   ff.add(new Label("Color.darkGray"));   ff.add(p4);
	   ff.add(new Label("Color.gray"));   ff.add(p5);
	   ff.add(new Label("Color.green"));   ff.add(p6);
	   ff.add(new Label("Color.lightGray"));  ff.add(p7);
	   ff.add(new Label("Color.magenta"));  ff.add(p8);
	   ff.add(new Label("Color.orange"));  ff.add(p9);
	   ff.add(new Label("Color.pink"));  ff.add(p10);
	   ff.add(new Label("Color.red"));  ff.add(p11);
	   ff.add(new Label("Color.white"));  ff.add(p12);
	   ff.add(new Label("Color.yellow"));  ff.add(p13);
	   ff.add(new Label("Color(50,100,100)"));  ff.add(p14);
	   ff.add(new Label("Color(163,245,182)"));  ff.add(p15);
	   ff.add(new Label("Color(215,188,242)"));  ff.add(p16);
	   ff.add(new Label("Color(50,200,240)"));  ff.add(p17);
	   
	   ff.setSize(250,300);
	   ff.setVisible(true);
	 
	
	}

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

FlowLayout

 

package ja_0803;

import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;

public class FlowLayout_1 extends Frame {

	FlowLayout f11 = new FlowLayout();
	Button[] btn = new Button[10];

	public FlowLayout_1(String title) {

		super(title);
		setLayout(f11);
		// 레이아웃을 지정해 주지 않으면프레임은 기본이 Border이므로 마지막에 add한 것만 보임

		for (int i = 0; i < 10; i++) {
			btn[i] = new Button(i + "번 버튼");
			add(btn[i]);
		}

		setBounds(100, 100, 200, 200);
		setVisible(true);

	}

	public static void main(String[] args) {
		new FlowLayout_1("Test~");
	}

}

 

 

 

 

CardLayout

 

카드레이아웃은 한개의 컴포넌트를 한개의 컴포넌트로 표현하는 방법이다.

여러개의 컴포넌트를 여러개의 카드에 배치하는 경우에 각 카드에 이름을 붙여 사용한다. 

해당 카드를 출력할때, 해당카드의 이름을 show( ) 메소드로 출력하거나, first( ) , next( ), last( )등의 메소드를 이용해 화면을 바꿔가며 출력 할 수 있다. 

 

카드레이아웃 사용과정 

-setLayout( ) 메소드를 이용해 카드레이아웃 등록

-카드 레이아웃에 등록할 Panel을 만든다. 

-add( ) 메소드를 이용해 패널을 컨테이너에 추가한다. 

-원하는 카드를 보여주기 위해서 show( ), next( ), first( ), last( )메소드를 사용한다.

 

package ja_0804;

import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class CardLayout_1 extends Frame {

	CardLayout card = new CardLayout();
	Panel[] panel = new Panel[5];
	Color[] color = { Color.red, Color.blue, Color.yellow, Color.green, Color.cyan };
	int x, y;

	public CardLayout_1(String str) {
		super(str);
		setLayout(card);
		MouseHandle mouse = new MouseHandle();

		for (int i = 0; i < 5; i++) {
			panel[i] = new Panel();
			panel[i].setBackground(color[i]);
			panel[i].addMouseListener(mouse);

			add((new Integer(i)).toString(), panel[i]);

		}

		setSize(300, 300);
		setVisible(true);

	}

	public class MouseHandle extends MouseAdapter { //마우스 이벤트 처리

		public void mouseClicked(MouseEvent e) {//마우스가 클릭될때
			card.next(CardLayout_1.this);
			System.out.println(e.toString());
		}

	}

	public static void main(String[] args) {
		new CardLayout_1("Test");
	}

}
package ja_0804;

import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Label;
import java.awt.Panel;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class CardLayout_2 {
	public static void main(String[] args) {

		final Frame ff = new Frame("CardLayOutTest");
		final CardLayout card = new CardLayout(10, 20);
		// 10 : 좌우측 여백을 10 주겠다.
		// 20 : 상하 여백을 20만큼 주겠다.

		ff.setLayout(card);

		Panel card_1 = new Panel();

		card_1.setBackground(Color.yellow);
		card_1.add(new Label("****** Card_1 *****"));

		Panel card_2 = new Panel();

		card_2.setBackground(Color.green);
		card_2.add(new Label("@@@@@ Card_2 @@@@@"));

		Panel card_3 = new Panel();

		card_3.setBackground(Color.cyan);
		card_3.add(new Label("&&&& Card_3 &&&&"));

		ff.add(card_1, "1"); // 프레임에 card_1을 1이라고 이름 붙여주기
		ff.add(card_2, "2");
		ff.add(card_3, "3");

		class Handler extends MouseAdapter {

			public void mouseClicked(MouseEvent e) {

				System.out.println(e.toString());

				// 마우스오른쪽 버튼이 눌렸을때
				// if(e.getModifiers() == e.BUTTON3_MASK)

				if (e.getButton() == e.BUTTON3) { // 마우스오른쪽
					// e.getButton() : e가 가진 마우스 정보를 가져옴
					// e : 내가 누른 마우스정보(마우스에서 발생한 이벤트정보를 가지고있음)
					card.previous(ff); // CardLayout의 이전 panel을 보여줌
				} else {
					card.next(ff); // CardLayout의 이후 패널을 보여줌
				}

			}

		}// card Handler

		// 마우스 이벤트를 패널들에 달아줌
		// 이벤트가 발생하면 Handler가 작동한다
		card_1.addMouseListener(new Handler());
		card_2.addMouseListener(new Handler());
		card_3.addMouseListener(new Handler());

		ff.setSize(300, 300);
		ff.setLocation(300, 400);
		ff.setVisible(true);

	}

}

좌클릭(버튼1) 하면 앞으로가고 우클릭(버튼3)하면 뒤로감 / 버튼2 = 스크롤 버튼

 

(예) - 객체를 생성하지 않고 매소드 안에서 이벤트를 처리하는 방법 

package ja_0804;

import java.awt.Button;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.security.PublicKey;

import javax.print.attribute.standard.Sides;

public class CardLayout_3 extends Frame {

	Button first, prev, next, last;
	Panel buttons;
	Panel slide;
	Panel card1, card2, card3, card4, card5; // slide에 포함될 패널

	CardLayout card;

	public CardLayout_3(String title) {
		super(title);

		slide = new Panel();
		card = new CardLayout();

		slide.setLayout(card);

		// 버튼을 담을 패널

		buttons = new Panel();
		buttons.setLayout(new FlowLayout());

		first = new Button("<<");
		prev = new Button("<");
		next = new Button(">");
		last = new Button(">>");

		buttons.add(first);
		buttons.add(prev);
		buttons.add(next);
		buttons.add(last);
		
		
          //이벤트를 처리하는데 객체를 만들지 않고 메소드안에서 처리하고 끝내는 방법(에너니머스 방식)
		first.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// CardLayout의 첫번째 slide(Panel)이 보이도록한다.
				card.first(slide); // 여기서 first는 처음으로 돌아간다는 의미, 내가만든 버튼 아님

			}
		});

		prev.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				card.previous(slide); // 이전

			}
		});

		next.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				card.next(slide);// 다음

			}
		});

		last.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				card.last(slide);// 마지막slide(panel)이 보이도록한다.

			}
		});

		card1 = new Panel();
		card1.setBackground(Color.green);
		card1.add(new Label("첫번째 페이지"));

		card2 = new Panel();
		card2.setBackground(Color.orange);
		card2.add(new Label("두두번째 페이지"));

		card3 = new Panel();
		card3.setBackground(Color.cyan);
		card3.add(new Label("세세세번째 페이지"));

		card4 = new Panel();
		card4.setBackground(Color.gray);
		card4.add(new Label("네번째 페이지"));

		card5 = new Panel();
		card5.setBackground(Color.red);
		card5.add(new Label("다섯다섯번째 페이지"));

		slide.add(card1, "1");
		slide.add(card2, "2");
		slide.add(card3, "3");
		slide.add(card4, "4");
		slide.add(card5, "5");

		add("South", buttons);
		add("Center", slide);

		setSize(300, 300);
		setLocation(300, 300);
		setVisible(true);

		card.show(slide, "3"); // 세번째 슬라이드가 제일 먼저 나타남

	}

	public static void main(String[] args) {
		new CardLayout_3("Card Test~");
	}

}

 

'KH > JAVA' 카테고리의 다른 글

# 43 Event ( 이벤트 ) -ActionEvent, Window  (0) 2022.08.04
# 42 Dialog  (0) 2022.08.04
# 40 AWT(2) - TextField , Menu  (0) 2022.08.03
# 39 AWT- Pane1,Button,CheckBox,Label,Frame,Choice  (0) 2022.08.01
#38 Search , Map  (0) 2022.07.29