본문 바로가기
JAVA

20. 이벤트

by 김마리님 2020. 4. 20.

사용자의 선택에 따라 동적으로 변화하는 이벤트를 만들 것이다. 

이벤트의 객체는 많으나 간단하게 JButton으로 예시를 보자.

package ch14;

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 EventEx01 extends JFrame {
	public EventEx01() {
		setTitle("Action 이벤트 리스너 예제");
		//종료버튼 클릭 시 이벤트 분배 스레드 종료
		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(350,150);
		setVisible(true);
	}
	
	public static void main(String[] args) {
		new EventEx01();
	}
}

class MyActionListener implements ActionListener{
	public void actionPerformed(ActionEvent e) {
		JButton b=(JButton)e.getSource();
		if(b.getText().equals("Action"))
			b.setText("액션");
		else
			b.setText("Action");
	}
		
}

이 코드의 Jbutton이 보이는가?

이 버튼이 동적으로 변화할 때 마다 addEventListener로 타겟을 찾는다. 타겟 클래스에는 이벤트가 발생할 시 해야할 일들이 적혀있다(이 코드에서는 MyactionListner이다.) 

결과를 보자.

 

다음과 같이, 타겟 클래스에서 지정한대로 버튼 클릭이라는 이벤트가 생기면 조건문에 의해 버튼 내의 글씨가 영어이면 한글로, 영어가 아니라면 영어로 바꾸어준다.

 

이렇게 타겟 클래스를 독립된 클래스로 빼는 방법이 있고, 또 자기자신을 객채화 하는 방법이 있다.

package ch14;

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 EventEx02 extends JFrame implements ActionListener {
	EventEx02 ex02;
	public EventEx02() {
		setTitle("Action 이벤트 리스너 예제");
		//종료버튼 클릭 시 이벤트 분배 스레드 종료
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c=getContentPane();
		c.setLayout(new FlowLayout());
		
		JButton btn=new JButton("Action");
		btn.addActionListener(this);
		c.add(btn);
		setSize(350,150);
		setVisible(true);
	}
	
	public static void main(String[] args) {
		new EventEx02();
	}

	//EventEx02가 가진 타겟
	@Override
	public void actionPerformed(ActionEvent e) {
		System.out.println("버튼 클릭됨");
		
	}

	}

EventEx02라는 메인 클래스가 스스로 ActionListener 인터페이스를 상속받는 방법이다. 이 때, 문제는 타겟 클래스를 가리키기 위해 new를 이용하면 메인 클래스를 진행할 때 객체가 두 개가 된다는 문제가 있다. 따라서, 객체를 자기자신을 가리키는 this를 이용하여 타겟을 지정한다.

 

또 익명클래스를 이용하는 방법이 있다. 타겟 클래스 내부에 새로운 클래스를 만드는 방법이다.

 

package ch14;

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 EventEx01 extends JFrame {
	public EventEx01() {
		setTitle("Action 이벤트 리스너 예제");
		//종료버튼 클릭 시 이벤트 분배 스레드 종료
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c=getContentPane();
		c.setLayout(new FlowLayout());
		
		JButton btn=new JButton("Action");
		btn.addActionListener(new MyActionListener(){
        	public void actionPerformed(ActionEvent e) {
		JButton b=(JButton)e.getSource();
		if(b.getText().equals("Action"))
			b.setText("액션");
		else
			b.setText("Action");        
        });
		c.add(btn);
		setSize(350,150);
		setVisible(true);
	}
	
	public static void main(String[] args) {
		new EventEx01();
	}
}

 

이렇게 내부에 익명클래스를 이용해도 타겟을 지정할 수 있다.

반응형

'JAVA' 카테고리의 다른 글

jsoup를 이용한 언론사 크롤링하기  (0) 2020.08.14
19. GUI  (0) 2020.04.20
18. 소켓 통신  (0) 2020.04.14
17. 멀티 스레드  (0) 2020.04.13
16. 익명 클래스  (0) 2020.04.13