본문 바로가기

자바공부

자바 이벤트 리스너 작성 방법, 명품자바프로그래밍10장

728x90
반응형

* 이벤트 리스너 클래스를 작성하는 3가지 방법

1) 독립 클래스로 이벤트 리스너 작성

이벤트 리스너 클래스를 독립적으로 작성하는 방법으로서 가장 일반적이다.

그러나 이 방법은 MyActionListener가 다른 클래스의 멤버에 접근하기 쉽지 않은 단점이 있다.

 

Action 이벤트 리스너 MyActionListener를 독립된 클래스로 작성

리스너에서 IndepListenerClass의 멤버에 대한 접근이 어려움

MyActionListener는 독립된 자바 소스 파일 (MyActionListener.java)로도 작성 가능

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

public calss IndepClassListener extends JFrame{
	IndepClassListener(){
    	setTitle("Action 이벤트 리스너 작성");
        setLayout(new FlowLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(300,150);
        setVisible(true);
        JButton btn = new JButton("Action");
        MyActionListener listener = new MyActionListener();
        btn.addActionListener(listener);
        add(btn);
    }
    public static void main(String[] args){
    	new IndepClassListener();
    }
}

// 독립된 클래스로 이벤트 리스너를 작성한다.
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");
    }
}

 

2) 내부 클래스(inner class)로 이벤트 리스너 작성

이벤트 핸들링이 필요한 클래스 내부에 내부 클래스 형식으로 이벤트 리스너를 작성하는 방법

특징

1. MyActionListener 클래스를 private 멤버로 선언하였기 때문에 InnerClassListener 외부에서는 사용할 수 없다.

2. 이벤트 리스너가 자신을 둘러싼 외부 클래스 멤버에 마음대로 접근할 수 있다.

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

public calss InnerClassListener extends JFrame{
	InnerClassListener(){
    	setTitle("Action 이벤트 리스너 작성");
        setLayout(new FlowLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        JButton btn = new JButton("Action");
      
        btn.addActionListener(new MyActionListener);
        add(btn);
        
        setSize(300,150);
        setVisible(true);
    }
    
    // 내부 클래스로 이벤트 리스너를 작성한다.
	private 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");
                
        	// InnerClassListener의 멤버나 JFrame의 멤버를 호출할 수 있음
            // 프레임 타이틀을 버튼 문자열로 변경
            setTitle(b.getText());
    	}
    }
    public static void main(String[] args){
    	new InnerClassListener();
    }
}

 

* 익명 클래스 (annonymous class)로 이벤트 리스너 작성

익명 클래스는 클래스 정의ㅡ 부분과 인스턴스 생성 부분이 하나로 합쳐져 있다.

그러므로 굳이 클래스 이름을 정의할 필요가 없다.

익명 클래스를 독립된 클래스로 정의하고 그 인스턴스를 여러 번 생성하여 레퍼런스를 계속 유지하는 경우가 아니라면 익명 클래스의 사용이 더 편리하다.

익명 클래스도 일종의 내부 클래스이므로 외부 클래스의 멤버에 마음대로 접근할 수 있다.

그러나 익명 클래스에 구현할 메소드가 여러 개 있다면 new 문장이 길어져 가독성이 떨어지는 단점이 있다.

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

public calss AnnonymousClassListener extends JFrame{
	AnnonymousClassListener(){
    	setTitle("Action 이벤트 리스너 작성");
        setLayout(new FlowLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(300,150);
        setVisible(true);
        
        JButton btn = new JButton("Action");
     	add(btn);
       
        btn.addActionListener(new ActionListener{
			public void actionPerformed(ActionEvent e){
    			JButton b = (JButton)e.getSource();
      	 	 	if(B.getText().equals("Action"));
                    b.setText("액션");
     	  		else
    	   	 	b.setText("Action");
                
        	// AnnonyClassListener의 멤버나 JFrame의 멤버를 호출할 수 있음
           		setTitle(b.getText());
    		}
  	  });
  	} 
        
    public static void main(String[] args){
    	new AnnonymousClassListener();
    }
}
반응형