이벤트 처리
1. 이벤트
이벤트(event)란 사건 발생을 알리는 비동기적 알림이나 신호를 말한다. 이벤트는 사용자 인터페이스나 외부 I/O 장치, 프로그램의 다른 부분에서 발생한다. 사용자는 마우스 클릭, 키보드 입력을 통해 이벤트를 발생시키며, 외부 I/O 장치는 데이터 수집이 끝났거나 오류 조건이 되었을 때 이벤트를 발생시킨다.
이벤트는 주로 사용자가 컴포넌트(단추, 목록 등)를 이용해 발생시키며, 이를 통해 프로세스는 실행 중 사용자가 원하는 작업을 파악하고 그에 대응하는 작업을 수행하게 된다.
2. 이벤트 발생원
이벤트 발생원(event source)는 이벤트(알림, 신호)를 발생시키는 근원지를 의미한다. 마우스와 키보드 같은 I/O 장치, AWT나 스윙에서는 사용자와의 의사소통에 사용하는 컴포넌트(단추, 입력 필드, 패널 등)들이 주로 이벤트 발생원이 된다.
3. 이벤트의 종류
이벤트 | 발생 시점 | 인터페이스 |
ActionEvent | 단추를 눌렀을 때 메뉴를 눌렀을 때 입력 필드에서 Enter 키를 눌렀을 때 목록에서 항목 하나를 선택하여 더블 클릭했을 때 |
ActionListener |
ComponentEvent | 컴포넌트가 이동되었을 때 컴포넌트가 화면에 보이지 않게 되었을 때 컴포넌트의 크기가 변경되었을 때 컴포넌트가 화면에 보이게 될 때 |
ComponentListener |
MouseEvent | 마우스 버튼을 누른 채로 마우스를 움직였을 때 마우스 포인터를 이동시킬 때 마우스 버튼을 눌렀을 때 마우스 버튼을 떼었을 때 마우스 포인터가 이벤트 발생원의 영역으로 들어왔을 때 마우스 포인터가 이벤트 발생원의 영역에서 나갔을 때 마우스 버튼을 눌렀다가 떼었을 때 |
MouseMotionListener MouseListener |
MouseWheelEvent | 마우스의 휠을 움직였을 때 | MouseWheelListener |
KeyEvent | 키보드의 키를 눌렀을 때 키보드의 키를 떼었을 때 키보드의 키를 눌렀다 떼었을 때 |
KeyListener |
TextEvent | 입력 필드 또는 입력 영역의 내용이 변경되었을 때 | TextListener |
FocusEvent | 이벤트 발생원으로 포커스가 이동했을 때 이벤트 발생원이 갖고 있던 포커스가 다른 컴포넌트로 이동했을 때 |
FocusListener |
ItemEvent | 확인란, 확인란 항목, 목록, 선택의 상태가 변경되었을 때 (selected/unselected) | ItemListener |
AdjustmentEvent | 스크롤 막대의 값이 변경되었을 때 | AdjustmentListener |
WindowEvent | 창이 열릴 때 창이 닫힐 때 창이 최소화되었을 때 창이 최소화된 상태에서 다시 원래 크기로 되었을 때 창이 활성화 되었을 때 창이 비활성화 되었을 때 창이 포커스를 얻을 때 창이 포커스를 잃었을 때 창의 상태가 변경되었을 때 |
WindowListener WindowFocusListener |
ContainerEvent | 컨테이너에 컴포넌트가 추가되었을 때 컨테이너에 컴포넌트가 제거되었을 때 |
ContainerListener |
4. 이벤트 처리기
이벤트 처리기(event handler)는 이벤트를 처리하는 역할을 담당한다. 해당 이벤트에 맞는 XXXListener라는 인터페이스로부터 상속받아 구현해야 한다. 각각의 리스너를 상속받은 클래스에서는 반드시 구현해야 하는 추상 메서드를 재정의해야 한다. 이 메서드가 바로 이벤트를 처리하는 실제 코드를 가진다.
예를 들어, 단추를 눌렀을 때 처리해야 할 코드를 구현할 클래스는 ActionEvent 이벤트를 처리할 수 있는 ActionListener 인터페이스를 상속받아 구현해야 한다.
이벤트 처리기는 이벤트가 발생할 때마다 매번 호출되어 실행되어야 한다. 이를 위해 이벤트 처리기로 정의한 클래스로부터 객체를 생성하고, 그런 다음 이 객체를 이벤트 발생원에 연결해 이벤트가 발생할 때마다 이벤트 처리기가 실행되게 한다.
내부 클래스(inner class)
내부 클래스는 클래스 내에 선언된 클래스이다.
한 클래스를 다른 클래스의 내부 클래스로 선언하면 두 클래스의 멤버들 간에 서로 쉽게 접근할 수 있다는 장점과 외부에서 불필요한 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다는 장점을 얻을 수 있다.
*내부 클래스의 종류
내부 클래스 | 특징 |
인스턴스 클래스(instance class) | 외부 클래스의 멤버변수 선언위치에 선언하며, 외부 클래스의 인스턴스멤버처럼 다루어진다. 주로 외부 클래스의 인스턴스멤버들과 관련된 작업을 사용될 목적으로 선언된다. |
스태틱 클래스(static class) | 외부 클래스의 멤버변수 선언위치에 선언하며, 외부 클래스의 static 멤버처럼 다루어진다. 주로 외부 클래스의 static 멤버, 특히 static 메서드에서 사용될 목적으로 선언된다. |
지역 클래스(local class) | 외부 클래스의 메서드나 초기화블럭 안에 선언하며, 선언된 영역 내부에서만 사용될 수 있다. 지역 클래스가 포함된 메소드는 접근 제어 지정자를 가질 수 없다. 지역 클래스는 abstract 또는 final로만 지정할 수 있다. |
익명 클래스(anonymous class) | 클래스의 선언과 객체의 생성을 동시에 하는 이름없는 클래스(일회용) |
익명 클래스(anonymous class)
익명 클래스는 다른 클래스들과는 달리 이름이 없다. 클래스의 선언과 객체의 생성을 동시에 하기 때문에 단 한번만 사용될 수 있고 오직 하나의 객체만을 생성할 수 있는 일회용 클래스이다.
이름이 없기 때문에 생성자도 가질 수 없으며, 조상클래스의 이름이나 구현하고자 하는 인터페이스의 이름을 사용해서 정의하기 때문에 하나의 클래스로 상속받는 동시에 인터페이스를 구현하거나 둘 이상의 인터페이스를 구현할 수 없다. 오로지 단 하나의 클래스를 상속받거나 단 하나의 인터페이스만을 구현할 수 있다.
*익명 클래스의 사용 예
classll InnerEx {
Object iv = new Object() { void method() {} }; // 익명 클래스
static Object cv = new Object() { void method() {} }; // 익명 클래스
void myMethod() {
Object lv = new Object() { void method() {} }; // 익명 클래스
}
}
*익명클래스의 사용 예 - 이벤트 리스너
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
System.out.println("액션 이벤트 동작 구현");
}
});
MouseEvent
import java.awt.Dimension;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
class ClickMe extends JFrame implements MouseListener {
public ClickMe() {
JPanel pnl = new JPanel();
pnl.setLayout(null);
pnl.setPreferredSize(new Dimension(500, 500));
JButton btn = new JButton("Click Me");
btn.setBounds(150, 150, 100, 100);
btn.addMouseListener(this);
pnl.add(btn);
add(pnl);
pack();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
@Override
public void mouseClicked(MouseEvent e) {
// System.out.println("x좌표: " + e.getX());
// System.out.println("y좌표: " + e.getY());
// System.out.println("x on Screen: " + e.getXOnScreen());
// System.out.println("y on Screen: " + e.getYOnScreen());
System.out.println(SwingUtilities.isLeftMouseButton(e));
System.out.println(e.getButton());
System.out.println("클릭count: " + e.getClickCount());
System.out.println("마우스 클릭!");
}
@Override
public void mouseEntered(MouseEvent e) {
System.out.println("마우스 커서가 버튼 안으로 위치했습니다.");
}
@Override
public void mouseExited(MouseEvent e) {
System.out.println("마우스 커서가 버튼 밖으로 위치했습니다.");
}
@Override
public void mousePressed(MouseEvent e) {
System.out.println("사용자의 마우스 버튼이 눌렸습니다.");
}
@Override
public void mouseReleased(MouseEvent e) {
System.out.println("사용자의 마우스 버튼이 떼어졌습니다.");
}
}
public class Main {
public static void main(String[] args) {
new ClickMe();
}
}
MouseListener는 추상메소드라 오버로드 해줘야 하는 메소드들이 많은데 불필요하다 생각해서
MouseAdapter 클래스가 만들어졌다.
클래스이므로 클래스를 따로 만들어야 하는데, 이때 클래스 내부에서 클래스를 만들 수 있다.
클래스를 내부에 만드는 이유는 안에서만 사용하고 외부접근 불가능하게 하려고 만든다.
import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
class ClickMe extends JFrame {
class MyMouseAdapter extends MouseAdapter {
@Override
public void mouseClicked(MouseEvent arg0) {
System.out.println("사용자가 클릭함");
}
}
public ClickMe() {
JPanel pnl = new JPanel();
pnl.setLayout(null);
pnl.setPreferredSize(new Dimension(500, 500));
JButton btn = new JButton("Click Me");
btn.setBounds(150, 150, 100, 100);
MouseListener listener = new MyMouseAdapter();
btn.addMouseListener(listener);
pnl.add(btn);
add(pnl);
pack();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
}
public class Main {
public static void main(String[] args) {
ClickMe frame = new ClickMe();
MouseAdapter adapter = frame.new MyMouseAdapter();
}
}
마우스 올리면 화면 전환이 되는 프레임 작성하기
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
class ChangeFrame extends JFrame {
public ChangeFrame() {
JPanel pnl = new JPanel();
ImageIcon imageIcon1 = new ImageIcon("춘식6.png");
ImageIcon imageIcon2 = new ImageIcon("춘식7.png");
JLabel lbl = new JLabel(imageIcon1);
lbl.setIcon(imageIcon1);
lbl.setSize(200, 200);
pnl.add(lbl);
add(pnl);
lbl.addMouseListener(new MouseAdapter() {
@Override
public void mouseExited(MouseEvent e) {
lbl.setIcon(imageIcon1);
}
@Override
public void mouseEntered(MouseEvent e) {
lbl.setIcon(imageIcon2);
}
});
setSize(400, 400);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
}
public class Main4 {
public static void main(String[] args) {
new ChangeFrame();
}
}
KeyEvent
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
class TestKey extends JFrame {
public TestKey() {
JPanel pnl = new JPanel();
JTextField tf = new JTextField(10);
tf.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
System.out.println("글자가 하나 typing 되었음");
}
@Override
public void keyReleased(KeyEvent e) {
System.out.println("키를 뗌");
}
@Override
public void keyPressed(KeyEvent e) {
System.out.println("키를 누름");
}
});
pnl.add(tf);
add(pnl);
setSize(500, 500);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
}
public class Main {
public static void main(String[] args) {
new TestKey();
}
}
// 특정한 키를 눌렀을 때 확인하기
@Override
public void keyPressed(KeyEvent e) {
// 방법1 (코드로 구분)
int code = e.getKeyCode();
if (code == KeyEvent.VK_A) {
System.out.println("A를 누름");
}
// 방법2 (글자로 구분)
char ch = e.getKeyChar();
System.out.println(ch + "를 입력함");
// 방법3
System.out.println(KeyEvent.getKeyText(code));
}
방향키 누르면 움직이게 하기
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
class MovingLabel extends JFrame {
private int x = 100;
private int y = 100;
public MovingLabel() {
JPanel pnl = new JPanel();
JLabel lbl = new JLabel("♥");
pnl.setLayout(null);
lbl.setBounds(x, y, 20, 20);
pnl.setFocusable(true);
pnl.addKeyListener(new KeyListener() {
@Override
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
switch (code) {
case KeyEvent.VK_UP:
System.out.println("방향키 위");
y -= 10;
break;
case KeyEvent.VK_DOWN:
System.out.println("방향키 아래");
y += 10;
break;
case KeyEvent.VK_LEFT:
System.out.println("방향키 왼쪽");
x -= 10;
break;
case KeyEvent.VK_RIGHT:
System.out.println("방향키 오른쪽");
x += 10;
break;
}
lbl.setLocation(x, y);
}
});
pnl.add(lbl);
add(pnl);
setSize(500, 500);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
}
public class Main2 {
public static void main(String[] args) {
new MovingLabel();
}
}
JDialog 만들기
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
class ColorFrame extends JDialog {
public ColorFrame() {
setModal(true); // 부모창과 상호작용 할 수 없게 해줌
JPanel pnlColor = new JPanel();
pnlColor.setBackground(Color.red);
add(pnlColor);
setSize(300, 300);
setVisible(true);
}
}
class MainFrame extends JFrame {
public MainFrame() {
JPanel pnl = new JPanel();
JButton btn = new JButton("새창 열기");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new ColorFrame();
}
});
pnl.add(btn);
add(pnl);
setSize(500, 500);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
}
public class Main3 {
public static void main(String[] args) {
new MainFrame();
}
}
입력받은 값으로 색이 있는 창만들기
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
class ColorFrame extends JDialog {
private int r;
private int g;
private int b;
public ColorFrame(int r, int g, int b) {
this.r = r;
this.g = g;
this.b = b;
setModal(true);
JPanel pnlColor = new JPanel();
pnlColor.setBackground(new Color(r, g, b));
JButton btn = new JButton("다이얼로그 닫기");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
dispose(); // 다이얼로그 닫힘
}
});
pnlColor.add(btn);
add(pnlColor);
setSize(300, 300);
setVisible(true);
}
}
class MainFrame extends JFrame {
public MainFrame() {
JPanel pnl = new JPanel();
JButton btn = new JButton("새창 열기");
JTextField tfR = new JTextField(3);
JTextField tfG = new JTextField(3);
JTextField tfB = new JTextField(3);
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int r = Integer.valueOf(tfR.getText());
int g = Integer.valueOf(tfG.getText());
int b = Integer.valueOf(tfB.getText());
new ColorFrame(r, g, b);
}
});
pnl.add(tfR);
pnl.add(tfG);
pnl.add(tfB);
pnl.add(btn);
add(pnl);
setSize(500, 500);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
}
public class Main3 {
public static void main(String[] args) {
new MainFrame();
}
}
다이얼로그 입력한 값을 다이얼로그 창 닫을 때 받기
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
class ColorFrame extends JDialog {
private int r;
private int g;
private int b;
private String input;
public String getInput() {
return input;
}
public ColorFrame(int r, int g, int b) {
this.r = r;
this.g = g;
this.b = b;
setModal(true);
JPanel pnlColor = new JPanel();
pnlColor.setBackground(new Color(r, g, b));
JTextField tfInput = new JTextField(10);
pnlColor.add(tfInput);
JButton btn = new JButton("다이얼로그 닫기");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
input = tfInput.getText();
dispose();
}
});
pnlColor.add(btn);
add(pnlColor);
setSize(300, 300);
setVisible(true);
}
}
class MainFrame extends JFrame {
public MainFrame() {
JPanel pnl = new JPanel();
JButton btn = new JButton("새창 열기");
JTextField tfR = new JTextField(3);
JTextField tfG = new JTextField(3);
JTextField tfB = new JTextField(3);
JLabel lbl = new JLabel("다이얼로그에서 입력한 문자");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int r = Integer.valueOf(tfR.getText());
int g = Integer.valueOf(tfG.getText());
int b = Integer.valueOf(tfB.getText());
ColorFrame dialog = new ColorFrame(r, g, b);
String input = dialog.getInput();
lbl.setText(input);
}
});
pnl.add(tfR);
pnl.add(tfG);
pnl.add(tfB);
pnl.add(btn);
pnl.add(lbl);
add(pnl);
setSize(500, 500);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
}
public class Main3 {
public static void main(String[] args) {
new MainFrame();
}
}
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
class ColorDialog extends JDialog {
private int r;
private int g;
private int b;
public ColorDialog(int r, int g, int b, MainFrame main) {
this.r = r;
this.g = g;
this.b = b;
setModal(true);
JPanel pnlColor = new JPanel();
pnlColor.setBackground(new Color(r, g, b));
JTextField tfInput = new JTextField(10);
pnlColor.add(tfInput);
JButton btn = new JButton("다이얼로그 닫기");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
main.getLbl().setText(tfInput.getText());
dispose();
}
});
pnlColor.add(btn);
add(pnlColor);
setSize(300, 300);
setVisible(true);
}
}
class MainFrame extends JFrame {
private JLabel lbl;
public JLabel getLbl() {
return lbl;
}
public MainFrame() {
JPanel pnl = new JPanel();
JButton btn = new JButton("새창 열기");
JTextField tfR = new JTextField(3);
JTextField tfG = new JTextField(3);
JTextField tfB = new JTextField(3);
lbl = new JLabel("다이얼로그에서 입력한 문자");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int r = Integer.valueOf(tfR.getText());
int g = Integer.valueOf(tfG.getText());
int b = Integer.valueOf(tfB.getText());
ColorDialog dialog = new ColorDialog(r, g, b, MainFrame.this);
}
});
pnl.add(tfR);
pnl.add(tfG);
pnl.add(tfB);
pnl.add(btn);
pnl.add(lbl);
add(pnl);
setSize(500, 500);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
}
public class Main3 {
public static void main(String[] args) {
new MainFrame();
}
}
경고창 메시지
import javax.swing.JOptionPane;
public class Main4 {
public static void main(String[] args) {
JOptionPane.showMessageDialog(null, "메시지 보여주기");
JOptionPane.showMessageDialog(null, "경고 메시지 내용", "경고", JOptionPane.WARNING_MESSAGE);
JOptionPane.showMessageDialog(null, "에러 메시지 내용", "에러", JOptionPane.ERROR_MESSAGE);
}
}
String name = JOptionPane.showInputDialog("이름이 뭐니?");
if (name == null) {
JOptionPane.showMessageDialog(null, "이름을 입력하세요", "에러", JOptionPane.ERROR_MESSAGE);
} else {
JOptionPane.showMessageDialog(null, name + " 환영");
}
예제 문제
<예제 01>
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
class InputDialog extends JDialog {
private String name;
private int age;
public String getName() {
return name;
}
public int getAge() {
return age;
}
public InputDialog() {
JPanel pnl1 = new JPanel();
JPanel pnl2 = new JPanel();
JPanel pnl3 = new JPanel();
JLabel lblName = new JLabel("이름");
JTextField tfName = new JTextField(10);
JLabel lblAge = new JLabel("나이");
JTextField tfAge = new JTextField(10);
JButton btn = new JButton("확인");
pnl1.add(lblName);
pnl1.add(tfName);
pnl2.add(lblAge);
pnl2.add(tfAge);
pnl3.add(btn);
add(pnl1, "North");
add(pnl2, "Center");
add(pnl3, "South");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
name = tfName.getText();
age = Integer.valueOf(tfAge.getText());
dispose();
}
});
setSize(300, 150);
setModal(true);
setVisible(true);
}
}
class MainFrame extends JFrame {
public MainFrame() {
JPanel pnl = new JPanel();
JPanel pnlResult = new JPanel();
JButton btnInput = new JButton("제출하기");
JLabel lblResult = new JLabel();
pnl.add(btnInput);
pnlResult.add(lblResult);
add(pnl, "Center");
add(pnlResult, "South");
btnInput.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
InputDialog dialog = new InputDialog();
lblResult.setText(dialog.getName() + "(" + dialog.getAge() + ")");
}
});
setSize(400, 200);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
}
public class Main {
public static void main(String[] args) {
new MainFrame();
}
}
<예제 02>
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.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
class QuizFrame extends JFrame {
private int num1 = (int)(Math.random() * 100 + 1);
private int num2 = (int)(Math.random() * 100 + 1);
private int input;
private int count;
public QuizFrame() {
JPanel pnl1 = new JPanel();
JPanel pnl2 = new JPanel();
JPanel pnl3 = new JPanel();
JLabel lblTitle = new JLabel("간단한 퀴즈(사칙연산) " + num1 + " + " + num2);
JTextField tfInput = new JTextField(10);
JButton btn = new JButton("제출");
JLabel lblResult = new JLabel("현재까지 점수: " + count);
pnl1.add(lblTitle);
pnl2.add(tfInput);
pnl2.add(btn);
pnl3.add(lblResult);
add(pnl1, "North");
add(pnl2, "Center");
add(pnl3, "South");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
input = Integer.valueOf(tfInput.getText());
ResultDialog resultDialog = new ResultDialog(num1, num2, input);
if (num1 + num2 == input) {
JOptionPane.showMessageDialog(QuizFrame.this, "정답입니다.");
count++;
lblResult.setText("현재까지 점수: " + count);
num1 = (int)(Math.random() * 100);
num2 = (int)(Math.random() * 100);
lblTitle.setText("간단한 퀴즈(사칙연산) " + num1 + " + " + num2);
} else {
JOptionPane.showMessageDialog(QuizFrame.this, "틀렸습니다.");
num1 = (int)(Math.random() * 100);
num2 = (int)(Math.random() * 100);
lblTitle.setText("간단한 퀴즈(사칙연산) " + num1 + " + " + num2);
}
}
});
setSize(500, 300);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
}
public class Main3 {
public static void main(String[] args) {
new QuizFrame();
}
}