자바 대각선으로 움직이기[swing]
- 프로그래밍/JAVA
- 2020. 1. 4.
250x250
자바 대각선으로 움직이기[swing]
안녕하세요.
오늘은 저번에 만들었던 키보드 이벤트를 조금 업그레이드시켜보려고 합니다.
저번에 만들었던 키보드 이벤트로는 버튼을 상하좌우로만 움직일 수 있었습니다.
그 이벤트를 조금 업그레이드해서 대각선으로도 이동할 수 있도록 해보겠습니다.
- 프레임 만들기.
- 키보드 이벤트 업그레이드.
- 결과
프레임 만들기
일단 아래 글을 참고해서 swing창을 만들어줍니다.
(프레임 만드는 방법.)
[프로그래밍/JAVA] - java swing 창 만들기
사용할 패널의 코드는 아래와 같습니다.
package test01;
import javax.swing.JFrame;
public class Main extends JFrame{
public Main() {
homeframe();//homeframe함수를 실행
}
/*프레임 설정*/
public void homeframe() {
setTitle("1");//타이틀
setSize(400,400);//프레임의 크기
setResizable(false);//창의 크기를 변경하지 못하게
setLocationRelativeTo(null);//창이 가운데 나오게
setLayout(null);//레이아웃 설정
setVisible(true);//창이 보이게
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//JFrame이 정상적으로 종료되게
}
/*메인함수*/
public static void main(String[] args){
new Main(); //실행하면 생성자가 실행됨.
}
}
키보드 이벤트 업그레이드.
이번 글에서는 아래의 글에서 작성한 키보드 이벤트를 업그레이드할 겁니다.
[프로그래밍/JAVA] - [java]자바 스윙 키보드, 마우스 이벤트
아래 코드는 위의 글에서 사용한 키보드 이벤트를 프레임에 적용시킨 코드입니다.
이제 아래의 코드를 업그레이드해보겠습니다.
package test01;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Main2 extends JFrame{
/*버튼*/
static JButton b1=new JButton("버튼1");
/*생성자*/
public Main2() {
homeframe();
b1.setBounds(0, 0, 20, 20);//버튼1의 위치 설정
mbutton1();
add(b1);//프레임에 패널을 추가
}
/*프레임 설정*/
public void homeframe() {
setTitle("1");//타이틀
setSize(400,400);//프레임의 크기
setResizable(false);//창의 크기를 변경하지 못하게
setLocationRelativeTo(null);//창이 가운데 나오게
setLayout(null);//레이아웃 설정
setVisible(true);//창이 보이게
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//JFrame이 정상적으로 종료되게
}
/*키보드 이벤트*/
void mbutton() {
b1.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {//키 코드로 스위치
case KeyEvent.VK_DOWN: //방향키(아래) 눌렀을때
b1.setLocation(b1.getX(), b1.getY()+10);
break;
case KeyEvent.VK_UP: //방향키(위)눌렀을때
b1.setLocation(b1.getX(), b1.getY()-10);
break;
case KeyEvent.VK_LEFT:// 방향키(왼)눌렀을때
b1.setLocation(b1.getX()-10, b1.getY());
break;
case KeyEvent.VK_RIGHT:// 방향키(오른)눌렀을때
b1.setLocation(b1.getX()+10, b1.getY());
break;
default:
break;
}
}
});
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new Main2();
}
}
먼저 boolean형식의 변수를 4개 추가하고 모두 false로 초기화합니다.
boolean upP = false;
boolean downP = false;
boolean leftP = false;
boolean rightP = false;
그 후 이런 식으로 코드를 추가합니다.
1. 키보드를 눌렀을 때 위에 추가해준 boolean형식의 변수를 true로 만들어줍니다.
2. true일 때 해당 방향으로 움직이게 해주는 코드입니다.
3. 키보드에서 손가락을 떼면 keyReleased에서 boolean변수를 모두 false로 만들어서 움직이지 않도록 해줍니다.
void mbutton() {
b1.addKeyListener(new KeyAdapter() {
@Override
/*키를 눌렀을때 호출*/
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {//키 코드로 스위치
case KeyEvent.VK_DOWN: //방향키(아래) 눌렀을때
downP = true;
//Home.b1.setLocation(Home.b1.getX(), Home.b1.getY()+10);
break;
case KeyEvent.VK_UP: //방향키(위)눌렀을때
upP = true;
//Home.b1.setLocation(Home.b1.getX(), Home.b1.getY()-10);
break;
case KeyEvent.VK_LEFT:// 방향키(왼)눌렀을때
leftP = true;
//Home.b1.setLocation(Home.b1.getX()-10, Home.b1.getY());
break;
case KeyEvent.VK_RIGHT:// 방향키(오른)눌렀을때
rightP = true;
//Home.b1.setLocation(Home.b1.getX()+10, Home.b1.getY());
break;
default:
break;
}
if (upP) {
b1.setLocation(b1.getX(), b1.getY()-10);
}
if (downP) {
b1.setLocation(b1.getX(), b1.getY()+10);
}
if (leftP) {
b1.setLocation(b1.getX()-10, b1.getY());
}
if (rightP) {
b1.setLocation(b1.getX()+10, b1.getY());
}
}
@Override
/*키보드에서 손을 떼었을때 호출*/
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
if(e.getKeyCode()==KeyEvent.VK_UP) {
upP = false;
}
else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
downP = false;
}
else if (e.getKeyCode() == KeyEvent.VK_LEFT) {
leftP = false;
}
else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
rightP = false;
}
}
});
}
위의 코드를 모두 넣은 코드는 아래와 같습니다.
package test01;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Main2 extends JFrame{
/*버튼*/
static JButton b1=new JButton("버튼1");
/*키보드 이벤트 업그레이드*/
boolean upP = false;
boolean downP = false;
boolean leftP = false;
boolean rightP = false;
/*생성자*/
public Main2() {
homeframe();
b1.setBounds(0, 0, 20, 20);//버튼1의 위치 설정
mbutton();
add(b1);//프레임에 패널을 추가
}
/*프레임 설정*/
public void homeframe() {
setTitle("1");//타이틀
setSize(400,400);//프레임의 크기
setResizable(false);//창의 크기를 변경하지 못하게
setLocationRelativeTo(null);//창이 가운데 나오게
setLayout(null);//레이아웃 설정
setVisible(true);//창이 보이게
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//JFrame이 정상적으로 종료되게
}
/*키보드 이벤트 업그레이드*/
void mbutton() {
b1.addKeyListener(new KeyAdapter() {
@Override
/*키보드를 눌렀을 때*/
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {//키 코드로 스위치
case KeyEvent.VK_DOWN: //방향키(아래) 눌렀을때
downP = true;
//Home.b1.setLocation(Home.b1.getX(), Home.b1.getY()+10);
break;
case KeyEvent.VK_UP: //방향키(위)눌렀을때
upP = true;
//Home.b1.setLocation(Home.b1.getX(), Home.b1.getY()-10);
break;
case KeyEvent.VK_LEFT:// 방향키(왼)눌렀을때
leftP = true;
//Home.b1.setLocation(Home.b1.getX()-10, Home.b1.getY());
break;
case KeyEvent.VK_RIGHT:// 방향키(오른)눌렀을때
rightP = true;
//Home.b1.setLocation(Home.b1.getX()+10, Home.b1.getY());
break;
default:
break;
}
if (upP) {
b1.setLocation(b1.getX(), b1.getY()-10);
}
if (downP) {
b1.setLocation(b1.getX(), b1.getY()+10);
}
if (leftP) {
b1.setLocation(b1.getX()-10, b1.getY());
}
if (rightP) {
b1.setLocation(b1.getX()+10, b1.getY());
}
}
@Override
/*키보드에서 손을 떼었을 때*/
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
if(e.getKeyCode()==KeyEvent.VK_UP) {
upP = false;
}
else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
downP = false;
}
else if (e.getKeyCode() == KeyEvent.VK_LEFT) {
leftP = false;
}
else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
rightP = false;
}
}
});
}
/*메인함수*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new Main2();
}
}
실행결과
이제 위의 코드를 실행하면 대각선으로도 이동할 수 있고 왼쪽과 오른쪽 방향키를 누르고 있으면 움직이지 않게 됩니다.
초기.
아래와 오른쪽 방향키를 누르고 조금 지난 후.
동영상이 보기 편하지만 제가 귀찮아서 Pass~