#7 MVC, Swing, Event

지우·2026년 1월 7일

java2

목록 보기
9/13

Swing

JFrame

JFrame 이용해서 윈도우 만드는 방법
1) 상속 2) 합성
=> 합성을 잘 써보자

public class MyWindow {
	JFrame frame = new JFrame(); //프레임 생성
    
    public MyWindow() {
    	frame.setSize(400, 300); //창 크기
        frame.setVisible(true); //창 보이기
    }
    
    public static void main(String[] args) {
    	new MyFrame(); //객체 생성과 동시에 창 띄우기
    }
}

컴포넌트

컴포넌트 생성과 배치는 윈도우빌더 사용
자동생성된 코드를 바탕으로 필요한 기능 추가하기!!
-> 버튼 동작 이런거..

Event

액션 이벤트 : actionPerformed

Event 리스너

event 리스너 : 이벤트를 처리하는 코드
구현 방법 : 주로 익명클래스 / 람다식 사용

// 익명클래스 사용
JButton btn = new JButton("click");
btn.addActionListener(new ActionListener() {
	@Override
    public void actionPerformed(ActionEvent e) {
    	System.out.println("익명클래스-clicked");
    }
});
// 람다식 사용
JButton btn = new JButton("click");
btn.addActionListener(e -> System.out.println("람다식-clicked"));

Mouse Event

발생순서:
mouseEntered -> mousePressed -> mouseReleased -> mouseClicked -> mouseExited

마우스 좌표 얻기:
int getClickCount( ) - 연속 클릭 횟수
int getX( ), int getY( ), Point getPoint( ) - 이벤트 발생 당시의 (x, y), 위치는 컴포넌트에 상대적

Key Event

KeyListener : keyPressed -> keyReleased -> keyTyped

가상 키 코드 : VK_LEFT, VK_RIGHT, VK_UP, VK_DOWN .....

MVC 패턴

Model - View - Controller

Lab#8

public class Model {
	private String value = "hi";
	public String getValue() {
		return value;
	}
	
	public void setValue(String value) {
		this.value = value;
	}
}
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JLabel;
import java.awt.Color;
import java.awt.Font;

public class View extends JFrame{
	private JButton button;
	private JLabel label;
	
	public JLabel getLabel() {
		return this.label;
	}
	
	public JButton getButton() {
		return this.button;
	}
	public View() {
		getContentPane().setLayout(null);
		
		button = new JButton("Press Me !");
		button.setForeground(new Color(128, 255, 255));
		button.setFont(new Font("굴림", Font.PLAIN, 14));
		button.setBackground(new Color(255, 255, 255));
		button.setBounds(23, 144, 186, 288);
		getContentPane().add(button);
		
		label = new JLabel("");
		label.setBounds(233, 144, 258, 288);
		getContentPane().add(label);
		
		this.setSize(600, 500); //view 사이즈 설정
		this.setVisible(true);
	}
	
}
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Controller {
	private Model m;
	private View v;
	
	public Controller(Model m, View v) {
		this.m = m;
		this.v = v;
		
		this.v.getButton().addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				//action 넣기
				
				String s = v.getLabel().getText() + "hi ! ";
				v.getLabel().setText(s);
			}
			
		});
	}
}
public class Main {
	public static void main(String[] args) {
		Model m = new Model();
		View v = new View();
		Controller c = new Controller(m, v);
	}
}

망나니 잡기

Player

PlayerButton

MyView

기본 세팅

MyView( )

그외

결과

내가 했던 실수

1) 윈도우 빌더를 언제 어떻게 사용해야 하는지

MyView에서 코드 짜기 전에, 윈도우빌더에서 네개의 버튼을 미리 만들고 텍스트도 입력해놓음
-> 그러면 MyView로 다시 돌아갔을 때 하드코딩 되어있음
=> 윈도우빌더에서 버튼 위치와 크기만 대략 잡은 후, 소스 탭에서 클래스 타입 수정
++ 까먹지 말아야 할 부분 : JButton -> PlayerButton으로 수정!!


2) MyView와 PlayerButton 클래스의 기능의 차이 명확히 못함

PlayerButton - 버튼의 공통적 특성 정의 (색상, 크기, 쓰레드 동작 등)
MyView - 개별 버튼의 위치나 생성 관리

이 맥락으로, setSize는 모든 플레이어의 버튼의 크기가 동일하기 때문에 PlayerButton에, setLocation은 MovementType에 따라 설정할 것이기 때문에 PlayerButton 클래스 내부에서 이동 로직을 별도의 메소드로 분리하여 관리한다.

MVC 패턴 적용해서 생각해보면
Player - Model
MyView + PlayerButton 일부 - View
PlayerButton + MyView - Controller


3) JPanel의 사용
start 버튼, delay 버튼, goalLine을 하나의 패널에 넣어서 더 깔끔하게 관리 가능


추가적으로 알게된 것들
1) 키 바인딩 처리

명확하게 이해 못한거 같다 key 처리에 대해 더 공부하기


++ 추가적으로..

제미나이가 제안해준 작업 순서
1. Player와 PlayerButton 클래스 먼저 코딩
2. MyView에서 윈도우빌더 켜고 전체적인 레이아웃 잡기
3. 플레이어 버튼들은 윈도우빌더로 만들지 말고, 직접 소스 코드에서 bt1 = new PlayerButton(p1); 처럼 추가하기
=> 윈도우빌더는 틀을 잡는 용도로 사용!! Player 데이터가 주입되어야 하는 PlayerButton들은 직접 코드로 작성하기

느낀점

윈도우빌더 이용해서 코드 짜는게 익숙하지 않은 것 같다 실습 더 많이 해보자 특히 MyView 코드 짜는거 연습 필요할듯!!! PlayerButton에서 버튼들의 공통적 특성 / 메소드 짜고, 이를 구체화해서 MyView에 코드 작성 -> 내가 PlayerButton에서 만든 메소드들을 잘 구현하려면 MyView에서 어떤 것들을 작성해야하는 생각하기 코드 작성하는 흐름?을 생각하자 코드가 이제 길어지니까 람다식 익숙해지도록 더 사용해보자

0개의 댓글