3. 자바 리스너 이벤트 정리

학습 목표
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. 람다식을 이용하는 방법
■ 람다식을 이용하는 방법
✓ 람다식 만들기: 람다식은 함수형 인터페이스를 구현한 객체
- 함수형 인터페이스의 추상 메소드를 람다식으로 구현한다.
✓ 레퍼런스 변수를 이용하면서 람다식을 호출
[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(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 | 

버튼 클릭 전

버튼 클릭 후
https://yooniron.tistory.com/13 분이 운영하시는 블로그에서 가져온 펌 게시물이나 내가 다시 찾아보기가 힘들어서 내 티스토리에 부득이하게 재 업로드 하였다.
내가 대학생 시절에는 1학년 때 주로 하던게 c언어로 구구단 짜기,
2학년 때, java로 구구단 짜기, 3학년 때 C++로 구구단 짜기, 4학년 때 파이썬으로 구구단 짜기 등을 학습하였던 것 같다.
단, 한번도 객체 지향과 gui까지 배워 본 적이 없었다.
그래서 내 대학 시절 교수님들에 대해서 불만이 많긴한데;;
그 것에 관한 내용은 다음에 포스팅 할 예정이다.