林's

[JAVA] Swing의 CardLayout 사용법 본문

프로그래밍/자바프로그래밍

[JAVA] Swing의 CardLayout 사용법

풀림이 2019. 4. 7. 12:42

JAVA Swing Card Layout(카드 레이아웃)

 

 

자바 스윙에서 간혹 쓰는 레이아웃인데. 도박게임의 패를 만들거나 이미지를 클릭하여 한 페이지에 번갈아가며 출력하고 싶을 때 사용하면 좋다. 이 예제는 다음과 같은 흐름을 따라 제작하였다.

  1. CardLayout 객체 생성
  2. SetLayout 을 통해 레이아웃 지정
  3. 이벤트 처리 함수에서 show함수 호출하기.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class Deck extends JFrame {
	
	// 레이아웃 매니저와 패널, 패널 안에 들어갈 라벨을 초기화합니다.
	CardLayout cardLayout = new CardLayout();
	JPanel[] panel = new JPanel[10];
	JLabel[] label = new JLabel[10];
	
	// 프레임 생성자
	public Deck() {
		makeFrame();
		makeCards(this);
		setVisible(true);
	}

	// 카드 레이아웃이 적용된 프레임 생성자
	private void makeFrame() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setTitle("카드 레이아웃 실습");
		setSize(100,100);
		setLayout(cardLayout);
		// 0~9까지의 입력을 받아 이름에 맞는 카드를 찾아 출력해주는 키 리스너
		addKeyListener(new KeyListener() {
			
			public void keyTyped(KeyEvent e) {
				char input = e.getKeyChar();
				if ( input >= '0' && input <= '9' ) {
					cardLayout.show(getContentPane(), ""+input);
				}
			}
			
			public void keyReleased(KeyEvent e) {}
			public void keyPressed(KeyEvent e) {}
		});
	}
	
	// 카드레이아웃이 적용된 프레임을 받아와 패널을 추가한다.
	private void makeCards(JFrame frame) {
		// 패널 만들기
		for (int i = 0; i < 10; i++) {
			// 색깔 랜덤 생성
			int r = (int)(Math.random()*255);
			int g = (int)(Math.random()*255);
			int b = (int)(Math.random()*255);
			Color color = new Color(r, g, b);
			
			// 패널에 색깔 부여
			panel[i] = new JPanel();
			panel[i].setBackground(color);
		}
		// 패널에 글씨 넣기
		for (int i = 0; i < 10; i++) {
			label[i] = new JLabel(""+i);
			
			//글꼴 설정
			Font font = new Font("Times New Roman", Font.ITALIC, 30);
			label[i].setFont(font);
			
			//패널에 위의 라벨을 추가하기
			panel[i].add(label[i]);
		}
		// 0~9까지 패널들에 카드 레이아웃의 Show 메소드가 인식할 수 있게 이름을 부여한다.
		for (int i = 0; i <10; i++) {
			frame.add(panel[i], ""+i);
		}
	}
	
	public static void main(String[] args) {
		new Deck();
	}
}

 이 레이아웃의 경우 크게 2가지를 주의해서 사용해야 한다. 우선

 

1. makeFrame() 메서드를 살펴보자.

 

setLayout()에서 cardLayout으로 레이아웃을 바꿔주었다.

그리고 나서 사용자로부터 숫자를 입력받았을 때 이와 같은 이름을 갖는 카드 레이아웃의 패를 출력하는 keyTyped 함수를 오버라이딩 하였다.

 

카드 레이아웃은

 

show(부모 컨테이너, 카드 패의 id)라는 함수

 

를 통해서 id에 해당하는 JFrame을 최상단에 출력해줄 수 있다.

이 예제의 경우 부모 컨테이너가 MainFrame의 레퍼런스를 갖고 오기 위해 getContentPane()을 사용하였다.

그리고 출력하고 싶은 카드의 id를 넘기기 위해 읽은 키를 Strings으로 변환하여 전달하였다.

 

2. makeCards() 라는 메서드 안의 frame.add(); 라는 함수가 보이는가?

 

이 함수는 cardLayout이 적용될 컨테이너인 JFrame(카드패) 에 각 카드라고 할 수 있는 JPanel(카드들)을 삽입할 때 번호를 부여하고 있는 함수이다.

 

이제 키 리스너의 show 함수가 작동하면 입력받은 값에 맞는 카드 패를 보여줄 수 있다!

'프로그래밍 > 자바프로그래밍' 카테고리의 다른 글

[JAVA] MP3 플레이어  (0) 2019.04.07
[JAVA] 전자앨범  (0) 2019.04.07
Comments