여러 페이지 전환 (OOP)

heeezni·2025년 5월 29일

Java GUI 프로젝트

목록 보기
8/20
post-thumbnail

1. 공통 기능 추상화를 위해 Page 클래스를 상속

Home, Product, MyPage, CS 클래스는 모두
공통 부모 클래스 Page를 상속

➡ 각 페이지가 공통된 인터페이스(setVisible(), 레이아웃 등)를 따르게 만들고, 공통된 방식으로 제어할 수 있게끔 추상화함

package shop.pages;
//쇼핑몰 페이지에서 모든 페이지들의 최상위 객체
import java.awt.Dimension;
import java.awt.Font;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Page extends JPanel {
	JLabel la_title;
	
	public Page(String title) {
		la_title = new JLabel(title);
		la_title.setFont(new Font("굴림", Font.BOLD, 30));
		
		add(la_title);
		setPreferredSize(new Dimension(800,650)); 
        //크기 지정하지 않으면 패널이 패킹됨 (pack)
        // =JLabel사이즈만큼 쪼그라들어있다
	}
}

그럼 다른 하위 페이지들은 super(매개변수)로 부모 생성자 호출 후, 개별적으로 추가하고 싶은 것만 넣으면 됨

package shop.pages;
//쇼핑몰의 메인 페이지
import java.awt.Color;

public class Home extends Page{

	public Home() {
		super("<메인 페이지>");
		setBackground(Color.yellow);
	}
}

2. 반복문 처리를 위해 배열에 묶어서 관리

반복문을 통해 생성, 추가, 전환 제어 등 반복 작업을 효율적으로 처리할 수 있음
➡ 반복문 처리 하려면 같은 자료형으로 묶어야함
➡ 그래서 최상위객체 Page 만듦
➡ 페이지들을 Page자료형의 배열로 관리하기

Page[] pageArray = new Page[4];
pageArray[0] = new Home();
pageArray[1] = new Product();
pageArray[2] = new MyPage();
pageArray[3] = new CS();

for (int i = 0; i < pageArray.length; i++) {
    container.add(pageArray[i]);
    pageArray[i].setVisible(false);
}
// 원하는 페이지만 보여지게 처리하는 메서드
public void showPage(int target) { //보여지길 원하는 페이지의 인덱스를 호출 시 결정

	for(int i=0; i<pageArray.length; i++) {
		/*if(i==target) {
				pageArray[target].setVisible(true);				
		} else {
				pageArray[i].setVisible(false);				
		}*/
		pageArray[i].setVisible((i==target)? true : false);				
	}
}
	@Override
	public void actionPerformed(ActionEvent e) {	
		JButton obj = (JButton)e.getSource(); //Object → JButton 다운캐스팅
        //이유: Object에는 getClientProperty() 메서드 없음 (버튼의 메서드임)
		
		int id = (int)obj.getClientProperty("id"); //눌린 버튼 마다 자신의 id 값인 0,1,2,3
		System.out.println("당신이 누른 버튼이 가진 상수 값은"+id);
		showPage(id); 
	}

3. 가독성을 위한 상수처리

//상수로 정의
public static final int HOME=0;
public static final int PRODUCT=1;
public static final int MYPAGE=2;
public static final int CS=3;
    
public ShopMain() {
	pageArray[HOME] = new Home();
	pageArray[PRODUCT] = new Product();
	pageArray[MYPAGE] = new MyPage();
	pageArray[CS] = new CS();

	//개발자가 버튼에 추가적인 값을 심을 수 있다
	bt_home.putClientProperty("id", HOME);
	bt_product.putClientProperty("id", PRODUCT);
	bt_mypage.putClientProperty("id", MYPAGE);
	bt_cs.putClientProperty("id", CS);
}
  • 매직 넘버(0, 1, 2, 3) 대신 상수를 사용하여 어떤 값이 어떤 의미인지 명확히 함

  • 코드 가독성 향상 및 유지보수 편의성 확보

컴포넌트에 데이터 심기

putClientProperty() :
JComponent(예: JButton, JLabel 등)에
임의의 값을 key-value 형태로 저장할 수 있는 메서드

메서드설명
putClientProperty("key", value)컴포넌트에 데이터 심기
getClientProperty("key")심어둔 데이터 꺼내기
장점이벤트 처리 간결화, 코드 가독성 향상, 버튼별 속성 저장 가능

➡ ✅ 이 방식을 쓴 이유 :

어떤 버튼인지 구분하기 위해 각 버튼에 식별자(id)를 심어두었기 때문에
버튼이 많아져도 if문 없이 한 번에 처리 가능해서 코드가 간결해짐

profile
아이들의 가능성을 믿었던 마음 그대로, 이제는 나의 가능성을 믿고 나아가는 중입니다.🌱

0개의 댓글