티스토리 뷰

PL/JAVA

[JAVA] 자바 - 이벤트

poopooreum 2024. 6. 12. 13:28
반응형

✏️ 이벤트 기반 프로그래밍

이벤트 기반 프로그래밍은 이벤트의 발생에 의해 프로그램 샐행 흐름이 결정되는 방식의 프로그래밍 패러다임이다. 이벤트는 키 입력, 마우스 클릭, 마우스 드래그 등 사용자의 액션이나, 센서 등 외부 장치로부터의 입력, 네트워크를 통한 데이터 수신, 다른 스레드나 프로그램으로부터 메시지 수신 등에 의해 발생한다. 아래 그림을 통해 이벤트 발생 사례를 살펴보자.

  1. 사용자가 마우스로 화면의 New 버튼을 클릭한다.
  2. 버튼 클릭은 운영체제의 마우스 드라이버를 거쳐 자바 가상 기계에 전달한다.
  3. 자바 가상 기계는 이벤트 분배 스레드에게 마우스 클릭에 관한 정보를 보낸다.
  4. 이벤트 분배 스레드는 이벤트(ActionEvent) 객체를 생성한다. 이벤트 객체는 이벤트에 관한 여러 정보를 담은 객체이고, 이벤트 객체 내에 저장되는 정보 중, 특별히 이벤틀르 발생시킨 컴포넌트를 이벤트 소스라고 부른다. 여기서는 New 글자가 새겨진 JButton 컴포넌트이다.
  5. 이벤트 분배 스레드는 JButton에 연결된 '이벤트 리스너4' 를 찾아 호출한다.
  6. 이벤트 분배 스레드는 '이벤트 리스너4' 로부터 리턴한 후 다음 이벤트를 기다린다.

이벤트 관련 용어

  1. 이벤트 소스: 이벤트를 발생시킨 GUI 컴포넌트
  2. 이벤트 객체: 발생한 이벤트에 대한 정보(이벤트 종류, 이벤트 소스, 화면 좌표, 마우스 버튼 종류, 눌러진 키)를 담는 객체로서, 이벤트에 따라 서로 다른 정보가 저장된다.
  3. 이벤트 리스너: 이벤트를 처리하는 코드로서 컴포넌트에 등록되어야 작동 가능하다.
  4. 이벤트 분배 스레드: 이벤트 기반 프로그래밍의 핵심 요소로서, 무한 루프를 실행하는 스레드이다. 자바 가상 기계로부터 이벤트의 발생을 통지받아, 이벤트 소스와 이벤트 종류를 결정하고 이에 따라 적절한 이벤트 객체를 생성하고 이벤트 리스너를 찾아 호출한다.

 

✏️ 이벤트 객체

 

이벤트 객체는 현재 발생한 이벤트에 관한 정보를 가진 객체이며, 이벤트 리스너에게 전달된다. 모든 이벤트 객체들은 java.util.EventObject 클래스를 상속받으며, java.awt.eventjavax.swing.event 패키지에 구현되어 있다. 아래 사진은 이벤트 객체의 종류이다.

이벤트 객체 정보

  • 이벤트 종류
  • 이벤트 소스
  • 화면 내 이벤트가 발생한 마우스 좌표
  • 컴포넌트 내 이벤트가 발생한 마우스 좌표
  • 클릭된 마우스 버튼 번호
  • 버튼이나 메뉴 아이템에 이벤트가 발생한 경우 버튼이나 메뉴 아이템의 문자열
  • 마우스의 클릭 횟수
  • 키가 눌러졌다면 키의 코드 값과 문자 값
  • 체크박스, 라디오버튼에 이벤트가 발생하였다면 체크 상태

이벤트 객체의 메소드

 

이벤트 객체와 이벤트 소스

이벤트 객체 이벤트 소스 이벤트가 발생하는 경우
ActionEvent JButton 마우스나 <Enter> 키로 버튼 선택
JMenuItem 메뉴 아이템 선택
JTextField 텍스트 입력 중 <Enter> 키 입력
ItemEvent JCheckBox 체크박스의 선택 혹은 해제
JRadioButton 라디오버튼의 선택 상태가 변할 때
JCheckBoxMenuItem 체크박스 메뉴 아이템의 선택 혹은 해제
ListSelectionEvent JList 리스트에서 선택된 아이템이 변경될 때
KeyEvent Component 키가 눌러지거나 눌러진 키가 떼어질 때
MouseEvent Component 마우스 버튼이 눌러지거나 떼어질 때, 마우스 버튼이 클릭될 때, 컴포넌트
위에 마우스가 올라갈 때
, 올라간 마우스가 내려올 때, 마우스가 드래그될 때,
마우스가 단순히 움직일 때
FocusEvent Component 컴포넌트가 포커스를 받거나 잃을 때
WindowEvent Window Window를 상속받는 모든 컴포넌트에 대해 윈도우 활성화, 비활성화,
아이콘화, 아이콘에서 복구, 윈도우 열기, 윈도두 닫기, 윈도우 종류
AdjustmentEvent JScrollBar 스크롤바를 움직일 때
ComponentEvent Component 컴포넌트가 사라지거나, 나타나거나, 이동, 크기 변경 시
ContainerEvent Container Container에 컴포넌트의 추가 혹은 삭제

 

 

✏️ 이벤트 리스너

이벤트 리스너란 이벤트를 처리하는 자바 프로그램 코드로서 클래스로 만든다. JDK는 아래 사진과 같은 이벤트 리스너 인터페이스를 제공하며, 개발자는 이 인터페이스를 상속받고 추상 메소드를 모두 구현하여 이벤트 리스너를 작성한다. 

interface ActionListener{
    public void actionPerformed(ActionEvent e); // Action 이벤트 발생 처리
}

/* 
버튼을 누르는 Action 이벤트가 발생하면 actionPerformed(ActionEvent e) 메소드가 호출되고,
이때 ActionEvent 객체가 인자로 전달된다. 또한 MouseEvent도 같이 발생하게 되는데 아래와
같이 5개의 메소드를 가진다. */
interface MouseListener{ 
    public void mousePressed(MouseEvent e);
    public void mouseReleased(MouseEvent e);
    public void mouseClicked(MouseEvent e);
    public void mouseEntered(MouseEvent e);
    public void mouseExited(MouseEvent e);
}

이벤트 리스터 인터페이스

 

이벤트 리스너 작성 과정

  1. 이벤트와 이벤트 리스너 선택 => 목적에 적합한 이벤트와 리스너 인터페이스 선택
  2. 이벤트 리스너 클래스 작성 => 리스너 인터페이스를 상속받는 클래스를 작성하고 추상 메소드 모두 구현
  3. 이벤트 리스너 등록 => 이벤트를 받을 스윙 컴포넌트에 이벤트 리스너 등록
// 버튼을 클릭하면 버튼 문자여을 "Action"과 "액션" 으로 번갈아 바꾸는 이벤트 리스너 만들기

// 1. 이벤트와 이벤트 리스너 선택
// 이벤트: Action 이벤트
// 이벤트 리스너: ActionListener
// 이벤트 객체: ActionEvent

// 2. 이벤트 리스너 클래스 작성
class MyActionListener implements ActionListener{
    public void actionPerformed(ActionEvent e){ // 버튼 클릭 시 호출되는 메소드
    	JButton b = (JButton)e.getSource(); // 클릭된 버튼 알아내기
        if(b.getText().equals("Action")
           b.setText("액션"); // 문자열 변경
        else
           b.setText("Action"); // 문자열 변경
    }

}

//3. 이벤트 리스너 등록
MyActionListener listener = new MyActionListenr(); // 리스너 객체 생성
btn.addActionListenr(listener); // 리스너 등록

 

이벤트 리스너 작성 방법

// 독립 클래스로 이벤트 리스너 작성하기
package ex;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class IndepClassListener extends JFrame{
    public IndepClassListener(){
        setTitle("Action 이벤트 리스너 예제");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.setLayout(new FlowLayout());
        JButton btn = new JButton("Action");
        btn.addActionListener(new MyActionListener());
        c.add(btn);

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

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

class MyActionListener implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent e) {
        JButton B = (JButton)e.getSource();
        if(B.getText().equals("Action"))
            B.setText("액션");
        else
            B.setText("Action");
    }
}
// 내부 클래스로 Action 리스너 작성하기
package ex;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class InnerClassListener extends JFrame{
    public InnerClassListener(){
        setTitle("Action 이벤트 리스너 예제");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.setLayout(new FlowLayout());
        JButton btn = new JButton("Action");
        btn.addActionListener(new MyActionListener());
        c.add(btn);

        setSize(300,150);
        setVisible(true);
    }
    private class MyActionListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
            JButton b = (JButton)e.getSource();
            if(b.getText().equals("Action"))
                b.setText("액션");
            else
                b.setText("Action");
        }
    }

    public static void main(String[] args) {
        new InnerClassListener();
    }
}
// 익명 클래스로 이벤트 리스너 작성
package ex;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class AnonymousClassListener extends JFrame{
    public AnonymousClassListener(){
        setTitle("Action 이벤트 리스너 작성");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.setLayout(new FlowLayout());
        JButton btn = new JButton("Action");
        c.add(btn);
        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JButton b = (JButton)e.getSource();
                if(b.getText().equals("Action"))
                    b.setText("액션");
                else
                    b.setText("Action");
            }
        });

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

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

 

마우스로 문자열 이동시키기

package ex;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class MouseListenrEx extends JFrame{
    private JLabel la = new JLabel("Hello");

    public MouseListenrEx(){
        setTitle("Mouse 이벤트 예제");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.addMouseListener(new MyMouseListener());

        c.setLayout(null);
        la.setSize(50,20);
        la.setLocation(30,30);
        c.add(la);

        setSize(250,250);
        setVisible(true);
    }

    class MyMouseListener implements MouseListener{
        @Override
        public void mouseClicked(MouseEvent e) {

        }

        @Override
        public void mousePressed(MouseEvent e) {
            int x= e.getX();
            int y= e.getY();
            la.setLocation(x,y);
        }

        @Override
        public void mouseReleased(MouseEvent e) {

        }

        @Override
        public void mouseEntered(MouseEvent e) {

        }

        @Override
        public void mouseExited(MouseEvent e) {

        }

    }

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

 

 

✏️ 어댑터(Adapter) 클래스

위의 코드를 보게 되면 MouseListener implements 받는 과정에서 사용하지 않는 추상 메소드들도 모두 구현해야 하는 번거로움이 생김을 알 수 있다. 이런 불편한 상황을 해결하기 위해 인터페이스를 미리 구현해 놓은 클래스를 제공하는데 이것이 바로 어댑터(Adapter) 클래스이다. 예를 들어 MouseAdapter 클래스는 모든 메소드가 단순 리턴하도록 다음과 같이 작성되어 있다. 추가로 리스너 인터페이스에 메소드가 하나인 경우에는 어댑터 클래스를 제공하지 않는다.

리스너 인터페이스에 대응하는 어댑터 클래스

 

마우스어댑터 사용하기

package ex;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class MouseAdapterEx extends JFrame {
    private JLabel la = new JLabel("Hello");

    public MouseAdapterEx(){
        setTitle("Mouse 어댑터 예제");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container c =getContentPane();
        c.addMouseListener(new MyMouseAdapter());

        c.setLayout(null);
        la.setSize(50,20);
        la.setLocation(30,30);
        c.add(la);

        setSize(250,250);
        setVisible(true);
    }

    class MyMouseAdapter extends MouseAdapter {
        @Override
        public void mousePressed(MouseEvent e) {
            int x=e.getX();
            int y=e.getY();
            la.setLocation(x,y);
        }
    }

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

 

 

✏️ KeyEvent와 KeyListener

Key 이벤트는 사용자가 키를 입력할 때 발생하는 이벤트이며, 모든 컴포넌트가 key 이벤트를 받을 수 있다. 그러나 응용프로그램 내에 포커스(focus)를 가진 컴포넌트가 키 입력을 독점하기 때문에, 현재 포커스를 가진 컴포넌트에만 Key 이벤트가 전달된다. 여기서 포커스란 키 입력의 독점권을 뜻한다. 만약 버튼을 누르기 위해 <Enter> 키를 입력하더라도 버튼이 포커스를 가지고 있지 않다면 Key 이벤트를 받을 수 없다. 따라서 어떤 컴포넌트에게 키를 입력하고자 하면 포커스를 강제로 이동시켜야 하는데 아래의 두 코드가 필요하다.

component.setFocusable(true); // component가 포커스를 받을 수 있도록 설정
component.requestFocuse(); // component가 포커스를 주어 키 입력을 받을 수 있게 함

 

컴포넌트에 포커스 주기

component.addMouseListener(new MouseAdapter()){
    public void mouseClicked(MouseEvent e){
    	Component c = (Component)e.getSource();
        c.setFocuseable(true);
        c.requestFocuse();
    }
}

 

키 이벤트 리스너

키 이벤트 리스너는 아래 표와 같이 3개의 추상 메소드로 구성되어 있고 컴포넌트에 키 이벤트 리스너를 등록하기 위해서는 다음과 같이 addKeyListener() 메소드를 이용한다 => component.addKeyListener(myKeyListener);

Key 이벤트가 발생하는 경우 KeyListener의 메소드 리스너
키를 누르는 순간 void keyPressed(KeyEvent e) KeyListener
누른 키를 떼는 순간 void keyReleased(KeyEvent e) KeyListener
누른 키를 떼는 순간
(유니코드 키 경우에만 적용)
void keyTyped(KeyEvent e) KeyListener

 

입력된 키 판별

키 이벤트가 발생하면 입력된 키 정보가 KeyEvent 객체에 담겨져 리스너에게 전달되는데 이때 KeyEvent 객체의 2가지 메소드를 통해 입력된 키를 판별할 수 있다. 첫 번째는 char KeyEvent.getKeyChar()로, 입력된 키의 문자코드(유니코드 값)을 리턴한다. 두 번째는 int KeyEvent.getKeyCode()로 유니코드 키를 포함한 모든 키에 대해 정수형의 키 코드 값을 리턴한다. 아래 그림은 KeyEvent 클래스의 getKeyChar()와 getKeyCode()의 메소드의 사용 예시이다.

KeyEvent 클래스에 정의된 가상 키

 

KeyEvent와 KeyListener의 활용

package ex;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class KeyListenerEx extends JFrame {
    private JLabel[] keyMessage;

    public KeyListenerEx(){
        setTitle("KeyListener 예제");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Container c = getContentPane();
        c.setLayout(new FlowLayout());
        c.addKeyListener(new MyKeyListener());

        keyMessage = new JLabel[3];
        keyMessage[0] = new JLabel(" getKeyCode() ");
        keyMessage[1] = new JLabel(" getKeyChar() ");
        keyMessage[2] = new JLabel(" getKeyText() ");

        for(int i=0;i<keyMessage.length;i++){
            c.add(keyMessage[i]);
            keyMessage[i].setOpaque(true);
            keyMessage[i].setBackground(Color.YELLOW);
        }

        setSize(300,150);
        setVisible(true);

        c.setFocusable(true);
        c.requestFocus();
    }

    class MyKeyListener extends KeyAdapter{
        @Override
        public void keyPressed(KeyEvent e) {
            int keyCode = e.getKeyCode();
            char keyChar = e.getKeyChar();
            keyMessage[0].setText(Integer.toString(keyCode));
            keyMessage[1].setText(Character.toString(keyChar));
            keyMessage[2].setText(KeyEvent.getKeyText(keyCode));

            System.out.println("KeyPressed");
        }

        @Override
        public void keyReleased(KeyEvent e) {
            System.out.println("KeyReleased");
        }

        @Override
        public void keyTyped(KeyEvent e) {
            System.out.println("KeyTyped");
        }
    }

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

 

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

package ex;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class KeyCodeEx extends JFrame {
    private JLabel la = new JLabel();

    public KeyCodeEx(){
        setTitle("Key Code 예제");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Container c = getContentPane();
        c.addKeyListener(new MyKeyListener());
        c.add(la);
        setSize(300,150);
        setVisible(true);

        c.setFocusable(true);
        c.requestFocus();
    }

    private class MyKeyListener extends KeyAdapter {
        @Override
        public void keyPressed(KeyEvent e) {
            Container contentpane = (Container)e.getSource();

            la.setText(KeyEvent.getKeyText(e.getKeyCode())+"키가 입력되었음");

            if(e.getKeyChar()== '%')
                contentpane.setBackground(Color.yellow);
            else if(e.getKeyCode() == KeyEvent.VK_F1)
                contentpane.setBackground(Color.GREEN);
        }
    }

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

 

상, 하, 좌, 우 키로 "Hello" 문자열 움직이기

package ex;

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

public class FlyingTextEx extends JFrame {
    private final int FLYING_UNIT=10;
    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() {
            @Override
            public void mouseClicked(MouseEvent e) {
                Component com =(Component)e.getSource();
                com.setFocusable(true);
                com.requestFocus();
            }
        });
    }

    class MyKeyListener extends KeyAdapter {
        @Override
        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_RIGHT:
                    la.setLocation(la.getX()-FLYING_UNIT,la.getY());
                    break;
                case KeyEvent.VK_LEFT:
                    la.setLocation(la.getX()+FLYING_UNIT,la.getY());
                    break;
            }
        }
    }

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

 

 

✏️ Mouse 이벤트

Mouse 이벤트는 사용자의 마우스 조작에 따라 총 8가지 경우가 발생한다(아래 표 참조). 이 중에서 5가지 경우는 MouseListener의 메소드가, 2가지 경우는 MouseMotionListener의 메소드가, 나머지 1가지는 MouseWheelListener의 메소드가 호출된다. 모든 스윙 컴포넌트가 Mouse 이벤트를 받을 수 있으며, Mouse 이벤트가 발생하면 MouseEvent 객체나 MouseWheelEvent 객체리스너의 메소드에 전달된다. 마우스가 눌러진 위치에서 그대로 떼어지면 mousePressed(), mouseReleased(), mouseClicked() 순서로 메소드가 호출된다. 그러나 마우스가 드래그되면 mousePressed(), mouseDragged(), ... , mouseDragged(), mouseReleased() 순서로 호출된다.

 

마우스 리스너 달기

mouseEntered(), mouseExited(), mousePressed(), mouseReleased(), mouseClicked()의 Mouse 이벤트를 처리하고자 한다면 Mouse 리스너를 작성하여 아래와 같이 컴포넌트에 등록한다.

component.addMouseListener(myMouseListener());

// 마우스 드래깅과 마우스 무브먼트 이벤트도 함께 처리하고자 할 때
component.addMouseMotionListener(myMouseMotionListener())

 

마우스 포인터의 위치

int getX(); // 마우스 포인터의 x 위치 리턴
int getY(); // 마우스 포인터의 y 위치 리턴
Point getPoint(); // 마우스 포인터의 위치를 Point 객체로 리턴. Point 객체에 x,y 정보 있음

 

마우스 클릭 횟수

int getClickCount(); // 마우스의 클릭 횟수 리턴

// 마우스의 더블클릭 판단하기
public void mouseClicked(MouseEvent e){
    if(e.getClickCount()==2){
    	...
    }
}

 

마우스 버튼

int getButton() // 눌러진 마우스 버튼의 번호를 리턴
// 리턴 값은 NOBUTTON, BUTTON1, BUTTON2, BUTTON3 중의 하나이며
// 마우스 왼쪽 버튼은 BUTTON1, 오른쪽 버튼은 BUTTON3이다.

 

7개의 마우스 이벤트를 처리하기

package ex;

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

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

    public MouseListenerAllEx() {
        setTitle("마우스 이벤트 처리 예제");
        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 {

        @Override
        public void mouseClicked(MouseEvent e) {
        }

        @Override
        public void mousePressed(MouseEvent e) {
            la.setText("mousePressed (" + e.getX() + "," + e.getY() + ")");
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            la.setText("mouseReleased (" + e.getX() + "," + e.getY() + ")");
        }

        @Override
        public void mouseEntered(MouseEvent e) {
            Component c = (Component) e.getSource();
            c.setBackground(Color.CYAN);
        }

        @Override
        public void mouseExited(MouseEvent e) {
            Component c = (Component) e.getSource();
            c.setBackground(Color.YELLOW);
        }

        @Override
        public void mouseDragged(MouseEvent e) {
            la.setText("mouseDragged (" + e.getX() + "," + e.getY() + ")");
        }

        @Override
        public void mouseMoved(MouseEvent e) {
            la.setText("mouseMoved (" + e.getX() + "," + e.getY() + ")");
        }
    }

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

 

더블클릭시마다 컨텐트팬의 배경색이 랜덤하게 변경

package ex;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ClickAndDoubleClickEx extends JFrame{
    public ClickAndDoubleClickEx(){
        setTitle("Click And Double Click Ex");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

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

    class MyMouseListener extends MouseAdapter {
        @Override
        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,g,b));
            }
        }
    }

    public static void main(String[] args) {
        new ClickAndDoubleClickEx();
    }
}
반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
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
글 보관함