전공수업정리/Java

[JAVA]자바 GUI기초, AWT와 스윙(Swing)

킹대왕너구리 2024. 6. 2. 19:39

GUI

GUI응용프로그램

GUI는 Graphical User Interface로, 사용자와 상호작용하는 소프트웨어입니다.

사용자는 그래픽 요소(버튼, 텍스트 필드, 드롭다운 메뉴)를 통해 상호작용 할 수 있습니다.

AWT

AWT(Abstract Window Toolkit) 는 GUI 초기 프레임워크입니다.

최근에는 거의 모든 GUI 응용프로그램이 스윙기반으로 작성되고 있으므로 자세한 건 다음에 알아보도록 합시다~

Swing (AWT의 후속작!)

스윙은 AWT와 달리 순수 자바 언어로 작성되어 운영체제의 도움을 받지 않아 경량 컴포넌트라고 불린다.

스윙 컴포넌트의 이름은 AWT 컴포넌트와 구분하기 위해 모두 대문자 J로 시작한다.

스윙은 AWT에 구현된 이벤트 처리나 GUI 컴포넌트의 기본 원리를 바탕으로 작성되어 스윙을 사용하기 위해 AWT 패키지가 필요합니다.

 

GUI 패키지

GUI패키지 계층구조

자바의 패키지는 java.awt와 javax.swing으로 구성됩니다.

AWT는 Swing패키지의 기반이 됩니다.

Swing은 AWT의 기능을 확장하고 보완합니다.

 

1. java.awt

Component - 모든 AWT 구성 요소의 기본 클래스 입니다. 모든 GUI요소는 component클래스를 상속합니다.

    Container - Component를 상속하며, 다른 구성 요소를 포함할 수 있는 컨테이너 입니다.

        Panel-Container를 상속하는 최상위 컨테이너입니다.

        Window-Container를 상속하는 최상위 컨테이너입니다. 프레임, 다이얼로그 등의 기본 클래스입니다.

            Frame- Window를 상속하는 최상위 창입니다.

            Dialog : Window를 상속하는 대화 상자

 

2.javax.swing

JComponent-대부분의 Swing 구성요소의 기본 클래스,JComponent는 java.awt.Component를 상속

    JPanel-JComponent를 상속, 일반적으로 사용되는 Swing Container

    JFrame-Frame을 상속하며 일반적으로 사용되는 최상위 창

    JButton,JLabel,JTextField : JComponent를 상속, 다양한 사용자 인터페이스 제공

 

컨테이너와 컴포넌트

컨테이너- GUI 컴포넌트를 포함할 수 있는 컴포넌트. 즉, 컨테이너컴포넌트이면서 컨테이너다.

컨테이너는 java.awt.Containter 클래스를 상속 받아야 한다.

 

출처 - https://velog.io/@jyyoun1022/%EC%9E%90%EB%B0%94-GUI-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-1.%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88%EC%99%80%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8

 

최상위 컨테이너

컨테이너 중에서 다른 컨테이너에 속하지 않고 독립적으로 화면 출력할 수 있는 컨테이너

예)JFrame,JDialog,JApplet

스윙 GUI프로그램 만들기

 

스윙 패키지 사용을 위한 import 문

import java.awt.*; // 그래픽 처리를 위한 클래스들의 경로명
import java.awt.event.*; // AWT 이벤트 사용을 위한 경로명
import javax.swing.*; // 스윙 컴포넌트 클래스들의 경로명
import javax.swing.event.*; // 스윙 이벤트를 위한 경로명

 

스윙 프레임과 컨텐트팬

 

스윙프레임 

JFrame을 상속받아 구현

component가 화면에 보이려면 스윙 프레임 내에 부착되어야함.

프레임을 닫으면 프레임 내의 모든 컴포넌트 보이지 않음

 

JFrame의 기본 구성

프레임-스윙 프로그램의 기본 틀

메뉴바-메뉴들이 부착되는 공간

컨텐트 팬-메뉴를 제외한 모든 GUI 컴포넌트들을 부착하는 공간

 

프레임 만들기, JFrame 클래스 상속

import javax.swing.*;//스윙컴포넌트 클래스들의 경로명

public class MyFrame extends JFrame {	//JFrame클래스 상속
	public MyFrame() {
		setTitle("300*300 스윙프레임 만들기");
		setSize(300,300);//프레임 크기 지정
		setVisible(true);//프레임 출력
	}
	
	public static void main(String[] args) {
		MyFrame frame=new MyFrame();
	}

}

 

-main()메소드의 기능은 최소화하는 것이 좋다.

위 그림을 보면 MyFrame클래스를 만들고, 그 안에 main() 매소드를 만들었다.

이렇게 하면 main매소드를 위해 따로 클래스를 만들지 않아도 된다.

 

 

프레임에 컴포넌트 붙이기

 

타이틀 달기

public MyFrame() { // 생성자
	super("타이틀문자열"); // 1번 방법 Jframe의 생성자 호출하여 타이틀 달기
	setTitle("타이틀문자열"); // 2번 방법 메소드를 호출하여 타이틀 달기
}

 

컨텐트 팬에 컴포넌트 달기

 

스윙에서는 컨펜트팬컴포넌트를 달 수 있다.

컨텐트팬Container 타입이다.

JFrame 객체가 생기면 컨텐트팬은 자동으로 생성되지만, 현재 프레임에 붙어있는 컨텐트팬을 알아내기 위해서는

getContentPane() 메소드를 호출한다.

 

예제

import javax.swing.*;
import java.awt.*;

public class ContentPaneEx extends JFrame {//스윙프레임은 JFrame을 상속받는다.
	public ContentPaneEx() {
		setTitle("ContentPane과 Jframe");//프레임 타이틀 달기	
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//프로그램 윈도우를 닫는 작동을 하면 JFrame에서 프로그램 종료
		
		Container contentPane=getContentPane();//컨텐트 펜 알아내기
		contentPane.setBackground(Color.ORANGE);//컨탠트팬 색 오렌지 색으로//Color클래스는 java.awt에 속해있다.
		contentPane.setLayout(new FlowLayout());//컨텐트 팬 FlowLayout 배치 관리자 달기
		//FlowLayout() 컴포넌트들을 왼쪽에서 오른쪽으로 일렬로 배치한다. 
		contentPane.add(new JButton("OK"));
		contentPane.add(new JButton("Cancel"));
		contentPane.add(new JButton("Ignore"));
		
		setSize(300,150);//프레임 크기 300*150
		setVisible(true);//화면에 프레임 출력
	}
	
	
	public static void main(String[] args) {
		new ContentPaneEx();
	}

}

 

스윙 응용프로그램의 종료

우리는 창을 닫을때 x키를 눌러서 닫는다. (x)프레임 종료버튼

하지만 우리가 프로그램 내에서 어떠한 설정을 하지 않는다면 우리 눈에만 보이지 않을 뿐, 응용프로그램이 종료한게 아니다.

 

응용프로그램 내에서 스스로 모두 종료하는 방법

System.exit(0);

 

프레임 종료버튼이 클릭될 때 프레임을 닫고 응용프로그램이 종료하도록 하는 방법

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 

컨테이너 배치 container layout

컨테이너마다 하나의 배치관리자가 존재한다.

컨테이너의 크기가 변하면 내부 컴포넌트들의 위치와 크기를 모두 조절하고 재배치한다.

배치관리자는 java.awt패키지에 존재하는 클래스들이다.

따라서 배치관리자를 사용한다면 해당 클래스를 import해야한다.

import java.awt.*;

 

대표적인 배치관리자

FlowLayout-왼쪽에서 오른쪽으로 컴포넌트 배치, 오른쪽에 더이상 배치 공간 없으면 아래로 내려와서 다시 배

BorderLayout-컨테이너 공간을 동 서 남 북 중앙 으로 나누고 응용프로그램에서 지정한 영역에 컴포넌트 배치,영역지정을 안하면 중앙

GridLayout-공간을 2차원 격자로 나누고,좌 우 /위 아래 순으로 배치한다. 컴포넌트 크기는 셀의 크기와 동일

CardLayout-카드를 쌓아 놓은 듯이 컴포넌트 쪼개서 배치

 

컨테이너가 생성될 때 자동으로 배치관리자가 지정된다. 하지만 내가 따로 배치관리자를 설정하고 싶으면 어떡할까?

 

SetLayOut()메소드를 활용하면 된다.

말그대로 LayOut을 설정하는거다.

JPanel의 layout을 바꾸는 예제

JPanel p=new JPanel();
p.setLayout(new BorderLayout());

 

컨탠트 팬의 배치관리자 또한 setLayout으로 변경 가능

Container contentPane = frame.getContentPane();
contentPane.setLayout(new FlowLayout());

 

 

 

FlowLayout 배치관리자

import javax.swing.*;// 스윙컴포넌트 클래스들의 경로명
import java.awt.*;	//그래픽 요소를 넣을 수 있는 클래스들의 경로명
public class FlowLayoutEx extends JFrame {
	public FlowLayoutEx() {
		setTitle("FlowLayout Sample");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c=getContentPane();//JFrame의 디폴트 레이아웃은 BorderLayout
		
		//컨텐트팬에 FlowLayout컨테이너 설정
		c.setLayout(new FlowLayout(FlowLayout.LEFT,30,40));//방향 왼쪽, hgap30,vgap40
		c.add(new JButton("add"));
		c.add(new JButton("sub"));
		c.add(new JButton("mul"));
		c.add(new JButton("div"));
		c.add(new JButton("Calculate"));
		
		setSize(300,200);	//프레임 크기 설정
		setVisible(true);	//화면에 프레임 출력
		
	}

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

	}

}

BoarderLayout 배치관리자

import javax.swing.*;
import java.awt.*;


public class BorderLayoutEx extends JFrame{
	public BorderLayoutEx() {
		setTitle("BorderLayout Sample");
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		Container c=getContentPane();
		
		//컨텐트팬에 BorderLayout배치관리자 설정
		c.setLayout(new BorderLayout(30,20));
        
       	 //버튼 이름과, 버튼 layout 위치를 설정
		c.add(new JButton("시립대 폭파버튼!"),BorderLayout.CENTER);
		c.add(new JButton("add"),BorderLayout.NORTH);
		c.add(new JButton("sub"),BorderLayout.SOUTH);
		c.add(new JButton("mul"),BorderLayout.EAST);
		c.add(new JButton("div"),BorderLayout.WEST);
		
		setSize(500,300);
		setVisible(true);
	}
	
	
	
	public static void main(String[] args) {
		new BorderLayoutEx();
	}

}

GridLayout 배치관리자

import javax.swing.*;
import java.awt.*;

public class GridLayoutEx extends JFrame {
	public GridLayoutEx() {
		setTitle("GridLayout Sample");//제목 설정
		setDefaultCloseOperation(EXIT_ON_CLOSE);//x 누르면 응용프로그램 종료
		
		//4*2 격자의 GridLayout 배치관리자 형성
		GridLayout grid=new GridLayout(4,2);
		grid.setVgap(5);//격자 사이 수직간격 5로 형성
	
		Container c=getContentPane();//컨텐트팬 호출
		c.setLayout(grid);//컨탠트팬 레이아웃 설정
		c.add(new JLabel(" 이름"));//JLabel,JTextField 추가
		c.add(new JTextField(""));
		c.add(new JLabel(" 학번"));
		c.add(new JTextField(""));
		c.add(new JLabel(" 학과"));
		c.add(new JTextField(""));
		c.add(new JLabel(" 과목"));
		c.add(new JTextField(""));
		
		
		setSize(300,200);//Frame사이즈 설정
		setVisible(true);//화면에 띄우기
	
	}
	
	
	public static void main(String[] args) {
		new GridLayoutEx();

	}

}

 

 

배치관리자가 없는 컨테이너

import javax.swing.*;
import java.awt.*;

public class NullContainerEx extends JFrame {
	public NullContainerEx() {
		setTitle("Null Container Sample");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		Container c=getContentPane();
		c.setLayout(null);	//컨텐트팬의 배치관리자 제거
		
		//JLable 컴포넌트 생성
		JLabel la=new JLabel("Hello, press Buttons!");
        //layout이 없으면 위치와 크기를 지정해주어야한다!
		la.setLocation(130,50);
		la.setSize(200,20);
		c.add(la);//컨텐트팬에 부착!
		
		//9개의 버튼 컴포넌트를 생성하고 모두 동일한 크기로 설정한다.
		//위치는 서로 다르게 설정
		for(int i=1;i<=9;i++) {
			JButton b=new JButton(Integer.toString(i));//버튼 생성
			b.setLocation(i*15,i*15);//버튼 위치 설정
			b.setSize(50,20);//9개의 버튼 크기 동일하게 설정
			c.add(b);//버튼을 컨텐트 팬에 부착
		}
		
		setSize(300,200);
		setVisible(true);
		
	}
	
	public static void main(String[] args) {
		new NullContainerEx();

	}

}

'전공수업정리 > Java' 카테고리의 다른 글

[JAVA]입출력 스트림과 파일 입출력  (0) 2024.05.27
[JAVA]StringBuffer 클래스  (0) 2024.05.16
[JAVA]String 클래스  (1) 2024.05.15
[JAVA]Object class,프로세스,스레드,toString(),equal()  (0) 2024.05.15
[JAVA] 모듈  (0) 2024.05.10