GUI 이벤트처리(4)_예제

ChoRong0824·2022년 9월 20일
0

Java_GUI

목록 보기
6/9

예제 10-7,

<F1> 키를 입력받으면 컨텐트팬의 배경을 초록색으로, % 키를 입력받으면 노란색으로 변경

  • 참고로, 내부 클래스의 정적 선언은 자바 언어 수준 '11'에서 지원되지 않습니다. => 해결법을 찾고싶다. 왜냐하면 필자는 언어수준 11의 람다와 SpringMVC 프레임워크를 사용할 것이고 11에 사용하는 기술들을 쓰고 이펙티브 자바의 기술을 학습하고 싶기 때문이다.

이 방법을 찾기 위해 오류를 검색하였으며,정적 클래스와 비정적 클래스의 차이에 대해서 다시 한번 학습하게 되었습니다.
결정적으로 깨우치면서 해당 오류를 잡을 수 있었던 것은 중첩 클래스입니다.
도움이 되었던 자료들의 출처를 남깁니다. 헷갈린 분들이 계신다면 한번 학습하고 오시는 것도 좋은 방법이 될 것입니다.

이에, 학습한 내용을 바탕으로 중첩클래스, 즉 코드에 괄호때문에 중첩클래스가 이상한 것은 아닌가? 라는 생각으로 코드를 분석하였더니, 역시나. 클래스 분류 문제였습니다.


(정상작동)

(실행)


예제 10-8 : 상,하,좌,우 키로 "HELLO" 문자열 움직이기

  • 상, 하, 좌, 우 키를 이용하여 "HELLO" 문자열을 움직이는 응용프로그램을 작성하라.
    "HELLO" 문자열은 JLabel 컴포넌트로 만들어 컨텐트팬에 부착하고 상, 하, 좌, 우 키를 움직이면 키 방향으로 한 번에 10픽셀씩 움직인다. 이를 위해 컨텐트팬의 배치관리자를 삭제하여야 한다. "HELLO" 문자열을 초기에 (50,50) 위치에 출력하라.
package experience;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class FlyingTextEx extends JFrame {
    private final int FLYING_UNIT = 1;
    private JLabel la = new JLabel("HELLO");

    public FlyingTextEx() {
        setTitle("상,하,좌,우 키를 이용하여 텍스트 움직이기");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.setLayout(null);
        c.addKeyListener(new MyKeyListener());

        la.setLocation(50, 50);
        la.setSize(100, 20);
        c.add(la);
        setSize(300, 300);
        setVisible(true);
        c.setFocusable(true);
        c.requestFocus();

        c.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                Component com = (Component) e.getSource();
                com.setFocusable(true);
                com.requestFocus();
            }
            });
        }

    class MyKeyListener extends KeyAdapter {
        public void keyPressed(KeyEvent e) {
            int keyCode = e.getKeyCode();

            switch (keyCode) {
                case KeyEvent.VK_UP:
                    la.setLocation(la.getX(), la.getY() - FLYING_UNIT);
                    break;
                case KeyEvent.VK_DOWN:
                    la.setLocation(la.getX(), la.getY() + FLYING_UNIT);
                    break;
                case KeyEvent.VK_LEFT:
                    la.setLocation(la.getX() - FLYING_UNIT, la.getY());
                    break;
                case KeyEvent.VK_RIGHT:
                    la.setLocation(la.getX() + FLYING_UNIT, la.getY());
                    break;
            }
        }
    }
    public static void main(String[] args) {
        new FlyingTextEx();
    }
    }

(출력화면)

마우스 리스너 달기


MouseListener의 5 개의 이벤트를 처리하는 경우

  • mouseEntered(), mouseExited(), mousePressed(), mouseReleased(), mouseClicked()
  • 마우스 리스너 등록
    - component.addMouseListener(myMouseListener);

MouseMotionListener의 이벤트도 함께 처리하고자 하는 경우

  • mouseDragged(), mouseMoved()
  • 마우스 모션 리스너 등록 필요
    - component.addMouseMotionListener(myMouseMotionListener);

MouseEvent 객체로부터 얻을 수 있는 정보

예제 10-9 : 마우스와 마우스 모션 이벤트 활용

- 위와 같이 UI가 나오도록 구현
package experience;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

public class MouseListenerAllEx extends JFrame {
    private JLabel la = new JLabel("No Mouse Event");

    public MouseListenerAllEx() {
        setTitle("MouseListener와 MouseMotionListener 예제");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.setLayout(new FlowLayout());

        MyMouseListener listener = new MyMouseListener();
        c.addMouseListener(listener);
        c.addMouseMotionListener(listener);

        c.add(la);

        setSize(300, 200);
        setVisible(true);
    }

    class MyMouseListener implements MouseListener, MouseMotionListener {
        public void mouseClicked(MouseEvent e) {
        }
        public void mousePressed(MouseEvent e) {
            la.setText("mousePressed ("+e.getX()+","+e.getY()+")");
        }
        public void mouseReleased(MouseEvent e) {
            la.setText("mouseReleased ("+e.getX()+","+e.getY()+")");
        }
        public void mouseEntered(MouseEvent e) {
            Component c = (Component) e.getSource();
            c.setBackground(Color.CYAN);
        }
        public void mouseExited(MouseEvent e) {
            Component c = (Component) e.getSource();
            c.setBackground(Color.YELLOW);
        }
        public void mouseDragged(MouseEvent e) {
            la.setText("MouseDragged (" + e.getX() + "," + e.getY() + ")");
        }
        public void mouseMoved(MouseEvent e) {
            la.setText("mouseMoved (" + e.getX() + "," + e.getY() + ")");
        }
    }

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


예제 10-10 : 더블 클릭 시 컨텐트팬의 배경색 변경

package experience;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class ClickAndDoubleClickEx extends JFrame {
    public ClickAndDoubleClickEx() {
        setTitle("Click and DoubleClick 에제");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Container c = getContentPane();
        c.addMouseListener(new MyMouseListener());
        setSize(300, 200);
        setVisible(true);
    }

    class MyMouseListener extends MouseAdapter {
        public void mouseClicked(MouseEvent e) {
            if (e.getClickCount() == 2) {
                int r = (int) (Math.random() * 256);
                int g = (int) (Math.random() * 256);
                int b = (int) (Math.random() * 256);
                Component c = (Component) e.getSource();
                c.setBackground(new Color(r, b, g));
            }
        }
    }

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


MouseWheelEvent와 MouseWheelListener

마우스 휠 이벤트

  • 마우스 휠이 구를 때마다 발생하는 이벤트
    - 이벤트 발생 시마다 MouseWheelEvent 객체 생성

MouseWheelListener

  • 마우스 휠 이벤트 리스너
  • 마우스 휠 이벤트가 발생할 때마다 호출되는 메소드
    - Public void mouseWheelMoved(MouseWheelEvent e)

마우스 휠 리스너 구현

(실습문제 10-7 참고)

componnert.addMouseWheelListener(new MouseWheelListener(){
	public void mouseWheelMoved(MouseWheelEvent e){
    	// 마우스 휠의 구르는 방향에 따라 이벤트를 처리한다.
        }
	}};
profile
컴퓨터공학과에 재학중이며, 백엔드를 지향하고 있습니다. 많이 부족하지만 열심히 노력해서 실력을 갈고 닦겠습니다. 부족하고 틀린 부분이 있을 수도 있지만 이쁘게 봐주시면 감사하겠습니다. 틀린 부분은 댓글 남겨주시면 제가 따로 학습 및 자료를 찾아봐서 제 것으로 만들도록 하겠습니다. 귀중한 시간 방문해주셔서 감사합니다.

0개의 댓글