9장: 자바 GUI 기초 및 AWT와 스윙(Swing), 10장: 자바 이벤트 처리

m0d0ri205·2024년 11월 24일
0

9장: 자바 GUI 기초 및 AWT와 스윙(Swing)


1. 자바의 GUI (Graphical User Interface)

  • 목적:
    • 사용자에게 직관적인 그래픽 환경 제공.
    • 마우스와 키보드로 상호작용.
  • 특징:
    • 다양한 GUI 컴포넌트를 제공하여 쉽고 강력한 개발 지원.
    • 플랫폼 독립적인 GUI 라이브러리 제공.

2. AWT(Abstract Windowing Toolkit)와 Swing

  • AWT:

    • 자바 최초의 GUI 라이브러리 (java.awt).
    • 운영체제 네이티브 컴포넌트를 사용하는 중량 컴포넌트(Heavyweight Component).
    • 빠른 속도를 제공하지만 운영체제 종속적.
  • Swing:

    • AWT 기반, 순수 자바로 구현 (javax.swing).
    • 경량 컴포넌트(Lightweight Component), 운영체제 독립적.
    • AWT보다 풍부한 컴포넌트를 제공.
    • 주요 컴포넌트:
      • JButton, JTextField, JLabel, JPanel, JComboBox, 등.

Swing과 AWT의 차이점

특징AWTSwing
패키지java.awtjavax.swing
컴포넌트중량 컴포넌트경량 컴포넌트
플랫폼 종속성운영체제 종속운영체제 독립적
외형기본 GUI화려한 고급 GUI 지원

3. Swing GUI 프로그램 구성

  1. 프레임 만들기:
    • 모든 Swing 컴포넌트는 JFrame에 부착.
    • setTitle(), setSize(), setVisible() 메소드를 통해 설정.
  2. main() 메소드 작성:
    • main()에서 GUI를 생성하고 실행.
  3. 컴포넌트 부착:
    • 버튼, 텍스트 필드 등 다양한 컴포넌트를 추가.

예제: 300x300 크기의 스윙 프레임

import javax.swing.*;

public class MyFrame extends JFrame {
    public MyFrame() {
        setTitle("스윙 프레임");
        setSize(300, 300);
        setVisible(true);
    }

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

10장: 자바 이벤트 처리


1. 이벤트 기반 프로그래밍

  • 이벤트(Event): GUI 컴포넌트에서 발생하는 사용자 입력 또는 시스템 동작.
  • 구성 요소:
    • 이벤트 소스: 이벤트를 발생시키는 GUI 컴포넌트.
    • 이벤트 객체: 이벤트 정보를 담는 객체.
    • 이벤트 리스너: 이벤트를 처리하는 클래스.

이벤트 처리 순서

  1. 이벤트 발생 (마우스 클릭, 키보드 입력 등).
  2. 이벤트 객체 생성.
  3. 적절한 이벤트 리스너 호출.
  4. 리스너 메소드 실행.

2. 이벤트 리스너 작성 방법

  1. 독립 클래스:

    class MyActionListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            System.out.println("버튼 클릭!");
        }
    }
    JButton btn = new JButton("Click Me");
    btn.addActionListener(new MyActionListener());
  2. 내부 클래스:

    btn.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            System.out.println("내부 클래스에서 처리!");
        }
    });
  3. 익명 클래스:

    btn.addActionListener(e -> System.out.println("람다식 사용!"));

3. 주요 이벤트와 리스너

  1. ActionEvent:

    • 버튼 클릭, 메뉴 선택 등.
    • 리스너: ActionListener.
    • 메소드: actionPerformed(ActionEvent e).
  2. MouseEvent:

    • 마우스 동작(클릭, 이동).
    • 리스너: MouseListener, MouseMotionListener.
    • 주요 메소드:
      • mousePressed(), mouseReleased(), mouseDragged().
  3. KeyEvent:

    • 키보드 입력.
    • 리스너: KeyListener.
    • 주요 메소드:
      • keyPressed(), keyReleased(), keyTyped().

4. GUI 배치 관리자

  1. FlowLayout:

    • 컴포넌트를 왼쪽에서 오른쪽으로 배치.
    container.setLayout(new FlowLayout());
  2. BorderLayout:

    • 화면을 동, 서, 남, 북, 중앙으로 나누어 배치.
    container.setLayout(new BorderLayout());
    container.add(new JButton("Click"), BorderLayout.CENTER);
  3. GridLayout:

    • 격자 형태로 컴포넌트를 배치.
    container.setLayout(new GridLayout(2, 3));
  4. Null Layout:

    • 컴포넌트의 위치와 크기를 직접 지정.
    component.setBounds(50, 50, 100, 30);

예제: FlowLayout 배치

Container c = getContentPane();
c.setLayout(new FlowLayout());
c.add(new JButton("Add"));
c.add(new JButton("Subtract"));

5. GUI 프로그램 종료

  • frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  • System.exit(0);

6. 주요 예제

  1. 마우스 클릭 이벤트

    class MyMouseListener extends MouseAdapter {
        public void mousePressed(MouseEvent e) {
            System.out.println("클릭 위치: " + e.getX() + ", " + e.getY());
        }
    }
  2. 키보드 방향키로 텍스트 이동

    public class MovingText extends JFrame {
        private JLabel label = new JLabel("Hello");
    
        public MovingText() {
            setLayout(null);
            label.setBounds(50, 50, 100, 30);
            add(label);
    
            addKeyListener(new KeyAdapter() {
                public void keyPressed(KeyEvent e) {
                    switch (e.getKeyCode()) {
                        case KeyEvent.VK_UP: label.setLocation(label.getX(), label.getY() - 10); break;
                        case KeyEvent.VK_DOWN: label.setLocation(label.getX(), label.getY() + 10); break;
                        case KeyEvent.VK_LEFT: label.setLocation(label.getX() - 10, label.getY()); break;
                        case KeyEvent.VK_RIGHT: label.setLocation(label.getX() + 10, label.getY()); break;
                    }
                }
            });
    
            setSize(400, 400);
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            setVisible(true);
            setFocusable(true);
            requestFocus();
        }
    
        public static void main(String[] args) {
            new MovingText();
        }
    }

7. 기타 유용한 Swing 컴포넌트

컴포넌트설명
JButton버튼
JLabel텍스트 라벨
JTextField단일 줄 텍스트 입력 필드
JComboBox드롭다운 리스트
JPanel컨테이너

profile
말하는 감자중.....

0개의 댓글