자바 스윙 복습 두번째!
이벤트 리스너 처리 방법
먼저... 이벤트 소스 알아내기
EventObject.getSource() getSource()로 이벤트 얻어옴
발생한 이벤트의 소스 컴포넌트 반환
Object 타입으로 리턴하므로 캐스팅하여 사용
모든 이벤트 객체에 대해 적용 가능
ActionEvent, KeyEvent, MouseEvent에 대해서 알아볼꺼야.
actionPerformed(ActionEvent e) --> 해당 이벤트가 발생하면 무엇을 할까!에 해당하는 함
보통 익명클래스로 이벤트 리스너 처리한다???
익명클래스는 클래스의 이름 없이 간단히 리스너 작성..
클래스조차 만들 필요 없이 리스너 코드가 간단한 경우 적합하다..
일반적인 방법
이벤트 리스너를 완전한 클래스로 작성
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();
}
}
✓**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();
}
}
**■ 익명의 클래스(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();
}
}
**■ 람다식을 이용하는 방법**
✓ 람다식 만들기: 람다식은 함수형 인터페이스를 구현한 객체
- 함수형 인터페이스의 추상 메소드를 람다식으로 구현한다.
**✓ 레퍼런스 변수를 이용하면서 람다식을 호출**
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();
}
}