지금까지 JFrame 창만 만드는 작업만 해보았다.
이제 직접 속을 구현해서 동작하도록 만들어보자.
✔️ ActionListener
- interface로 제공한다.
- 이벤트가 발생할 때 어떤 기능을 쓸지 담당한다.
아무구현도 되지 않는 창이다.
plus
를 누르면 count되는 기능을 구현해보자.
ActionListener
를 implements한다.public class Counter extends JFrame implements ActionListener {
actionPerformed(ActionEvent ae)
를 오버라이딩해서 구현한다.@Override
public void actionPerformed(ActionEvent ae) {
...
}
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();
}
}
❗️ 이번에는 자신의 클래스에서 직접 책임을 지는 형식인 코드이다.
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();
}
}