[JAVA] Swing 이벤트 처리

kbannie·2022년 11월 18일
0

JAVA

목록 보기
8/8
post-thumbnail

이벤트 처리

이벤트 기반 프로그래밍

이벤트 발생에 의해 프로그램 흐름이 결정되는 방식의 프로그램 패러다임입니다.

  • 이벤트
    • 사용자의 입력, 네트워크로부터 데이터 송수신 등
  • 이벤트 기반 프로그래밍
    • 어떤 사건에 따라 제어 흐름이 결정되어 동작을 처리

이벤트 처리 구조

각 이벤트 소스마다 이벤트 리스너와 연결합니다.
1. 이벤트 소스 객체 : 이벤트를 발생시킨 컴포넌트 객체입니다.
2. 이벤트 리스너 객체 : 이벤트 소스에서 발생한 이벤트를 처리하는 객체입니다.
3. 이벤트 핸들러 메서드 : 전달된 이벤트를 처리하는 메서드입니다.

이벤트 리스너

  • 각 이벤트에 대한 이벤트 핸들러 메서드를 구현하기 위한 객체입니다.
  • 이벤트 소스와 이벤트 리스너를 연결해줍니다.
  • 각 이벤트 소스는 addXXXListener() 메서드 호출로 XXXEvent 발생시 이를 처리할 이벤트 리스너 객체를 지정합니다.

이벤트 처리 과정

  1. 이벤트 소스에서 이벤트가 발생합니다.
  2. 이벤트 객체를 생성합니다.
  3. 이벤트 소스에 연관된 리스너에 이벤트 객체를 전달합니다.
  4. 이벤트 리스너의 이벤트 핸들러 메서드를 실행합니다.

이벤트 처리 방법

이벤트 처리를 위한 프로그래밍

  1. 이벤트 소스를 결정합니다.
    : 이벤트(ED)를 발생시킬 컴포넌트(CD)를 결정합니다.
  2. 이벤트 리스너를 구현합니다.
    : 이벤트(ED)를 처리할 객체의 클래스를 이벤트 리스너 인터페이스로 구현합니다.
  3. 이벤트 소스와 이벤트 리스너를 연결합니다.
    : addXXXListener() 메서드를 통해 CD에 이벤트 리스너를 연결합니다.

addXXXListener()의 인수인 리스너 생성 방법

1. 현재 클래스 사용

현재 응용 프로그램 클래스가 리스너 인터페이스를 구현합니다.
-> 리스너 연결시 리스너로부터 구현된 this를 전달합니다.

import java.awt.BorderLayout;
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.JTextField;

public class HelloEx implements ActionListener{
	
	private JFrame frame;
	private JTextField text;
	private JLabel label;
	
	public HelloEx() {
		frame=new JFrame("HelloEx");
		
		buildGUI();
		
		frame.setBounds(500,300,200,80);
		
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
	
	
	private void buildGUI() {
		text=new JTextField();
		JButton button=new JButton("확인");
		button.addActionListener(this); //button에서 ActionEvent가 나나타면 나에게 전달 
		                                //=> 내가 가지고 있는 actionPerformed에게 ActionEvent를 전달해서 처리하기
		
		label=new JLabel("Hello World");
		
		frame.add(text, BorderLayout.CENTER);
		frame.add(button, BorderLayout.EAST);
		frame.add(label, BorderLayout.SOUTH);
		
	}
	
	public static void main(String[] args) {
		new HelloEx();
	}


	@Override
	public void actionPerformed(ActionEvent e) {
		String name=text.getText();
		label.setText("Hello, "+name);
		
		text.setText("");
	}
}

2. 일반 클래스 사용

리스너 인터페이스를 구현하는 일반 클래스를 작성하고 추상 메서드를 구현합니다.

import java.awt.BorderLayout;
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.JTextField;

public class HelloEx_2{
	
	private JFrame frame;
	private JTextField text;
	private JLabel label;
	
	public HelloEx_2() {
		frame=new JFrame("HelloEx");
		
		buildGUI();
		
		frame.setBounds(500,300,200,80);
		
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
	
	
	private void buildGUI() {
		text=new JTextField();
		label=new JLabel("Hello World");
		
		JButton button=new JButton("확인");
		button.addActionListener(new ActionEventHandler(text, label)); 
		
		
		frame.add(text, BorderLayout.CENTER);
		frame.add(button, BorderLayout.EAST);
		frame.add(label, BorderLayout.SOUTH);
		
	}
	
	public static void main(String[] args) {
		new HelloEx_2();
	}


}

class ActionEventHandler implements ActionListener{
	
	private JTextField text;
	private JLabel label;
	
	ActionEventHandler(JTextField text, JLabel label){
		this.text=text;
		this.label=label;
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		String name=text.getText();
		label.setText("Hello, "+name);
		
		text.setText("");
		
	}
	
}

3. 내부 클래스 사용

응용 프로그램 클래스 안에 내부 클래스를 이용합니다.

import java.awt.BorderLayout;
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.JTextField;

public class HelloEx_3{
	
	private JFrame frame;
	private JTextField text;
	private JLabel label;
	
	public HelloEx_3() {
		frame=new JFrame("HelloEx");
		
		buildGUI();
		
		frame.setBounds(500,300,200,80);
		
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
	
	
	private void buildGUI() {
		text=new JTextField();
		label=new JLabel("Hello World");
		
		JButton button=new JButton("확인");
		button.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				String name=text.getText();
				label.setText("Hello, "+name);
					
				text.setText("");
			}
			
		}); 
		
		
		frame.add(text, BorderLayout.CENTER);
		frame.add(button, BorderLayout.EAST);
		frame.add(label, BorderLayout.SOUTH);
		
	}

	
	public static void main(String[] args) {
		new HelloEx_3();
	}

}

4. 익명 내부 클래스 사용

내부 클래스를 사용하면 별도 클래스 작성이 이벤트 핸들러만을 재정의하기 위해사용되었지만 이를 내부 클래스 사용으로 극복합니다.

import java.awt.BorderLayout;
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.JTextField;

public class HelloEx_4{
	
	private JFrame frame;
	private JTextField text;
	private JLabel label;
	
	public HelloEx_4() {
		frame=new JFrame("HelloEx");
		
		buildGUI();
		
		frame.setBounds(500,300,200,80);
		
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
	
	
	private void buildGUI() {
		text=new JTextField();
		label=new JLabel("Hello World");
		
		JButton button=new JButton("확인");
		button.addActionListener(new ActionEventHandler()); 
		
		
		frame.add(text, BorderLayout.CENTER);
		frame.add(button, BorderLayout.EAST);
		frame.add(label, BorderLayout.SOUTH);
		
	}
	
	class ActionEventHandler implements ActionListener{

		@Override
		public void actionPerformed(ActionEvent e) {
			String name=text.getText();
			label.setText("Hello, "+name);
			
			text.setText("");
			
		}
		
	}
	
	public static void main(String[] args) {
		new HelloEx_4();
	}


}

5. 익명 내부 클래스 임시 객체 사용

리스너 객체에 대한 참조변수 없이 임시 객체를 생성하여 리스너 등록시 인수로 사용합니다.

import java.awt.BorderLayout;
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.JTextField;

public class HelloEx_5{
	
	private JFrame frame;
	private JTextField text;
	private JLabel label;
	
	public HelloEx_5() {
		frame=new JFrame("HelloEx");
		
		buildGUI();
		
		frame.setBounds(500,300,200,80);
		
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
	
	
	private void buildGUI() {
		text=new JTextField();
		label=new JLabel("Hello World");
		
		JButton button=new JButton("확인");
		button.addActionListener(new ActionEventHandler()); 
		
		
		frame.add(text, BorderLayout.CENTER);
		frame.add(button, BorderLayout.EAST);
		frame.add(label, BorderLayout.SOUTH);
		
	}
	
	class ActionEventHandler implements ActionListener{

		@Override
		public void actionPerformed(ActionEvent e) {
			String name=text.getText();
			label.setText("Hello, "+name);
			
			text.setText("");
			
		}
		
	}
	
	public static void main(String[] args) {
		new HelloEx_5();
	}


}
profile
여행하는 데이터 사이언티스트🧙‍♂️

0개의 댓글

관련 채용 정보