
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);
}
}
반복문을 통해 생성, 추가, 전환 제어 등 반복 작업을 효율적으로 처리할 수 있음
➡ 반복문 처리 하려면 같은 자료형으로 묶어야함
➡ 그래서 최상위객체 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);
}
//상수로 정의
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문 없이 한 번에 처리 가능해서 코드가 간결해짐