JAVA/멀티스레드, 이벤트

java 리스너 이벤트 처리 방법 (익명 객체, 내부 클래스)

읽히는 블로그 2024. 5. 24. 10:02

▤ 목차

    💫이벤트 처리

     

    ❓이벤트 리스너란?

    발생된 이벤트 객체에 반응하여 이벤트를 처리하는 객체를 말한다.

    사용자가 버튼을 클릭하거나, 마우스를 움직이거나, 키보드를 누르면 이벤트가 발생한다.

    class --Listener implements ActionListener{
    	public void actionPerformed (ActionEvent e){... //이벤트 객체가 발생하면 호출}
    }

     

    이벤트를 처리하는 몇가지 방법이 있다.

    이 글에서는 이벤트 처리 코드를 정리해보고자 한다.

     

    - inner Class로 받아서 처리하는 방법

    - 익명클래스로 처리하는 방법

     

    implements ActionListener 사용

    💻 코드로 보기

    public class ExEvent extends Frame implements ActionListener {
    
    	private Button btn1 = new Button("button1");
    	private Button btn2 = new Button("button2");
        
    	public ExEvent() {
    		super("이벤트 연습");
    
    		addLayout();
            
            addWindowListener(new WindowAdapter() { //종료버튼
    			@Override
    			public void windowClosing(WindowEvent e) {
    				System.exit(0);
    			}
    		});
            
        }
        
        private void addLayout() {
        	add("East", btn1); //frame은 BorderLayout이 기본
    		add("West",btn2);
            
    		btn1.addActionListener(this);
    		btn2.addActionListener(this);
        }
        
        @Override
    	public void actionPerformed(ActionEvent e) {
        if(e.getSource() == btn1) { //객체 비교
    			setTitle("버튼1 클릭");
    		}else if(e.getSource() == btn2) {
    			setTitle("버튼2 클릭");
    		}
    	}
        
        public static void main(String[] args) {
    		new Event();
    	}
        
    }

     

    👏 결과

    내부클래스 사용(implements)

    💻 코드로 보기

    public class Event extends Frame implements ActionListener {
    
    	private Button btn3 = new Button("button3");
        
        public Event() {
    		super("이벤트 연습");
    
    		addLayout();
    
    		setBounds(200, 200, 400, 400);
    		setVisible(true);
    
    		addWindowListener(new WindowAdapter() {
    			@Override
    			public void windowClosing(WindowEvent e) {
    				System.exit(0);
    			}
    		});
    	}
        private void addLayout() {
    		add("South",btn3);
    		
    		btn3.addActionListener(new EventTest()); //내부클래스 사용(implements)
    	}
        
        class EventTest implements ActionListener{
    		 @Override
    		public void actionPerformed(ActionEvent e) {
    			// btn3을 클릭하면 수행되는 추상메서드
    			setTitle("버튼 3을 누르네");
    		}
    	}
        public static void main(String[] args) {
    		new Event();
    	}
        
    }

    👏 결과

    내부클래스 사용(extends)

    💻 코드로 보기

    public class Event extends Frame implements ActionListener {
    
    	private Button btn4 = new Button("button4");
    	
        public Event() {
    		super("이벤트 연습");
    
    		addLayout();
    
    		setBounds(200, 200, 400, 400);
    		setVisible(true);
    
    		addWindowListener(new WindowAdapter() {
    			@Override
    			public void windowClosing(WindowEvent e) {
    				System.exit(0);
    			}
    		});
    	}
        
        private void addLayout() {
    		add("North",btn4);
    		
    		btn4.addMouseListener(new EventTest2());
    	}
        
        class EventTest2 extends MouseAdapter{
    		@Override //일반 메서드 오버라이딩
    		public void mouseClicked(MouseEvent e) {
    			//btn4
    			setTitle("버튼 마우스 이벤트로 btn4 처리");
    		}
    	}
        
        public static void main(String[] args) {
    		new Event();
    
    	}
        
    }

    👏 결과

    내부 무명 클래스 사용

    💻 코드로 보기

    public class Event extends Frame implements ActionListener {
    
    	private Button btn5 = new Button("button5");
    	
    	public Event() {
    		super("이벤트 연습");
    
    		addLayout();
    
    		setBounds(200, 200, 400, 400);
    		setVisible(true);
    
    		addWindowListener(new WindowAdapter() {
    			@Override
    			public void windowClosing(WindowEvent e) {
    				System.exit(0);
    			}
    		});
    	}
    
    	private void addLayout() {
    		add("Center",btn5);
    
    		btn5.addMouseListener(new MouseAdapter() { // 내부 무명 클래스 사용
    			@Override
    			public void mouseClicked(MouseEvent e) {
    				// btn5 클릭하면 수행
    				setTitle("버튼5 클릭");
    			}
    		});
    	}
    
    	public static void main(String[] args) {
    		new Event();
    
    	}
    
    }

    👏 결과

     

    😊정리

    익명객체, 내부클래스(구현, 상속), actionListener 일반 구현으로 총 4가지 방법을 알아봤다.

    가장 기초정인 방법은 이벤트를 처리하는 인터페이스를 implements 키워드로 가져와 처리하는 방법이다.

    abstract 메소드를 모두 정의해야하기 때문에 소스코드가 복잡해질 수 있다.

    한번만 사용할 코드이면 익명객체로 만들 수 있다. 일반적으로 안드로이드 프로그램에서 많이 사용하는 방식이다.

    그냥 Frame 클래스를 받는 방법도 있지만 JFrame으로 가볍게 만들 수 있다.

    다음에는 JFrame을 정리해보겠다.