본문 바로가기

프로그래밍/Java

Java_Swing 키보드 방향키로 이미지를 창 안에서만 움직이게 하기

전체 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package ch05;
 
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
 
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
 
public class ImageMove extends JFrame implements Movable {
 
    private JLabel imageLabel;
    private int labelImageX;
    private int labelImageY;
 
    public ImageMove() {
        initData();
        setInitLayout();
        addEventListener();
        labelImageX = 300;
        labelImageY = 300;
    }
 
    private void initData() {
        setSize(800800);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        imageLabel = new JLabel(new ImageIcon("images/image2.png"));
        imageLabel.setSize(200200);
 
    }
 
    private void setInitLayout() {
        add(imageLabel);
        setLayout(null);
        imageLabel.setLocation(300300);
        setVisible(true);
    }
 
    private void addEventListener() {
        this.addKeyListener(new KeyListener() {
 
            @Override
            public void keyTyped(KeyEvent e) {
 
            }
 
            @Override
            public void keyReleased(KeyEvent e) {
                // 현재 이벤트가 일어난 시점에 x, y 좌표값을 확인
//                int currentX = labelText.getX();
//                int currentY = labelText.getY();
 
                if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
                    right();
                } else if (e.getKeyCode() == KeyEvent.VK_LEFT) {
                    left();
                } else if (e.getKeyCode() == KeyEvent.VK_UP) {
                    up();
                } else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
                    down();
                }
            }
 
            @Override
            public void keyPressed(KeyEvent e) {
 
            }
        });
 
    }
 
    @Override
    public void left() {
        if (0 < labelImageX) {
            int x = labelImageX -= 30;
            int y = labelImageY;
 
            imageLabel.setLocation(x, y);
        }
    }
 
    @Override
    public void right() {
        if (600 > labelImageX) {
            int x = labelImageX += 30;
            int y = labelImageY;
 
            imageLabel.setLocation(x, y);
        }
    }
 
    @Override
    public void up() {
        if (-10 < labelImageY) {
            int x = labelImageX;
            int y = labelImageY -= 30;
 
            imageLabel.setLocation(x, y);
        }
 
    }
 
    @Override
    public void down() {
        if (550 > labelImageY) {
            int x = labelImageX;
            int y = labelImageY += 30;
 
            imageLabel.setLocation(x, y);
        }
    }
 
    public static void main(String[] args) {
        new ImageMove();
    }
}
cs

 

1
2
3
4
5
6
7
8
package ch05;
 
public interface Movable {
    void left();
    void right();
    void up();
    void down();
}
cs

코드 설명

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package ch05;
 
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
 
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
 
public class ImageMove extends JFrame implements Movable {
 
    private JLabel imageLabel;
    private int labelImageX;
    private int labelImageY;
 
    public ImageMove() {
        initData();
        setInitLayout();
        addEventListener();
        labelImageX = 300;
        labelImageY = 300;
    }
 
    private void initData() {
        setSize(800800);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        imageLabel = new JLabel(new ImageIcon("images/image2.png"));
        imageLabel.setSize(200200);
 
    }
 
    private void setInitLayout() {
        add(imageLabel);
        setLayout(null);
        imageLabel.setLocation(300300);
        setVisible(true);
    }
 
    private void addEventListener() {
        this.addKeyListener(new KeyListener() {
 
            @Override
            public void keyTyped(KeyEvent e) {
 
            }
 
            @Override
            public void keyReleased(KeyEvent e) {
 
                if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
                    right();
                } else if (e.getKeyCode() == KeyEvent.VK_LEFT) {
                    left();
                } else if (e.getKeyCode() == KeyEvent.VK_UP) {
                    up();
                } else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
                    down();
                }
            }
 
            @Override
            public void keyPressed(KeyEvent e) {
 
            }
        });
 
    }
 
}
cs

→ 멤버변수 선언부 :

JLabel을 선언하여 이미지를 넣을 수 있도록 한다. 

labelImageX와 labelImageY를 선언하여 이미지를 움직일 때 사용하는 변수로 선언한다. 

 

→ 생성자 : 

initData(), setInitLayout(), addEventListener()를 호출하고 labelImageX와 labelImageY의 고정좌표를 300 300으로 주었다.

 

→ initData() : 

창 크기를 너비 : 800, 높이 : 800으로 주었다.

setDefaultCloseOperation을 사용하여 창을 끄면 종료가 되게끔 설정하였다.

JLabel에 ImageIcon을 생성하여 이미지를 imageLabel 변수에 저장하고 사이즈를 너비 : 200, 높이 200으로 주었다. 

 

→ setInitLayout() : 

add()를 사용하여 imageLabel을 넣고 창에 이미지가 나오게끔 하고, setLayout(null)로 하여 좌표값을 300, 300 주었다. 

setVisible(true)를 사용해서 창을 띄운다. 

 

→ addEventListener() : 

익명함수를 사용하여 KeyListener()를 생성해 KeyReleased 메서드에서 e.getKeyCode가 KeyEvent.VK_"원하는 방향"과 같으면 인터페이스 사용하여 구현한대로 나오게끔 하였다. 

 

 

인터페이스 구현부분

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package ch05;
 
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
 
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
 
public class ImageMove extends JFrame implements Movable {
 
    @Override
    public void left() {
        if (0 < labelImageX) {
            int x = labelImageX -= 30;
            int y = labelImageY;
 
            imageLabel.setLocation(x, y);
        }
    }
 
    @Override
    public void right() {
        if (600 > labelImageX) {
            int x = labelImageX += 30;
            int y = labelImageY;
 
            imageLabel.setLocation(x, y);
        }
    }
 
    @Override
    public void up() {
        if (-10 < labelImageY) {
            int x = labelImageX;
            int y = labelImageY -= 30;
 
            imageLabel.setLocation(x, y);
        }
 
    }
 
    @Override
    public void down() {
        if (550 > labelImageY) {
            int x = labelImageX;
            int y = labelImageY += 30;
 
            imageLabel.setLocation(x, y);
        }
    }
 
    public static void main(String[] args) {
        new ImageMove();
    }
}
cs

→ if문을 사용하여 왼쪽(X좌표)과 위쪽(Y좌표)은 좌표가 0, -10이 되기 전까지 화면 밖을 벗어나지 않도록 구현하였고, 오른쪽과 밑쪽은 getX() , getY() 메소드를 사용하여 벗어나지 않을 만큼의 좌표를 지정해주었다. 

 

→ 오른쪽으로 이동은 +=30씩, 왼쪽으로 이동은 -=30씩, 위쪽으로 이동은 +=30씩, 아래쪽으로 이동은 -=30씩 구현하였다. 

오른쪽, 왼쪽은 labelImageX에 가감하여야 하고 위쪽, 아래쪽은 labelImageY에 가감하여야 한다 !!!!

 

 

결과화면

 

'프로그래밍 > Java' 카테고리의 다른 글

Java_컬렉션 프레임워크  (0) 2023.02.21
Java_Thread  (0) 2023.02.17
Java_예외처리  (0) 2023.02.16
Java_추상 클래스(abstract class)  (0) 2023.02.14
Java_Object클래스  (0) 2023.02.14