티스토리 뷰
객체, 이벤트 이용해보기! #Java #Swing #리스너 #JFrame #JPanel #JLabel #KeyListener #초보 #코딩 #프로그래밍 #개념
배곧동개발자 2023. 6. 25. 15:23
안녕하세요,
배곧동개발자 입니다.
제가 맨날 하는 C# 말고, 자바를 이용해서 윈도우폼을 짠다면? swing이라는거로 짤 수 있습니다-
swing은 대학교 때에 슬적 건드려본 기억이 있기에, 간만에 하려니 생소할줄 알았으나 다행히 C#이랑 크게 다를바 없네요.
drag하여 폼을 쉽게 만들던걸 하나하나 직접 선언하고 정의해야 한다는 정도?! 껌이지!
여튼! 가볍게 키 이벤트를 받아서 움직이는 패널을 하나 만들어볼까합니다.
// 메인이 될 폼(프레임)
JFrame temp = new JFrame();
// 프레임 사이즈
temp.setSize(300, 300);
// 보여준다! (이게 왜 기본 true가 아니지?)
temp.setVisible(true);
// 자식 컨트롤러들 정렬이라는데.. 난 자유로우니 일단 null
temp.setLayout(null);
이렇게 폼을 선언해주고 거기에 패널을 하나 만들어줄꺼에요-
// 움직이게 될 패널 선언
JPanel panel = new JPanel();
// 위치와 크기를 한번에 설정하는 bounds
panel.setBounds(10, 10, 70, 70);
// 패널의 색깔
panel.setBackground(Color.black);
// 왜 이게 디폴트가 아니냐고!
panel.setVisible(true);
그리고 이거는 써비스- 패널 안에 들어갈 레이블 하나 만들어줄까해요!
// 레이블(문구) 선언
JLabel lbl = new JLabel();
// 최초 문구는 준비이!!
lbl.setText("준비!");
// 색깔은 흰색! 패널이 검정이니까 보색이지!
lbl.setForeground(Color.white);
// 위에 만들어놓은 패널에 넣어준다
panel.add(lbl);
이렇게 하면 등장인물들은 모두 만들었습니다.
//만든 패널을 폼에 넣어준다
temp.add(panel);
아, 이거까지 넣어서 폼에 패널을 넣어줬어요. 이러면 어떻게 되냐?
이렇게 되지요- 딱 예상했던대로 되었지요?
폼을 만들었고 > 패널을 만들었으며 > 레이블을 만들어서 > 레이블을 패널에 넣고 > 패널을 폼에 넣는다.
자 이제 이 패널을 움직여줄껀데요- 폼 전체에 이벤트를 줄껍니다. 방향키를 눌렀을 때에 움직이는 이벤트!
각각의 객체에 이벤트를 입혀줄 때에는 아래와같은 방식으로 입혀주는데요-
객체.add이벤트리스너(new 이벤트리스너() {
// 대부분 자동완성! (기존 이벤트 오버라이드)
});
자동완성이 편하기는한데, 쓸대없는것까지 오버라이드 되어버리니 쓰잘대기없는 코드가 늘어나는 느낌이 드네요.
여튼, 폼에다가 키입력하는 이벤트를 줘봅시다!
// 폼에 addKeyListener를 통해서 키 이벤트를 생성
temp.addKeyListener(new KeyListener() {
// 키가 입력되었을 때에 이벤트이므로 이 친구에 작성!
@Override
public void keyPressed(KeyEvent e) {
// 키 코드를 받아온다. 37:왼쪽 / 39:오른쪽 / 38:위쪽 / 40: 아래쪽
// 이거 모르겠으면 syso 찍어보자!
int code = e.getKeyCode();
// 패널의 위치를 바꿔줘야하니까, 현재 위치를 불러옴
Point p = panel.getLocation();
if(code == 40){
// 코드 40일때, 즉 아래쪽키 눌렀을 때에 위치 및 문구 수정
panel.setLocation(p.x,p.y+10);
lbl.setText("아래로~");
}else if(code == 39){
// 코드 39일때, 즉 오른쪽키 눌렀을 때에 위치 및 문구 수정
panel.setLocation(p.x+10,p.y);
lbl.setText("오른쪽~");
}else if(code == 37){
// 코드 37일때, 즉 왼쪽키 눌렀을 때에 위치 및 문구 수정
panel.setLocation(p.x-10,p.y);
lbl.setText("왼쪽~");
}else if(code == 38){
// 코드 38일때, 즉 위쪽키 눌렀을 때에 위치 및 문구 수정
panel.setLocation(p.x,p.y-10);
lbl.setText("위로~");
}
}
// 이 아래 코드들은 삭제하고싶다.
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyReleased(KeyEvent e) {}
});
이벤트 주는 방법 좀 이해 가시나요?
제가 제이쿼리 하기 전이였다면 이거 이벤트주는 방식 이해 잘 안갔을거같은데, 약간 풀어서 설명하자면
// Step1. temp에 키 이벤트로 "리스너함수"를 실행한다고 지정
temp.addKeyListener(리스너함수);
// Step2. 리스너함수란 다른게 아니고 새로운 리스너 함수를 만들꺼야
temp.addKeyListener ( new KeyListener(){ 내용 } );
// Step3. 그 새로운 리스너 함수란 말이지~ 내용을 채워주는거지!
temp.addKeyListener ( new KeyListener(){
public void keyPressed(KeyEvent e){
//내용 내용 내용
}
} );
어떠신가요?
복잡해보이는 패턴이긴한데 저렇게 하나하나 뜯어보면 결국 이벤트를 생성할 때에 실행함수를 그 자리에서 새로 만들기 때문에 저렇게 복잡해 보이는것일 뿐이랍니다.
이해하고 넘어간다면 안헷갈리실거에요-
아, 여튼 그래서 저렇게 코드를 입히면 어떻게 되냐고요?
이렇게 방정맞은 프로그램이 탄생하게 되지요-
제가 진행중인 "작은프로젝트"에 스윙 이용도 몇가지 진행해볼까 해서 슬쩍 알아보고 적어봤는데, 이해하기 어렵진 않으셨죠?
주석 나름 열심히 달았습니다- 혹 이해 안되는 부분 있으면 댓글 달아주세요!
이만,
배곧동개발자 였습니다.
'프로그래밍 > Java JSP' 카테고리의 다른 글
- Total
- Today
- Yesterday