Language/Java

[자바API_AWT/Swing] 배치관리자와 레이아웃 종류(2)_윈도우창(JFrame) 예제

simDev1234 2022. 3. 27. 22:21

 공통부분

- 윈도우창이기에 컨테이너는 JFrame을 사용한다.

- 아래의 예제들에서 JFrame의 세팅값(위치/크기/보임상태/종료버튼방식)은 모두 동일하게 할 것이다.

 

■ BorderLayout

- JFrame컨테이너의 디폴트 배치관리자는 BorderLayout이다.

- BorderLayout은 컴포넌트 간격을 지정하지 않을 거면 초기화를 딱히 해줄게 없다.

- 컴포넌트를 넣어줄 때 어느 영역(North/South/West/East/Center)에 위치시킬지 지정해준다.

package window;

import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;

public class BorderLayoutTest extends JFrame{
	
	BorderLayoutTest(){

		//JFrame의 기본 세팅 메소들 
		this.setTitle("BorderLayout Test");
		this.setLocation(200,200);
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		//버튼 컴포넌트를 5개 추가 - add()
		//[레이아웃] 디폴트로 BorderLayout으로 설정되어 있음
		//[1] 먼저 버튼 객체부터 생성한다.
		//    **버튼 생성메소드 JButton("버튼 안에 들어갈 문자열")
		//                               이미지나 아이콘도 넣을 수 있다.
		JButton jbtNorth = new JButton("NORTH");
		JButton jbtSouth = new JButton("SOUTH");
		JButton jbtWest = new JButton("WEST");
		JButton jbtEast = new JButton("EAST");
		JButton jbtCenter = new JButton("CENTER");
		//[2] 버튼을 컨테이너에 넣어둔다. **이때, 버튼이 들어갈 위치를 지정한다.
		this.add(jbtNorth,BorderLayout.NORTH);
		this.add(jbtSouth,"South");
		this.add(jbtWest,BorderLayout.WEST);
		this.add(jbtEast,"East");
		this.add(jbtCenter); //생략시 디폴트 CENTER로 지정
		
		//[유의점] 버튼 컴포넌트들을 먼저 JFrame에 넣어주고 JFrame 사이즈를 잡아줘야 한다.
		//         why? BorderLayout에서는 윈도우창 크기에 따라서 버튼의 너비가 자동 설정되기 때문.
		this.setSize(400,400);
		
		
	
	}

	public static void main(String[] args) {
		new BorderLayoutTest();
	}

}

>> 실행 결과

 

■ FlowLayout

- JFrame컨테이너의 디폴트 배치관리자는 BorderLayout이다.

- Container의 setLayout() 메소드를 사용해서 레이아웃을 FlowLayout으로 변경한다.

  *레이아웃도 객체이기 때문에 레이아웃 객체 생성을 먼저 해줘야한다.

- FlowLayout을 생성할 때 컴포넌트들의 정렬방식과 수평/수직 간격을 초기화해준다.

  *기본적으로 최상단부터 나열시키는데, 정렬방식은 그의 좌(LEADING), 중간(CENTER), 끝(TRAILING) 중 하나를 고를 수 있다.

package window;

import java.awt.FlowLayout;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class FlowLayoutTest extends JFrame{
	
	FlowLayoutTest() {
		//JFrame 기본 세팅
		this.setTitle("FlowLayout Test");
		this.setLocation(400,400);
		this.setVisible(true);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		//Container 레이아웃 변경
		//[참고] setLayout()의 매개변수는 LayoutManager 인터페이스다.
		//[생성시] 정렬방식, 수직/수평간격 지정
		this.setLayout(new FlowLayout(FlowLayout.CENTER,10,10));;
		
		//컴포넌트들을 생성해서 넣어준다.
		JLabel label = new JLabel("Select Language");
		this.add(label);
		
		String[] comLang = {"Java","C","C++","PHP","Javascript","python"};
		JComboBox<String> comLangBox = new JComboBox<String>(comLang);
		comLangBox.setSelectedIndex(0);
		this.add(comLangBox);
		
		this.setSize(400,400);
	}
	
	public static void main(String[] args) {
		new FlowLayoutTest();
	}
}

>> 실행결과

 

■ GridLayout

- Container의 setLayout() 메소드를 사용해서 레이아웃을 GridLayout으로 변경한다.

  *이번에도 레이아웃 객체생성을 먼저한다.

- Grid레이아웃을 생성할 때, 행/열 갯수, 수평/수직 간격을 초기화한다.

- Grid는 행을 우선으로 해서 컨포넌트들의 열의 너비를 지정하므로 이점을 유의한다.

package window;

import java.awt.Color;
import java.awt.GridLayout;

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

public class GridTest extends JFrame{
	
	public GridTest() {
		super("GridLayout Test");
		setVisible(true);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setLocation(200,200);
		
		//Grid로 레이아웃 변경
		GridLayout g = new GridLayout(3,3,10,10);
		this.setLayout(g);
		
		//컴포넌트 생성, 추가
		for(int i = 0; i < 10; i++) {
			JPanel jp1 = new JPanel();
			jp1.add(new JLabel("PANEL"));
			jp1.setSize(30,30);
			Color c = new Color(0xfe9cc3);
			jp1.setBackground(c);
			this.add(jp1);
		}
		
		
		setSize(400,400);
		
	}

	public static void main(String[] args) {
		new GridTest();
	}

}

>> 실행 결과

 

■ CardLayout

- JFrame 윈도우창의 디폴트 BorderLayout배치는 그대로 둔다.

- 윈도우 창 상단에 패널+버튼들로 탭을 만든다. *패널 - FlowLayout

- 윈도우 창 하단에 패널+패널들로 카드를 만든다. *패널 - CardLayout

  *묶어주는 안에 카드를 넣을 때는, 문장열로 카드명을 지정한다.

package window;

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.FlowLayout;

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

public class CardTest extends JFrame{

	public CardTest(){
		super("GridLayout Test");
		setVisible(true);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setLocation(200,200);
		
		//메뉴상단만들기
		JPanel menu = new JPanel(new FlowLayout(FlowLayout.CENTER, 20, 20));
		JButton jbt1 = new JButton("< Previous");
		JButton jbt2 = new JButton("CARD");
		jbt2.setBackground(Color.MAGENTA);
		JButton jbt3 = new JButton("Next >");
		menu.add(jbt1);
		menu.add(jbt2);
		menu.add(jbt3);
		this.add(menu,"North");
		
		//카드 만들기
		JPanel cardSet = new JPanel(new CardLayout());
		cardSet.add(new Screen1(),"s1");
		cardSet.add(new Screen2(),"s2");
		cardSet.add(new Screen2(),"s3");
		this.add(cardSet);
		
		
		setSize(400,400);
	}

	public static void main(String[] args) {
		new CardTest();
	}

}

class Screen1 extends JPanel{

	public Screen1(){
		this.setLayout(new BorderLayout());
		Color c = new Color(0xe43e22);
		JLabel label = new JLabel("안녕!",JLabel.CENTER);
		this.setBackground(c);
		this.add(label,"Center");
	}
	
}
 
class Screen2 extends JPanel{
	public Screen2() {
		this.setLayout(new BorderLayout());
		Color c = new Color(0x1ab6a8);
		JLabel label = new JLabel("잘 지냈어?",JLabel.CENTER);
		this.setBackground(c);
		this.add(label,"Center");
	}
}

class Screen3 extends JPanel{
	public Screen3() {
		this.setLayout(new BorderLayout());
		Color c = new Color(0x985396);
		JLabel label = new JLabel("이번주 주말에 뭐해?",JLabel.CENTER);
		this.setBackground(c);
		this.add(label,"Center");
	}
}

>> 실행 결과