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(300, 200);
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(300, 200);
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(300, 200);
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(300, 200);
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. 람다식을 이용하는 방법
■ 람다식을 이용하는 방법
✓ 람다식 만들기: 람다식은 함수형 인터페이스를 구현한 객체
- 함수형 인터페이스의 추상 메소드를 람다식으로 구현한다.
✓ 레퍼런스 변수를 이용하면서 람다식을 호출
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(300, 200);
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 |
'Language > JAVA' 카테고리의 다른 글
[JAVA] 문자(Text) 스트림, 버퍼(Buffer) 스트림, File 클래스 | Yoon's Dev (0) | 2021.04.26 |
---|---|
[JAVA] JAVA의 입출력, 바이트 스트림(ByteStream) | Yoon's Dev (0) | 2021.04.24 |
[JAVA] JAVA의 입출력 스트림(Stream) | Yoon's Dev (0) | 2021.04.23 |
[JAVA] JAVA의 람다식 사용법 및 다양한 작성 예제 | Yoon's Dev (1) | 2021.04.21 |
[JAVA] JAVA의 GUI 기초, awt, swing 작성 절차, 컨테이너와 컴포넌트, 배치 관리자 | Yoon's Dev (0) | 2021.04.19 |