1. CardLayout
cardLayout을 이용하여 원하는 패널을 불러오는 방법
1) frame부분
package main;
import game.ChoicePanel;
import game.GameImage;
import game.GamePanel;
import record.RecordPanel;
import javax.swing.*;
import java.awt.*;
public class MainFrame extends JFrame {
private MainPanel mainPanel;
private ChoicePanel choicePanel;
private RecordPanel recordPanel;
private GamePanel gamePanel;
private CardLayout cardLayout;
public GamePanel getGamePanel(){
return gamePanel;
}
public CardLayout getCardLayout(){
return cardLayout;
}
public MainFrame(){
setSize(430,730);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("Main Frame");
cardLayout = new CardLayout();
gamePanel = new GamePanel(this);
getContentPane().setLayout(cardLayout);
getContentPane().add("main",new MainPanel(this));
getContentPane().add("choice",new ChoicePanel(this));
getContentPane().add("record",new RecordPanel(this));
getContentPane().add("game",gamePanel);
setVisible(true);
}
}
2) panel부분
package main;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MainPanel extends JPanel {
private MainFrame mainFrame;
private JButton game_btn;
private JButton record_btn;
public MainPanel(MainFrame mainFrame){
game_btn = new JButton("START");
record_btn = new JButton("RECORD");
game_btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
mainFrame.getCardLayout().show(mainFrame.getContentPane(),"choice");
}
});
record_btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
mainFrame.getCardLayout().show(mainFrame.getContentPane(),"record");
}
});
add(game_btn);
add(record_btn);
setVisible(true);
}
}
해당 코드에 대해 핵심만 설명해보겠습니다.
우선 frame쪽 부터 알아보겠습니다.
getContentPane().add("main",new MainPanel(this));
이 부분은 cardLayout에 MainPanel이라는 카드를 추가하고 이 카드의 이름을 "main"이라고 지정해줍니다.
여기서 생성자 안에 this를 사용하는데 panel부분을 보시면
public MainPanel(MainFrame mainFrame){
MainFrame의 mainFrame을 parameter로 받아왔습니다. 그래서 이를 위해 생성자에서 mainFrame의 자기것을 사용하기 위해 this를 사용합니다.
mainFrame을 받아와야 하는 이유는 panel에서 cardLayout을 이용하는데 mainFrame에 정의된 내용을 사용해야 하기 때문입니다.
game_btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
mainFrame.getCardLayout().show(mainFrame.getContentPane(),"choice");
}
});
해당 부분과 같이 mainFrame을 사용하기 위해 각 panel의 생성자에서 parameter로 mainFrame을 가져와야합니다.
2. 패널에서 패널로 데이터 전달하는 방법
패널에서 패널로 데이터를 전달하기 위해 저는 getter와 setter를 이용하였습니다.
우선 GameImage라는 전달할 변수를 정의한 class를 생성해줍니다.
package game;
import javax.swing.*;
public class GameImage {
private String animal;
public String getAnimal() {
return animal;
}
public void setAnimal(String animal) {
this.animal = animal;
}
}
여기서 lombok을 사용하면 @Getter @Setter로 빠르게 생성할 수 있는데 노트북 포멧해서 lombok설정값이 날라간것 같다.
이제
데이터를 보낼 패널입니다.
우선 클래스 변수를 생성해줍니다.
GameImage gi;
이후
game_btn1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
mainFrame.getCardLayout().show(mainFrame.getContentPane(), "game");
gi = new GameImage();
gi.setAnimal("cat");
mainFrame.getGamePanel().updateGameImage(gi);
}
});
해당 코드에서
gameImage를 생성자를 통해 만들어주고
setter를 이용해 저장할 값을 넣어줍니다.
이후 데이터를 받을 패널에서
public void updateGameImage(GameImage gameImage) {
animal = gameImage.getAnimal();
try {
if ("cat".equals(animal)) {
game_character_img = new ImageIcon(GamePanel.class.getResource("/image/before_throw_cat2.png"));
System.out.println("Updated to cat image");
} else if ("rabbit".equals(animal)) {
game_character_img = new ImageIcon(GamePanel.class.getResource("/image/before_throw_rabbit2.png"));
System.out.println("Updated to rabbit image");
} else {
System.out.println("Unknown animal: " + animal);
}
} catch (Exception e) {
System.out.println("Error loading image: " + e.getMessage());
e.printStackTrace();
}
getter를 통해 값을 불러오면 됩니다.
여기서
updateGameImage(gi);
gi를 paramter로 사용하는데 GameImage라는 class를 사용하기위해 사용합니다.
'JAVA 프로젝트' 카테고리의 다른 글
React와 Spring Project에서 구글 소셜 로그인 구현 (3) | 2025.07.09 |
---|