반응형
[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");
}
}
반응형
'java > java.awt & java.swing' 카테고리의 다른 글
[java.swing] 4. java.swing 패키지로 GUI 프로그램 만드는 법 | windowbuilder사용법 | 디지털시계 프로그램 | 계산기 프로그램 (0) | 2024.06.29 |
---|---|
[java.awt] 3. 이벤트 프로그램 작성법 | Frame상속 | ActionListener상속 (0) | 2024.06.29 |
[java.awt & java.swing] 1. GUI프로그램의 개념 (0) | 2024.06.28 |