본문 바로가기
Back-End/Java

[Java] GUI(AWT, Swing) - JFrame, JButton, JCheckBox, JRadioButton, JToggleButton

by 찐코딩 2021. 9. 29.

* Java GUI(Graphic User Interface)


 - 이미지 혹은 그래픽을 이용하여 메뉴 등을 포함하는 화면을 구성하고,
   키보드와 마우스 등의 편리한 입력 도구를 이용하여 사용자가 입력하기 편하도록 만들어진 사용자 인터페이스
 - java에서는 AMT와 Swing으로 어떠한 언어보다 강력한 GUI 라이브러리를 제공하여 소프트웨어 개발자들이
   다양한 GUI를 쉽게 구성할 수 있도록 함.


 * AWT와 Swing

 

  - 자바 언어는 GUI 프로그램을 쉽게 작성할 수 있도록 다양한 GUI 컴포넌트들을 제공.
    자바 GUI 컴포넌트는 AWT 컴포넌트와 Swing 컴포넌트로 구분이 됨.
     
  1. AWT 컴포넌트

     - java.awt 패키지를 통하여 공급이 됨
     - 운영체제의 도움을 받아 화면에 출력되기 때문에 자원을 많이 소모하여 운영체제의 부담이 큼.
     - 운영체제마다 컴포넌트의 모양이 다르게 나타남.


  2. Swing 컴포넌트

     - javax.swing 패키지를 통하여 공급이 됨.
     - AWT와 다르게 자바 언어로 작성이 되었음.
       ==> Sun사와 네스케이프라는 회사가 공동으로 개발함.
     - 운영체제의 도움을 받지 않았음. ==> 경량 컴포넌트라고 불림.
     - 운영체제와 관계 없이 항상 동일한 모양이 나타남.
     - AWT에는 없는 풍부한 고급 Swing 컴포넌트들을 추가적으로 개발을 하였음.
     - 다양하고 모양이 예쁜 Swing 컴포넌트를 더 많이 사용함.
       ==> 최근에는 거의 모든 GUI 프로그램이 Swing 기반으로 작성됨.


*  GUI에서 알아두어야 할 용어 - 3가지


  - 컴포넌트 : 버튼, 텍스트상자, 레이블상자, 옵션박스, 체크박스, 라디오버튼 등을 말함.
  - 컨테이너 : 컴포넌트들을 담을 수 있는 클래스.
    ==> 컴포넌트는 반드시 컨테이너에 올려져야 화면에 보여짐.
  - 프레임 : 컨테이너들을 담을 수 있는 클래스.
     ==> 컨테이너는 반드시 프레임에 올려져야 화면에 보여짐.
        


   (단면으로 보았을 때)
            ▣ ▣ ▣ ▣ ▣ ▣ ▣ ▣             - 컴포넌트
      □□□□□□□□□□□□□□□      - 컨테이너    
    ■■■■■■■■■■■■■■■■■   - 프레임

 

 

* Frame을 만드는 방법

1. Frame이라는 클래스를 상속을 받아서 생성자를 통해 화면에 Frame을 보여주는 방법

2. Frame이라는 클래스의 객체를 생성해서 사용.


예제01) AWT를 이용한 Frame 생성

-  Frame이라는 클래스를 상속을 받아서 생성자를 통해 화면에 Frame을 보여주는 방법

package sist;

import java.awt.Frame;

public class Ex01_Frame extends Frame {

		public Ex01_Frame() {
			
			// 프레임에 제목을 설정하는 메소드
			// 프레임의 상단 쪽에 제목이 나타날 것
			super("첫번째 예제");
			
			// 프레임의 위치를 설정하는 메소드
			// setLocation(x, y)
			setLocation(200, 200);
			
			// 프레임의 크기를 설정하는 메소드
			// setSize(가로 픽셀수, 세로 픽셀수)
			setSize(300, 300);
			
			// 프레임을 화면에 보여주는 메소드
			setVisible(true);
		}
		
		public static void main(String[] args) {
			
			// 생성자 호출
			new Ex01_Frame();
		}

	

}

- Frame이라는 클래스의 객체를 생성해서 사용.

/*
  	Frame을 만드는 방법 - 두번째
  		- Frame 이라는 클래스의 객체를 생성해서 사용
 */


package sist;

import java.awt.Frame;

public class Ex02_Frame {

	public static void main(String[] args) {
		
		// Frame 이라는 클래스의 객체 생성
		Frame frame = new Frame("두번째 예제");
		
		// frame.setTitle("두번째 예제");
		// 라고 해도 된다.
		
		// 프레임 위치 설정
		// frame.setLocation(200, 200);
		
		// 프레임 크기 설정
		// frame.setSize(200, 300);	
		
		// 프레임의 위치 + 크기 지정
		// 순서대로 x축, y축 위치, 가로 픽셀, 세로 픽셀 기입
		frame.setBounds(200, 200, 200, 300);
		
		// 프레임을 화면에 보여주기
		frame.setVisible(true);

	}

}

 

두 가지 방법 모두 같은 결과가 나타난다.

AWT로 만든 프레임은 X를 눌러도 창이 꺼지지 않으며, Console창에서 중단(빨간버튼)을 눌러야만 창이 꺼진다.

 

예제02) Swing을 이용한 Frame 만들기

- JFrame이라는 클래스를 상속을 받아서 생성자를 통해 화면에 Frame을 보여주는 방법

/*
JFrame이라는 클래스를 상속을 받아서 생성자를 통해 화면에 Frame을 보여주는 방법
*/
package sist;

import javax.swing.JFrame;

public class Ex03_JFrame extends JFrame{
	
	public Ex03_JFrame() {		// 기본 생성자
		
		// 프레임 이름 지정
		setTitle("세번째 예제");
		
		// 프레임 위치 설정
		setBounds(200, 200, 300, 300);
		
		// 프레임 보이기
		setVisible(true);
	}

	public static void main(String[] args) {
	
		// 생성자 호출
		new Ex03_JFrame();

	}

}

AWT와 다르게 화면이 회색이다.

- JFrame이라는 클래스의 객체를 생성해서 사용하는 방법

/*
JFrame이라는 클래스의 객체를 생성해서 사용.
*/

package sist;

import javax.swing.JFrame;

public class Ex04_JFrame {

	public static void main(String[] args) {
		
		JFrame jframe = new JFrame("네번째 예제");
		
		jframe.setBounds(800, 600, 300, 300);
		
		jframe.setVisible(true);
		
	}

}

마찬가지로 위 코드대로만 생성하면 X 버튼을 눌러도 창이 꺼지지 않고 콘솔창의 Terminate를 눌러야만 꺼진다.

	// 프레임 x 버튼 유효화
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

이 코드를 쓰면 X버튼이 유효화 된다.

 

예제03) Frame에 Button을 추가하기

package sist;

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

//JButton : 스윙에서 제공하는 버튼
public class Ex06_JButton extends JFrame {		
	
	public Ex06_JButton() {		// 기본생성자
		
		setTitle("JButton 예제");
		
		// 컨테이너 만들기
		JPanel container = new JPanel();
		
		// 1. 컴포넌트를 만들자		
		JButton button1 = new JButton("버튼 1");
		JButton button2 = new JButton("버튼 2");
		JButton button3 = new JButton("버튼 3");
		
		
		// 2. 컴포넌트를 컨테이너에 올리기
		container.add(button1);
		container.add(button2);
		container.add(button3);
		
		
		// 3. 컨테이너를 프레임에 올리기
		add(container);
		
		// 위치, 크기 지정
		setBounds(200, 200, 300, 300);
		
		// 보이기
		setVisible(true);
		
	}

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

	}

}

 

예제04) Frame에 CheckBox 추가하기

package sist;

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

public class Ex07_JCheckBox extends JFrame {
	
	// 다중선택이 가능한 체크박스 생성
	public Ex07_JCheckBox() {	// 기본 생성자
		
		// 프레임 이름 지정
		setTitle("JCheckBox 예제");
		
		// 컨테이너를 만들자
		JPanel container = new JPanel();
		
		// 1. 컴포넌트를 만들어 보자
		JCheckBox jcb1 = new JCheckBox("볼링");
		JCheckBox jcb2 = new JCheckBox("독서", true); // 독서 체크박스가 체크된 채로 나타남
		JCheckBox jcb3 = new JCheckBox("영화감상");
		JCheckBox jcb4 = new JCheckBox("윤동");
		JCheckBox jcb5 = new JCheckBox("수면");
		
		// 2. 컨테이너에 컴포넌트 올리기
		container.add(jcb1); 		container.add(jcb2);
		container.add(jcb3); 		container.add(jcb4);
		container.add(jcb5);
		
		// 3. 프레임에 컨테이너 올리기
		add(container);
		
		// 4. 프레임 위치, 크기 지정
		setBounds(200, 200, 300, 300);
		
		// 5. 프레임 보이기
		setVisible(true);
	}

	public static void main(String[] args) {
		
		new Ex07_JCheckBox();		// 생성자 호출
	}
}

체크박스이기때문에 여러개 체크 가능

 

예제05) ImageIcon을 이용한 CheckBox 만들기

먼저, 같은 프로젝트 안에 이미지 파일이 있어야한다.

package sist;

import javax.swing.*;  // 이렇게 하면 코드도 줄이고, 필요한 모든 클래스를 import함
//import javax.swing.ImageIcon;
//import javax.swing.JCheckBoxMenuItem;
//import javax.swing.JFrame;
//import javax.swing.JPanel;


// 이미지가 들어간 체크박스를 만들어 보자

public class Ex08_JCheckBox_with_Image extends JFrame {
	
	public Ex08_JCheckBox_with_Image() {	// 기본 생성자
		
		// 프레임 이름 
		setTitle("과일 체크박스 예제");
		
		// 컨테이너를 만들자
		JPanel container = new JPanel();
		
		// 1-1. 과일 이미지 아이콘을 만들어 보자		
		ImageIcon kiwi = new ImageIcon("images/kiwi.jpg");
		ImageIcon mango = new ImageIcon("images/mango.jpg");
		ImageIcon apple = new ImageIcon("images/사과.jpg"); // 파일명이 한글이어도 읽힐까?
		
		// 1-2. 컴포넌트 만들기
		JCheckBoxMenuItem jcb1 =
				new JCheckBoxMenuItem("키위", kiwi);
		JCheckBoxMenuItem jcb2 =
				new JCheckBoxMenuItem("망고", mango);
		JCheckBoxMenuItem jcb3 =
				new JCheckBoxMenuItem("사과", apple);
		
		// 2. 컨테이너에 컴포넌트 올리기
		container.add(jcb1);
		container.add(jcb2);
		container.add(jcb3);
				
		// 3. 프레임에 컨테이너 올리기
		add(container);
		
		// 4. 프레임 위치, 크기 지정
		// 프레임 크기는 고정된 게 아니기 때문에 사용자가 임의로 변경할 수 있다
		setBounds(200, 200, 300, 600);
		
		// 프레임의 크기를 고정시키는 메소드
		// setResizable() 괄호 안 값이 true로 되어있음(default)
		setResizable(false);
		
		// 프레임의 x버튼 클릭 시 종료시키는 메소드
		// setDefaultCloseOperation(오퍼레이션명.EXIT_ON_CLOSE);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		// 5. 프레임 보이기
		setVisible(true);
				
	}

	public static void main(String[] args) {
		
		new Ex08_JCheckBox_with_Image();		// 생성자 호출
	}
}

 

예제06) Frame에 RadioButton 추가하기

package sist;

import javax.swing.*;

public class Ex09_JRadioButton extends JFrame{
	
	// 하나의 선택만 할 수 있는 라디오 버튼을 만들어보자
	public Ex09_JRadioButton() {	// 기본 생성자
		
		// 프레임 이름 지정
		setTitle("JRadioButton 예제");
		
		JPanel container = new JPanel();
		
		// 1. 컴포넌트를 만들자
		JRadioButton jrb1 = new JRadioButton("게임");
		JRadioButton jrb2 = new JRadioButton("여행");
		JRadioButton jrb3 = new JRadioButton("운동");
		JRadioButton jrb4 = new JRadioButton("잠자기");
				
		// 라디오버튼은 반드시 ButtonGroup에 올려야 한다
		// 중복선택이 되는 것을 막기위해
		ButtonGroup bg = new ButtonGroup();
		bg.add(jrb1);
		bg.add(jrb2);
		bg.add(jrb3);
		bg.add(jrb4);
		
		
		// 2. 컨테이너에 컴포넌트 올리기
		container.add(jrb1);
		container.add(jrb2);
		container.add(jrb3);
		container.add(jrb4);
			
		// 3. 프레임에 컨테이너 올리기
		add(container);
		
		// 4. 프레임 위치, 사이즈 지정
		setBounds(200, 200, 300, 300);
		
		// 프레임의 x버튼 클릭 시 종료시키자
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		// 5. 프레임 보이기
		setVisible(true);
	}

	public static void main(String[] args) {
		
		new Ex09_JRadioButton();	// 생성자 호출
	}

}

라디오버튼은 하나만 선택 가능하다.

 

예제07) Frame에 ToggleButton 추가

ToggleButton 이란? 한 번 누르면 선택이 되고, 다시 누르면 선택이 해제되는 버튼

package sist;

import javax.swing.*;

// 토글버튼은 한번 클릭하면 선택되고, 한번 더 선택되면 선택 해제되는 것
public class Ex10_JToggleButton extends JFrame {
	
	public Ex10_JToggleButton() {
		
		// 프레임 이름 지정
		setTitle("JToggleButton 예제");
		
		// 컨테이너를 만들자
		JPanel container = new JPanel();
		
		// 컴포넌트를 만들자
		// 토글버튼 생성
		JToggleButton jtb1 = new JToggleButton("토글버튼1");
		JToggleButton jtb2 = new JToggleButton("토글버튼2");
		JToggleButton jtb3 = new JToggleButton("토글버튼3");	
		
		// 컨테이너에 컴포넌트를 올리자
		container.add(jtb1);container.add(jtb2);container.add(jtb3);
	
		// 컴포넌트를 프레임에 올리자
		add(container);
		
		// 프레임 위치, 크기 지정
		setBounds(200,200,300,300);
		
		// 프레임 X 버튼 유효화
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		// 프레임 보이기
		setVisible(true);
		
	}

	public static void main(String[] args) {
		
		new Ex10_JToggleButton();	// 생성자 호출

	}

}

흡사 JButton 처럼 생겼지만 아예 눌려진 상태로 구현 가능하다.

댓글