본문 바로가기

JAVA 프로젝트

[JAVA]swing에서 CardLayout로 패널 바꾸기와 패널에서 패널로 데이터 전달하기

반응형

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를 사용하기위해 사용합니다.

 

 

반응형