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를 생성할 수 있도록 지원
특징
- 플랫폼 독립적 : JAVA가 실행되는 모든 플랫폼에서 동일한 코드로 GUI를 생성할 수 있도록 함
- 컴포넌트 기반 : 버튼, 텍스트 필드, 체크박스 등 다양한 GUI 컴포넌트 제공
- 이벤트 처리 : 사용자 입력에 대한 이벤트 처리 메커니즘을 갖추고 있어 버튼 클릭, 키 입력 등 다양한 사용자 상호작용을 처리할 수 있음
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 : 잘못된 글꼴을 나타내는 예외
주요 개념
- 컴포넌트 : 사용자와 상호작용할 수 있는 그래픽 표현을 가진 객체. 버튼, 텍스트 필드 등이 해당
- 컨테이너 : 다른 컴포넌트들을 포함할 수 있는 객체
- 레이아웃 관리자 : 컴포넌트를 시각적으로 배치하는 방식을 제어하는 관리자
반응형