자바 스윙 - 2

조현수·2023년 1월 20일
0

자바 스윙

목록 보기
2/4
post-thumbnail

자바 스윙 복습 두번째!


‏‏‎ ‎

이벤트 리스너 처리 방법

먼저... 이벤트 소스 알아내기

EventObject.getSource() getSource()로 이벤트 얻어옴

  • 발생한 이벤트의 소스 컴포넌트 반환

  • Object 타입으로 리턴하므로 캐스팅하여 사용

  • 모든 이벤트 객체에 대해 적용 가능

ActionEvent, KeyEvent, MouseEvent에 대해서 알아볼꺼야.

‏‏‎ ‎

actionPerformed(ActionEvent e) --> 해당 이벤트가 발생하면 무엇을 할까!에 해당하는 함

‏‏‎ ‎

보통 익명클래스로 이벤트 리스너 처리한다???

익명클래스는 클래스의 이름 없이 간단히 리스너 작성..

클래스조차 만들 필요 없이 리스너 코드가 간단한 경우 적합하다..

  1. 독립적인 클래스 작성

일반적인 방법

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

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

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

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

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

  • .add() 메서드를 사용하여 패널이나 상위 컨테이너에 추가

‏‏‎ ‎

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();
 
    }
 
}
 

‏‏‎ ‎

‏‏‎ ‎

‏‏‎ ‎

  1. 내부 클래스로 작성

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

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

‏‏‎ ‎

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();
 
    }
 
}
 

‏‏‎ ‎

‏‏‎ ‎

‏‏‎ ‎

  1. 익명클래스로 작성

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

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

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

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

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

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();
 
    }
 
}

‏‏‎ ‎

‏‏‎ ‎

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

**■ 람다식을 이용하는 방법**

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

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

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

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();
    }
 
}
 
profile
back-end, 지속 성장 가능한 개발자를 향하여

0개의 댓글