본문 바로가기
Code/GUI

[Java Code] KeyListener - 이미지 움직이기

by 스응 2023. 2. 18.
728x90
728x90

  - 키보드 방향키로 움직이되, 이미지가 창 밖으로 나가지 않도록 함

 

코드

// 인터페이스 파일 //

public interface Moveable {
    void left();
    void right();
    void up();
    void down();
}

------------------------------------
// 클래스 파일 //

public class MoveLabelFrame3 extends JFrame implements Moveable {

    private JLabel label;
    private int labelX;
    private int labelY;
    private final int SIZE_X = 800;
    private final int SIZE_Y = 800;

    public MoveLabelFrame3() {
        initData();
        setInitLayout();
        addEventListener();
    }

    private void initData() {
        setSize(SIZE_X, SIZE_Y);
        setDefaultCloseOperation(3);
        setResizable(false);
        labelX = 300;
        labelY = 350;
        label = new JLabel(new ImageIcon("images/image4.png"));
        label.setSize(250, 250);
    }

    private void setInitLayout() {
        setLayout(null);
        label.setLocation(labelX, labelY);
        add(label);

        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) {
            }
        });
    }

    @Override
    public void left() {
        int x = labelX;
        int y = labelY;

        if (x > 0) {
            x = labelX -= 40;
        }

        label.setLocation(x, y);
    }

    @Override
    public void right() {
        int x = labelX;
        int y = labelY;

        int xMax = SIZE_X - label.getWidth();

        if (x < xMax) {
            x = labelX += 40;				
        }

        label.setLocation(x, y);
    }

    @Override
    public void up() {
        int x = labelX;
        int y = labelY;
        // 왼쪽 위가 (0, 0)라서 -해야 위로 올라감

        if (y > 0) {
            y = labelY -= 40;
        }

        label.setLocation(x, y);
    }

    @Override
    public void down() {
        int x = labelX;
        int y = labelY;

        int yMax = SIZE_Y - label.getHeight();

        if (y < yMax) {
            y = labelY += 40;			
        }

        label.setLocation(x, y);
    }

    public static void main(String[] args) {
        new MoveLabelFrame3();
    }
}

 

실행

 

 

  - 뚝뚝 끊기지 않고 자연스럽게 움직이려면 '쓰레드'를 생성해서 사용해야 함

320x100
반응형

댓글