본문 바로가기

STUDY/국비과정

[JAVA 웹 개발 공부] 국비지원 25일차 - 이벤트 처리, 내부 클래스, 익명 클래스

이벤트 처리

 

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();
	}
}