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(); //객체 생성과 동시에 창 띄우기
}
}
컴포넌트 생성과 배치는 윈도우빌더 사용
자동생성된 코드를 바탕으로 필요한 기능 추가하기!!
-> 버튼 동작 이런거..
액션 이벤트 : actionPerformed
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"));
발생순서:
mouseEntered -> mousePressed -> mouseReleased -> mouseClicked -> mouseExited
마우스 좌표 얻기:
int getClickCount( ) - 연속 클릭 횟수
int getX( ), int getY( ), Point getPoint( ) - 이벤트 발생 당시의 (x, y), 위치는 컴포넌트에 상대적
KeyListener : keyPressed -> keyReleased -> keyTyped
가상 키 코드 : VK_LEFT, VK_RIGHT, VK_UP, VK_DOWN .....
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);
}
}


기본 세팅

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에서 어떤 것들을 작성해야하는 생각하기 코드 작성하는 흐름?을 생각하자 코드가 이제 길어지니까 람다식 익숙해지도록 더 사용해보자