java/java.awt & java.swing

[java.awt] 2. java.awt 패키지로 GUI 프로그램 만드는 법

jeri 2024. 6. 29. 01:43
반응형

[STEP1] Frame클래스로 Frame객체 만들기

🎁awt > FrameOneApp.java
package xyz.itwill.awt;
import java.awt.Frame;

//CUI(Character User Interface) 프로그램 : 문자 중심의 실행 환경을 제공하는 프로그램
//GUI(Graphic User Interface) 프로그램 : 그래픽 중심의 실행 환경을 제공하는 프로그램
// => 컴퍼넌트를 이용하여 작성된 프로그램

//java.awt 패키지 : GUI 프로그램을 작성하기 위한 클래스가 선언된 패키지
// => 운영체제(OS)에 종속된 컴퍼넌트 제공
//javax.swing 패키지 : GUI 프로그램을 작성하기 위한 클래스가 선언된 패키지
// => 운영체제와 별개의 Java 컴퍼넌트 제공

//🧸컴퍼넌트(Component) : GUI 프로그램에서 디자인 요소를 구현하기 위한 클래스
// => Button, List, Label, Canvas , Checkbox, Choice, Scrollbar, TextField, TextArea 등

//🧸컨테이너(Container) : 컴퍼넌트를 부착하기 위한 컴퍼넌트 (컨테이너도 컴포넌트임..)
// => 독립적 컨테이너 : Frame, Window, Dialog 등 - 독립적으로 사용 가능, 독립적으로 출력 가능, 사용자 눈에 보임
// => 종속적 컨테이너 : Panel, ScollPane 등 - 다른 컨테이너에 부착하여 사용 가능, 독립적으로 출력 안돼, 사용자 눈에 보이지 않음

//🎁main메소드에서 동작하는 Frame객체 - 비권장
//=> 왜? 디자인 뿐만 아니라, 필요한 기능들도 넣어야 하기 때문
public class FrameOneApp {
	public static void main(String[] args) {
  	//Frame 객체가 생성되며 미출력, 메모리에 생성됨
		Frame frame = new Frame();
		//Component.setSize(int width, int height):  컴포넌트 크기(폭과 높이)를 변경하는 메소드
		// => 크기 또는 위치 단위는 픽셀(Pixel : 색을 표현하는 점)을 기본단위로 사용
		// => ex. frame.setSize(1096,1924); 가로 세로 방향으로 점을 (1096,1924)찍을 수 있다 = 선명해진다(해상도가 높다) = 점의 크기는 작아진다
		frame.setSize(400,300);
		//Component.setLocation(int x, int y) : 컴포넌트의 출력위치(x좌표와 y좌표)를 변경하는 메소드
		frame.setLocation(500, 100);
		//Component.setVisible(boolaen b) : 컴포넌트의 출력 유무를 설정하는 메소드 -  false : 미출력(기본값), true : 출력
		frame.setVisible(true); //frame을 눈에 보여주세요~
	}
}
🎁awt > FrameTwoApp.java
package xyz.itwill.awt;
import java.awt.Frame;

//1. 프레임클래스 상속받기
//2. 메인메소드에서 생성자 호출해 사용하기
//3. 생성자 내부에는
//=> Component.setSize(int width, int height);
//=> Component.setLocation(int x, int y);
//=> Component.setBounds(int x, int y, int width, int height);
//=> Frame.setResizable(boolaen resize);
//=> Component.setVisible(boolaen b);
// 등등.. 작성하기

// 🎁Frame클래스를 상속받아 생성자호출로 동작하는 Frame객체 - 권장
// => GUI 프로그램은 Frame 클래스를 상속받아 작성하는 것을 권장
public class FrameTwoApp extends Frame {

	//경고를 없애기 위한 serialVersionUID 필드
	private static final long serialVersionUID = 1L;

	//생성자에서 프레임에 대한 디자인 설정하기 - UI(User Interface) 구현
	//=> 생성자 매개변수로 프레임의 제목을 전달받아 사용
	public FrameTwoApp(String title) {

		//Frame(String title) : 제목을 전달받아 프레임을 생성하는 생성자
		super(title); //super키워드로 부모클래스의 원하는 생성자 호출

		//Frame.setTitle(String title) : 프레임의 제목을 변경하는 메소드
		//setTitle("프레임연습");
		//setTitle(title);
		///*this.*/setSize(400,300); //프레임의 크기 변경
		///*this.*/setLocation(600, 100); //프레임의 출력위치 변경

		//Component.setBounds(int x, int y, int width, int height) : 컴포넌트의 크기와 출력위치를 변경하는 메소드
		setBounds(600, 100, 400, 300);
		//Frame.setResizable(boolaen resize) : 프레임 크기 변경 여부를 설정하는 메소드 - false: 컴포넌트 크기 변경 불가능, true: 컴포넌트 크기 변경 가능(기본)
		setResizable(false);
		/*this.*/setVisible(true); //프레임 출력
	}

	public static void main(String[] args) {
		//Frame 클래스를 상속받은 자식클래스로 객체 생성 - Frame 객체 생성 : 프레임 생성
		//new FrameTwoApp();
		new FrameTwoApp("프레임연습");
	}
}

[STEP2] Frame에 컴포넌트 부착1 (하나의 컴포넌트)

🎁awt > ComponentAddApp.java
  • 버튼부착
package xyz.itwill.awt;
import java.awt.Button;
import java.awt.Frame;

//🎁가장 기본적인 형태의 프레임 객체 틀		 //Frame클래스 상속
public class ComponentAddApp extends Frame {

	//필드
	private static final long serialVersionUID = 1L;

	//생성자
	public ComponentAddApp(String title) {
		super(title);

		//Button 클래스 : 버튼 컴포넌트를 구현하기 위한 클래스
		// => Button(String label) : 버튼 이름을 설정하여 Button객체를 생성하기 위한 생성자
		Button button = new Button("Button");

		//Container.add(Component c) : 컨테이너에 컴포넌트를 부착하는 메소드
		// => 컨테이너에는 설정된 기본배치관리자(LayoutManager)에 의해 컴포넌트의 크기와 출력위치가 자동 설정되어 컨테이너에 컴포넌트 부착됨
    	// => (모든 컨테이너에는 기본배치관리자에 의해 알아서 자동 배치됨)
		add(button);

		setBounds(600, 100, 300, 300);
		setVisible(true);
	}

	public static void main(String[] args) {
		new ComponentAddApp("컴포넌트 부착");
	}
}

[STEP3] Frame에 컴포넌트 부착2 (feat.배치관리자 이용)

🎁awt > NonLayoutManagerApp.java
  • 배치관리자 미사용해 버튼 부착
package xyz.itwill.awt;
import java.awt.Button;
import java.awt.Frame;

//배치관리자(LayoutManager)
// => 컴퍼넌트의 크기와 출력위치를 자동 변경하여 컴퍼넌트를 컨테이너에 부착하기 위한 객체 
// => BorderLayout 클래스, FlowLayout 클래스, GridLayout 클래스 등..
// => 이 외 다양한 LayoutManager*가 많지만 웹프로그램에서는 위의 3가지를 중점적으로 먼저 보자
// => 위의 3가지만 잘 한다면 웬만한 웹프로그램 만들 수 있다
// => 모든 컨테이너에는 전달받은 컴포넌트를 자동으로 부착하기 위한 기본 배치관리자 존재
// => 배치관리자를 사용하면 컴포넌트 크기와 출력위치를 마음대로 지정할 수 없다!
// => 배치관리자는 무조건적으로 사용하는 것은 아님

// => Frame, Window, Dialog 등의 기본 배치관리자 : BorderLayout
// => Panel, Applet 등의 기본 배치관리자 : FlowLayout


//배치관리자를 사용하지 않고 프레임에 컴포넌트를 부착하여 사용하는 프로그램
public class NonLayoutManagerApp extends Frame{

	//필드
	private static final long serialVersionUID = 1L;

	//생성자
	public NonLayoutManagerApp(String title) {
		super(title);

		//Container.setLayout(LayoutManager mgr): 컨테이너의 배치관리자를 변경하는 메소드
		setLayout(null); //프레임의 배치관리자를 사용하지 않도록 설정

		Button button1 = new Button("BUTTON-1");
		Button button2 = new Button("BUTTON-2");

		//배치관리자를 사용하지 않을 경우 반드시 컴포넌트의 크기와 출력위치를 변경하고 컨테이너에 부착
		// => 옛날 프로그램은 좌표찍어서 만듦
		// => 유지보수를 위해 배치관리자를 사용하는 것을 권장함
		button1.setBounds(80, 100, 150, 80);
		button2.setBounds(190, 300, 100, 120);

		add(button1);
		add(button2);

		setBounds(600, 100, 400, 500);
		setVisible(true);
	}

	public static void main(String[] args) {
		new NonLayoutManagerApp("NonLayoutManager");
	}
}
🎁awt > BorderLayoutApp.java
  • BorderLayout 배치관리자 사용해 버튼 부착
package xyz.itwill.awt;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;

//컴포넌트의 크기와 위치 변경 불가능
//컴포넌트 딱 하나만 중앙,동,서,남,북에 배치 가능

//BorderLayout : 컴포넌트를 컨테이너의 중앙,동,서,남,북으로 구분하여 부착하는 배치관리자
// => 컴포넌트를 컨테이너에 부착할 때 부착 위치를 반드시 설정해야함
// => Frame 클래스, Window 클래스, Dialog 클래스의 기본 배치관리자
public class BorderLayoutApp extends Frame{

	private static final long serialVersionUID = 1L;
	public BorderLayoutApp(String title) {
		super(title);

		//프레임의 배치관리자를 BorderLayout객체로 변경
		//=>Frame은 BorderLayout객체가 기본 배치관리자로 설정되어있으므로 생략가능
		//setLayout(new BorderLayout()); //생략가능

		Button button1 = new Button("Center");
		Button button2 = new Button("East");
		Button button3 = new Button("West");
		Button button4 = new Button("South");
		Button button5 = new Button("North");

		//Container.add(Component c, Object constraints) : 컴포넌트를 컨테이너의 원하는 위치에 부착하는 메소드
		// => 컴포넌트의 부착위치는 BorderLayout 클래스의 상수필드 사용
		// => 컴포넌트의 부착위치가 생략된 경우 컴포넌트는 무조건 컨테이너 중앙에 부착됨
		// => 컴포넌트 컨테이너 중앙에는 반드시 컴포넌트를 배치해야 하지만, 동서남북은 생략 가능
		add(button1, BorderLayout.CENTER);

		add(button2, BorderLayout.EAST);
		//add(button2); //button1의 CENTER 배치 덮어씌움ㅠㅠ
		add(button3, BorderLayout.WEST);
		add(button4, BorderLayout.SOUTH);
		add(button5, BorderLayout.NORTH);

		setBounds(600, 100, 400, 400);
		setVisible(true);
	}

	public static void main(String[] args) {
		new BorderLayoutApp("BorderLayout");
	}
}
🎁awt > FlowLayoutApp.java
  • FlowLayout 배치관리자 사용해 버튼 부착
package xyz.itwill.awt;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;

//FlowLayout : 컴포넌트를 컨테이너의 왼쪽부터 오른쪽 방향으로 차례대로 부착하는 배치관리자
// => 컨테이너의 크기를 벗어날 경우 자동으로 아래로 이동하여 컴포넌트 부착
// => Panel클래스, Applet클래스의 기본 배치관리자
public class FlowLayoutApp extends Frame{

	private static final long serialVersionUID = 1L;
	public FlowLayoutApp(String title) {
		super(title);

		//프레임의 배치관리자를 FlowLayout 객체로 변경
		setLayout(new FlowLayout());

		Button button1 = new Button("Btn-1");
		Button button2 = new Button("Btn-2");
		Button button3 = new Button("Btn-3");
		Button button4 = new Button("Btn-4");
		Button button5 = new Button("Btn-5");

		add(button1);
		add(button2);
		add(button3);
		add(button4);
		add(button5);

		setBounds(600, 100, 400, 400);
		setVisible(true);
	}
	public static void main(String[] args) {
		new FlowLayoutApp("FlowLayout");
	}
}
🎁awt > GridLayoutApp.java
  • GridLayout 배치관리자 사용해 버튼 부착
package xyz.itwill.awt;
import java.awt.Button;
import java.awt.Frame;
import java.awt.GridLayout;

//GridLayout: 컨테이너의 행열을 설정하여 컴포넌트를 부착하는 배치관리자

public class GridLayoutApp extends Frame{

	private static final long serialVersionUID = 1L;
	public GridLayoutApp(String title) {
		super(title);

		//프레임의 배치관리자를 GridLayout객체로 변경
		setLayout(new GridLayout(3,2)); //컨테이너의 컴포넌트가 3행2열로 배치됨

		Button button1 = new Button("Btn-1");
		Button button2 = new Button("Btn-2");
		Button button3 = new Button("Btn-3");
		Button button4 = new Button("Btn-4");
		Button button5 = new Button("Btn-5");
		Button button6 = new Button("Btn-6");

		//부착하지 않으면, 배치관리자를 사용하는 것이 무쓸모!! 반드시 부착해주기
		add(button1);
		add(button2);
		add(button3);
		add(button4);
		add(button5);
		add(button6);

		setBounds(600, 100, 300, 400);
		setVisible(true);
	}
	public static void main(String[] args) {
		new GridLayoutApp("GridLayout");
	}
}

[STEP4] Frame에 컴포넌트 부착3 (다수의 컴포넌트)

  • Frame
    • 배치관리자 이용
    • (Panel-Button) 부착
    • TextField 부착
    • TextArea 부착
🎁awt > PanelApp.java
package xyz.itwill.awt;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.TextArea;
import java.awt.TextField;

//Panel : 컴포넌트를 부착하여 그룹화 처리하기 위한 컨테이너 - 기본배치관리자 : FlowLayout
//=> 독립적으로 사용 불가능하며 다른 컨테이너에 부착하여 사용

public class PanelApp extends Frame{

	private static final long serialVersionUID = 1L;
	public PanelApp(String title) {
		super(title);

		Button red = new Button("RED");
		Button green = new Button("GREEN");
		Button blue = new Button("BLUE");

		//2.
		//TextField : 한줄의 문자열을 입력받기 위한 컴포넌트
		TextField field = new TextField();
		//TextArea : 여러줄의 문자열을 입력받기 위한 컴포넌트
		TextArea area = new TextArea();

		//1.
		//Canvas canvas = new Canvas();
		Panel panel = new Panel();

		//Panel의 기본배치관리자 : FlowLayout
		panel.add(red);
		panel.add(green);
		panel.add(blue);

		//1.
		//패널을 프레임의 북쪽위치에 부착
		//add(panel, BorderLayout.NORTH);
		//캔버스를 프레임의 중앙위치에 부착
		//add(canvas,BorderLayout.CENTER);

		//2.
		add(panel, BorderLayout.NORTH); //패널을 프레임의 북쪽위치에 부착
		add(area,BorderLayout.CENTER); //텍스트 영역를 프레임의 중앙위치에 부착
		add(field,BorderLayout.SOUTH); //텍스트 필드를 프레임의 남쪽위치에 부착

		//Component.setFont(Font f) : 컴포넌트의 글자 관련 속성을 변경하는 메소드
		//Font(String name, int style, int size) : 글자의 글꼴, 스타일, 크기를 전달받아 글자 관련 속성을 저장한 객체를 생성하기 위한 생성자
		//=> 글꼴과 스타일은 Font클래스에서 제공하는 상수필드 사용
		//=> 컨테이너에 적용된 디자인은 컴포넌트에 그대로 상속되어 적용
		panel.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 16));
		area.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 20));
		field.setFont(new Font(Font.SANS_SERIF, Font.BOLD + Font.ITALIC, 16));

		//Component.setForeground(Color c) : 컴포넌트의 글자색을 변경하는 메소드
		//Color(int red, int green, int blue) : 빛의 3원소를 전달받아 색을 저장하기 위한 객체를 생성하는 메소드
		red.setForeground(new Color(255,0,0));
		green.setForeground(new Color(0,255,0));
		blue.setForeground(new Color(0,0,255));

		//Component.setBackground(Color c) : 컴포넌트의 배경색을 변경하는 메소드 - Color 객체는 Color 클래스의 상수필드를 사용하여 설정 가능
		panel.setBackground(Color.GRAY);

		//Componet.setEnabled(boolean b) : 컴포넌트의 활성화 상태여부를 설정하는 메소드
		//TextComponet.setEditable(boolean b) : 텍스트 컴포넌트의 입력값의 변경여부를 설정하는 메소드
		//TextComponet.setFocusable(boolean b) : 텍스트 컴포넌트의 입력초점의 위치여부를 설정하는 메소드
		// => false : 입력초점 미위치 , true : 입력초점 위치(기본)
		area.setFocusable(false);
		//area.setEditable(false);
		//area.setEnabled(false);

		/*
		add(red, BorderLayout.NORTH);
		add(green, BorderLayout.NORTH);
		add(blue, BorderLayout.NORTH);
		*/

		setBounds(600,100,300,400);
		setVisible(true);
	}
	public static void main(String[] args) {
		new PanelApp("Panel");
	}
}

[STEP5] Frame에 컴포넌트 부착3 (다수의 컴포넌트)

  • Frame
    • MenuBar >> Menu >> MenuItem

🎁awt > PanelApp.java
package xyz.itwill.awt;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.MenuShortcut;
import java.awt.TextArea;
import java.awt.event.KeyEvent;

// Frame >> MenuBar >> Menu >> MenuItem 순서로 디자인
public class MenuBarApp extends Frame{

 	//필드
	private static final long serialVersionUID = 1L;

	//생성자
	public MenuBarApp(String title) {
		super(title);

    	//1.
		//MenuBar생성
		MenuBar menuBar = new MenuBar();
    	//Menu생성
		Menu file = new Menu("File");
		Menu help = new Menu("Help");
		//2.
    	//MenuBar에 Menu부착
		menuBar.add(file);
		menuBar.add(help);

    	//3.
    	//MenuItem생성
    	// => MenuShortcut : 단축키를 설정하기 위한 클래스 - ex. VK_0 : virtual Keyboard_O :ctrl + O
		MenuItem open = new MenuItem("Open", new MenuShortcut(KeyEvent.VK_0));
		MenuItem save = new MenuItem("Save", new MenuShortcut(KeyEvent.VK_S));
		MenuItem exit = new MenuItem("Exit");

		MenuItem view = new MenuItem("HelpView");
		MenuItem info = new MenuItem("Information");

    	//4.
    	//Menu에 MenuItem부착
		file.add(open);
		file.add(save);
		file.addSeparator(); //메뉴에 구분선 부착
		file.add(exit);

		help.add(view);
		help.add(info);

		//5.
		//중앙에 TextArea 부착
		add(new TextArea(), BorderLayout.CENTER);

		//6.
    	//Frame에 메뉴바 변경
		// => Frame.setMenuBar(MenuBar mb) : 프레임에 메뉴바를 변경하는 메소드
		setMenuBar(menuBar);

		//7.
    	//Frame의 사이즈, 위치 설정
		setBounds(500,100,1000,700);
		setVisible(true);
	}

  	//main메소드
	public static void main(String[] args) {
		new MenuBarApp("MenuBar");
	}
}
반응형