JAVA/Java Platform, Standard Edition

[공식 문서] Swing을 통한 GUI 어플리케이션 개발 : java.awt 패키지

yebin0322 2025. 2. 3. 14:04
반응형

GUI(Graphical User Interface)

  • 사용자가 컴퓨터나 프로그램과 상호작용할 수 있도록 시각적으로 구성된 인터페이스
  • 텍스트 기반의 CLI(Command Line Interface)와 대조됨
  • 그래픽 요소를 사용하여 사용자에게 직관적이고 쉽게 접근할 수 있는 환경 제공

장점

  • 사용 용이성 : 직관적인 인터페이스 덕분에 사용자가 쉽게 배울 수 있음
  • 비주얼 피드백 : 사용자 입력에 대한 즉각적인 피드백을 제공하여 상호작용을 원활하게 함
  • 멀티태스킹 지원 : 여러 창과 애플리케이션을 동시에 열어 작업할 수 있음

단점

  • 리소스 소모 : 그래픽 요소를 랜더링하는 데 더 많은 시스템 자원 필요
  • 반응 속도 : 그래픽 요소가 많을 경우 성능 저하 발생

AWT(Abstract Window Toolkit)

  • JAVA에서 GUI(그래픽 사용자 인터페이스)를 구축하기 위한 라이브러리
  • 다양한 운영체제에서 일관된 UI를 제공하기 위해 설계됨
  • 자바 애플리케이션이 플랫폼에 독립적으로 GUI를 생성할 수 있도록 지원

특징

  1. 플랫폼 독립적 : JAVA가 실행되는 모든 플랫폼에서 동일한 코드로 GUI를 생성할 수 있도록 함
  2. 컴포넌트 기반 : 버튼, 텍스트 필드, 체크박스 등 다양한 GUI 컴포넌트 제공
  3. 이벤트 처리 : 사용자 입력에 대한 이벤트 처리 메커니즘을 갖추고 있어 버튼 클릭, 키 입력 등 다양한 사용자 상호작용을 처리할 수 있음

java.awt 패키지

인터페이스

  • ActiveEvent : 이벤트가 발생하면 해당 이벤트를 처리할 수 있는 방법 정의
import java.awt.ActiveEvent;
import java.awt.Button;
import java.awt.EventQueue;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class MyActiveEventExample {

    public static void main(String[] args) {
        Frame frame = new Frame("ActiveEvent Example");
        Button button = new Button("클릭");

        button.addActionListener(e -> {
            EventQueue.invokeLater(() -> {
                MyActiveEvent event = new MyActiveEvent();
                event.dispatch(); // ActiveEvent 분배
            });
        });
        frame.add(button);
        frame.setSize(300, 200);
        frame.setVisible(true);

        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent we) {
                System.exit(0);
            }
        });
    }
}

class MyActiveEvent implements ActiveEvent { // 비동기 이벤트 처리를 위한 인터페이스
    // 사용자 상호작용(버튼 클릭, 마우스 이동 등)이 발생했을 때 해당 이벤트를 비동기적 처리 -> 메인 스레드가 다른 작업을 계속 수행
    // 긴 작업을 수행하는 동안 UI의 응답성을 유지할 수 있음
    // UX를 위해 사용
    @Override
    public void dispatch() {
        System.out.println("ActiveEvent가 분배되었습니다.");
    }
}

  • Adjustable : 조정 가능한 숫자 값을 가진 객체를 위한 인터페이스. 슬라이더와 같은 UI 요소에서 사용됨
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.Scrollbar;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class AdjustableExample {

    public static void main(String[] args) {
        Frame frame = new Frame("Adjustable Example");
        frame.setSize(400, 200);
        frame.setLayout(new FlowLayout());

        Scrollbar scrollbar = new Scrollbar(Scrollbar.HORIZONTAL, 50, 1, 0, 100); //초기 값 50, 스크롤바 블록 크기 1, 최소 값 0, 최대값 100
        Label label = new Label("현재 값 : 50"); //초기 값이 50인 라벨 생성

        scrollbar.addAdjustmentListener(new AdjustmentListener() { //슬라이더의 값이 변경될 때 호출. 슬라이더의 값이 바뀌면 해당 값을 가져와 라벨의 텍스트를 업데이트

            @Override
            public void adjustmentValueChanged(AdjustmentEvent e) {
                int value = scrollbar.getValue();
                label.setText("현재 값 : " + value);

            }
        });

        frame.add(scrollbar);
        frame.add(label);

        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent we) {
                System.exit(0);
            }
        });

        frame.setVisible(true);
    }

}

  • LayoutManager : 컨테이너 내에서 컴포넌트들을 어떻게 배치할지를 정의하는 인터페이스. 다양한 레이아웃 스타일을 지원
import java.awt.FlowLayout;

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

public class FlowLayoutExample { 

    public static void main(String[] args) {
        JFrame frame = new JFrame("FlowLayout Example");
        frame.setLayout(new FlowLayout()); //컴포넌트를 왼쪽에서 오른쪽으로 배치하고 공간이 부족하면 다음 줄로 이동

        frame.add(new JButton("버튼 1"));
        frame.add(new JButton("버튼 2"));
        frame.add(new JButton("버튼 3"));
        frame.add(new JButton("버튼 4"));

        frame.setSize(400, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //사용자가 창을 닫을 때 프로그램이 종료되도록 설정
        frame.setVisible(true);
    }

}

  • Shape : 기하학적 형태를 나타내는 객체의 정의 제공. 도형 그리기에 사용됨
import javax.swing.*;
import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;

public class ShapeExample extends JPanel {
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;

        Shape rectangle = new Rectangle2D.Double(50, 50, 150, 100);
        g2d.setColor(Color.BLUE);
        g2d.fill(rectangle);


        Shape circle = new Ellipse2D.Double(250, 50, 100, 100);
        g2d.setColor(Color.RED);
        g2d.fill(circle);
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("Shape Example");
        ShapeExample shapeExample = new ShapeExample();

        frame.add(shapeExample);
        frame.setSize(400, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

}

클래스

  • AlphaComposite : 소스 색상과 대상 색상을 결합하여 블렌딩 및 투명 효과를 구현하는 클래스. 그래픽 디자인에서 유용하게 사용됨
import javax.swing.*;
import java.awt.*;
import java.awt.geom.Ellipse2D;

public class AlphaCompositeExample extends JPanel {

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;

        g2d.setColor(Color.RED);
        g2d.fill(new Ellipse2D.Double(50, 50, 150, 150));

        AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f);
        //AlphaComposite : 소스 색상(새로운 색상)과 대상 색상(이미 그려진 색상)을 결합하여 최종 색상을 생성하는 클래스
        //SRC_OVER : 소스 색상을 대상 색상 위에 그리도록 함, 0.5f : 투명도
        g2d.setComposite(ac);

        g2d.setColor(Color.BLUE);
        g2d.fill(new Ellipse2D.Double(100, 100, 150, 150));
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("AlphaComposite Example");
        frame.add(new AlphaCompositeExample());
        frame.setSize(400, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

  • Graphics : 그래픽을 그리기 위한 추상 기본 클래스. 다양한 그래픽 작업을 수행할 수 있는 메소드 제공
import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class GraphicsExample extends JPanel {

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        g.setColor(Color.GREEN);
        g.fillRect(50, 50, 100, 100);

        g.setColor(Color.ORANGE);
        g.fillOval(200, 50, 100, 100);
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("Graphics Example");
        frame.add(new GraphicsExample());
        frame.setSize(400, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

}

  • Frame : 제목과 테두리를 가진 최상위 창을 생성하는 클래스. 애플리케이션의 기본 윈도우 역할을 함
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;

public class FrameExample {

    public static void main(String[] args) {
        Frame frame = new Frame("Frame Example");
        frame.setSize(400,300);
        frame.setLayout(new FlowLayout());

        frame.add(new Button("버튼 1"));
        frame.add(new Button("버튼 2"));

        frame.setVisible(true);

        frame.addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent we) {
                System.exit(0);
            }
        });

    }

}

  • Panel : 가장 기본적인 컨테이너 클래스. 다른 컴포넌트들을 그룹화하여 관리하는 데 사용
import javax.swing.*;
import java.awt.*;

public class PanelExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Multiple Panel Example");
        frame.setSize(400, 300);
        frame.setLayout(new BorderLayout());

        JPanel panel1 = new JPanel();
        panel1.setLayout(new FlowLayout());
        panel1.setBorder(BorderFactory.createTitledBorder("패널 1"));
        panel1.add(new JButton("버튼 1-1"));
        panel1.add(new JButton("버튼 1-2"));

        JPanel panel2 = new JPanel();
        panel2.setLayout(new FlowLayout());
        panel2.setBorder(BorderFactory.createTitledBorder("패널 2"));
        panel2.add(new JButton("버튼 2-1"));
        panel2.add(new JButton("버튼 2-2"));

        frame.add(panel1, BorderLayout.NORTH);
        frame.add(panel2, BorderLayout.SOUTH);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

  • Button : 클릭할 수 있는 버튼을 생성하는 클래스. 사용자 인터페이스에서 중요한 요소
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

public class ButtonExample {

    public static void main(String[] args) {
        createAndShowButton();

    }

    private static void createAndShowButton() {
        JFrame frame = new JFrame("버튼 예제");
        frame.setSize(300, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new FlowLayout());

        JButton button = new JButton("클릭하세요!");

        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("버튼이 클릭되었습니다!");
            }
        });
        frame.add(button);
        frame.setVisible(true);
    }

}

예외

  • AWTException : AWT 관련 예외를 나타냄. GUI 작업 중 발생할 수 있는 오류를 처리하는 데 사용됨
  • FontFormatException : 잘못된 글꼴을 나타내는 예외

주요 개념

  • 컴포넌트 : 사용자와 상호작용할 수 있는 그래픽 표현을 가진 객체. 버튼, 텍스트 필드 등이 해당
  • 컨테이너 : 다른 컴포넌트들을 포함할 수 있는 객체
  • 레이아웃 관리자 : 컴포넌트를 시각적으로 배치하는 방식을 제어하는 관리자
반응형