[Java] swing_ActionListener

JTI·2022년 12월 15일
0

☕️  Java

목록 보기
45/59

💡 JFrame창 구현 및 액션넣기


지금까지 JFrame 창만 만드는 작업만 해보았다.

이제 직접 속을 구현해서 동작하도록 만들어보자.

✔️ ActionListener

  • interface로 제공한다.
  • 이벤트가 발생할 때 어떤 기능을 쓸지 담당한다.

✏️ 예제 1_ ActionListener 직접넣기

아무구현도 되지 않는 창이다.
plus 를 누르면 count되는 기능을 구현해보자.

  1. 먼저 ActionListener 를 implements한다.
public class Counter extends JFrame implements ActionListener {
  1. actionPerformed(ActionEvent ae) 를 오버라이딩해서 구현한다.
  • 여기서 try-catch문을 이용해 예외를 잡아준다.
@Override
public void actionPerformed(ActionEvent ae) {
	...
}
  1. ActionListener 를 연결한다.
private void addListeners() {
	btnPlus.addActionListener(this);
}

이렇게 하면 최종적으로 이런 코드가 나온다.

✏️ 결과 코드

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Counter extends JFrame implements ActionListener {
	
	private JButton btnPlus;
	private JLabel lblNum;
	
	public Counter() {
		init();
		setDisplay();
		addListeners();
		showFrame();
	}
//	Component 초기화
	private void init() {
		btnPlus = new JButton("plus");
		lblNum = new JLabel("0", JLabel.CENTER);
		lblNum.setFont(new Font(Font.DIALOG, Font.BOLD, 60));
	}
//	화면 배치
	private void setDisplay() {
		add(lblNum, BorderLayout.CENTER);
		add(btnPlus, BorderLayout.SOUTH);
	}
//	이벤트 리스너 연결
	private void addListeners() {
		btnPlus.addActionListener(this);
	}
//	프레임 설정 및 마무리
	private void showFrame() {
		setTitle("counter");
		setSize(300, 400);
		setLocation(100, 0);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setResizable(false);
		setVisible(true);
	}
	
	@Override
	public void actionPerformed(ActionEvent ae) {
		
        // 1. 레이블의 숫자(String)를 가져온다.
		String strNum = lblNum.getText();
		
		// 2. String -> int
		int num = Integer.parseInt(strNum);
		
		// 3. 증가
		num++;
		
		// 4. int -> String
		strNum = String.valueOf(num);
		
		// 5. 레이블에 넣기
		lblNum.setText(strNum);
	}
	
	public static void main(String[] args) {
		new Counter();
	}
}


이렇게 누르면 count된 것을 확인할 수 있다.

✏️ 따로 클래스를 만들어서 구현하기

❗️ 이 방법은 좋은 방법이 아니다. (다른 클래스에 책임을 전가하기 때문) 그냥 참고만 하자.

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JLabel;

public class MyActionListener implements ActionListener {
	
	private Counter owner;
	
	public MyActionListener(Counter owner) {
		this.owner = owner;
	}
	
	@Override
	public void actionPerformed(ActionEvent ae) {
		JLabel lblNum = owner.getLblNum();
		String strNum = lblNum.getText();
		int num = Integer.parseInt(strNum);
		num++;
		strNum = String.valueOf(num);
		lblNum.setText(strNum);
	}	
}
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Counter extends JFrame {
	
	private JButton btnPlus;
	private JLabel lblNum;
			
	public JLabel getLblNum() {
		return lblNum;
	}
	
	public Counter() {
		init();
		setDisplay();
		addListeners();
		showFrame();
	}
//	Component 초기화
	private void init() {
		btnPlus = new JButton("plus");
		lblNum = new JLabel("0", JLabel.CENTER);
		lblNum.setFont(new Font(Font.DIALOG, Font.BOLD, 60));
	}
//	화면 배치
	private void setDisplay() {
		add(lblNum, BorderLayout.CENTER);
		add(btnPlus, BorderLayout.SOUTH);
	}
//	이벤트 리스너 연결
	private void addListeners() {
		btnPlus.addActionListener(new MyActionListener(this));
	}
//	프레임 설정 및 마무리
	private void showFrame() {
		setTitle("counter");
		setSize(300, 400);
		setLocation(100, 0);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setResizable(false);
		setVisible(true);
	}
	
	public static void main(String[] args) {
		new Counter();
	}
}

✏️ 따로 클래스를 만들어서 구현하기2

❗️ 이번에는 자신의 클래스에서 직접 책임을 지는 형식인 코드이다.

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JLabel;

public class MyActionListener implements ActionListener {
	
	private Counter owner;
	
	public MyActionListener(Counter owner) {
		this.owner = owner;
	}
	
	@Override
	public void actionPerformed(ActionEvent ae) {
		owner.plus(); // Counter 클래스에서 가져옴
	}	
}
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Counter extends JFrame {
	
	private JButton btnPlus;
	private JLabel lblNum;
	
	public Counter() {
		init();
		setDisplay();
		addListeners();
		showFrame();
	}
//	Component 초기화
	private void init() {
		btnPlus = new JButton("plus");
		lblNum = new JLabel("0", JLabel.CENTER);
		lblNum.setFont(new Font(Font.DIALOG, Font.BOLD, 60));
	}
//	화면 배치
	private void setDisplay() {
		add(lblNum, BorderLayout.CENTER);
		add(btnPlus, BorderLayout.SOUTH);
	}
//	이벤트 리스너 연결
	private void addListeners() {
		btnPlus.addActionListener(new MyActionListener(this));
	}
//	프레임 설정 및 마무리
	private void showFrame() {
		setTitle("counter");
		setSize(300, 400);
		setLocation(100, 0);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setResizable(false);
		setVisible(true);
	}
    // actionPerformed 구현
	public void plus() {
		lblNum.setText(String.valueOf(Integer.parseInt(lblNum.getText()) + 1));
	}
	
	public static void main(String[] args) {
		new Counter();
	}
}
profile
Fill in my own colorful colors🎨

1개의 댓글