Language/JAVA

[JAVA] JAVA의 5가지 리스너 이벤트 처리 방법 (독립, 내부, 프레임, 익명, 람다식) | Yoon's Dev

Yooniron 2021. 4. 20. 22:28

JAVA의 5가지 리스너 이벤트 처리 방법 (독립, 내부, 프레임, 익명, 람다식)

 

 


학습 목표

 

 


1. 독립적인 클래스로 이벤트 처리기를 작성

 

■ 독립적인 클래스 작성

✓ 일반적인 방법

- 이벤트 리스너를 완전한 클래스로 작성

- GUI 컴포넌트에서 발생하는 전형적인 이벤트 처리 형태 ex) 버튼

   . 이벤트와 연관된 인터페이스를 사용하여 클래스 생성

   . GUI 구축을 위한 컴포넌트 객체를 생성

   . 이벤트를 받아들인 컴포넌트 객체에 리스너를 등록

   . add() 메소드를 사용하여 컨테이너에 추가

 

ActionEventTest1.java

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package practice;
 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
 
class MyListener implements ActionListener{
 
    @Override
    public void actionPerformed(ActionEvent e) {
        JButton button  = (JButton)e.getSource();
        button.setText("버튼이 눌렸습니다.");
        
    }
    
}
 
class MyFrameTest extends JFrame{
    
    private JButton button;
    private JLabel label;
    //생성자
    public MyFrameTest() {
        this.setSize(300200);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle("독립 리스너");
        
        JPanel panel = new JPanel();
        button = new JButton("버튼을 누르세요");
        label = new JLabel("Yoon's Dev");
        button.addActionListener(new MyListener());
        panel.add(button);
        panel.add(label);
        this.add(panel);
        this.setVisible(true);
    }
}
 
public class IndepClassListener {
 
    public static void main(String[] args) {
        new MyFrameTest();
 
    }
 
}
 
cs

 

버튼 클릭 전
버튼 클릭 후

 

 


 

2. 내부 클래스(inner class)로 작성

 

■ 내부 클래스(inner class)로 작성

✓ Listener 클래스를 별도의 클래스(독립 클래스)로 하면 Frame안의 멤버 변수들을 쉽게 사용할 수 없음

일반적으로 Listener 클래스를 내부 클래스로 만듦

 

InnerClassListener.java

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package practice;
 
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.JButton;
import javax.swing.JFrame;
 
public class InnerClassListener extends JFrame{
    
    public InnerClassListener() {
        setTitle("InnerClassListener 예제");
        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(300200);
        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");
            
            
            //InnerClassListener의 멤버나 JFrame의 멤버를 호출할 수 있음
            InnerClassListener.this.setTitle(b.getText());
        }
        
    }
 
    
    public static void main(String[] args) {
        new InnerClassListener();
 
    }
 
}
 
cs

 

버튼 클릭 전
버튼 클릭 후

 


 

3. Frame에서 이벤트 처리하는 방법

 

■ Frame에서 이벤트 처리하는 방법

✓ Frame 클래스가 JFrame을 상속받으면서 동시에 Listener 인터페이스도 구현하는 경우

 많이 사용되는 방법

 

MyListenerFrame.java

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package practice;
 
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.JButton;
import javax.swing.JFrame;
 
public class InnerClassListener extends JFrame{
    
    public InnerClassListener() {
        setTitle("InnerClassListener 예제");
        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(300200);
        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");
            
            
            //InnerClassListener의 멤버나 JFrame의 멤버를 호출할 수 있음
            InnerClassListener.this.setTitle(b.getText());
        }
        
    }
 
    
    public static void main(String[] args) {
        new InnerClassListener();
 
    }
 
}
 
cs

 

버튼 클릭 전
버튼 클릭 후

 

4. 익명 클래스(Anonymous class)로 작성

 

■ 익명의 클래스(Anonymous class)로 작성

✓ 클래스 몸체는 정의되지만 이름이 없는 클래스

✓ 클래스를 정의하면서 동시에 객체를 생성

✓ 이름이 없으므로 한 번만 사용

✓ 안드로이드 프로그램에서 일반적으로 사용하는 방법

 

AnonymousListener.java

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package practice;
 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
 
public class AnonymousListener extends JFrame{
    
    //멤버변수
    private JButton btn;
    
    //생성자
    public AnonymousListener() {
        this.setTitle("Yoon's Dev");
        this.setSize(300200);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        JPanel jp = new JPanel();
        
        btn = new JButton("Action");
        
        // 리스너 구현
        btn.addActionListener(new ActionListener() {
 
            @Override
            public void actionPerformed(ActionEvent e) {
                if(e.getActionCommand().equals("Action"))
                    btn.setText("확인");
                else btn.setText("Action");
            }
        });
        
        jp.add(btn);
        
        this.add(jp);
        this.setVisible(true);
    }
    
    
    
    public static void main(String[] args) {
        new AnonymousListener();
 
    }
 
}
 
cs

버튼 클릭 전
버튼 클릭 후

 

5. 람다식을 이용하는 방법

■ 람다식을 이용하는 방법

✓ 람다식 만들기: 람다식은 함수형 인터페이스를 구현한 객체

- 함수형 인터페이스의 추상 메소드를 람다식으로 구현한다.

✓ 레퍼런스 변수를 이용하면서 람다식을 호출

 

 

[JAVA] Java 람다식 사용법 및 다양한 작성 예제 | Yoon's Dev

Java 람다식(lambda) 사용법 및 다양한 작성 예제 Java의 람다식 ■ 자바의 람다식 ✓ 람다식(lambda) - 자바에서는 함수를 메서드라고 부르고 메서드의 형태로 존재 - 자바 람다식의 구조  . (argument) ->

yooniron.tistory.com

 

LambdaListener.java

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
32
33
34
35
36
37
38
39
40
package practice;
 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
 
public class LambdaListener extends JFrame {
    
    private JButton btn;
 
    public LambdaListener() {
        this.setTitle("Yoon's Dev");
        this.setSize(300200);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        JPanel jp = new JPanel();
        btn = new JButton("Action");
        
        ActionListener ll =(ActionEvent e) -> {
            if(e.getActionCommand().equals("Action"))
                btn.setText("확인");
            else btn.setText("Action");
        };
        
        btn.addActionListener(ll);
        
        jp.add(btn);
        
        this.add(jp);
        this.setVisible(true);
    }
    public static void main(String[] args) {
        new LambdaListener();
    }
 
}
 
cs

버튼 클릭 전
버튼 클릭 후