Java 정리 20
10 Dec 2018
Reading time ~7 minutes
Java 정리 20 - AWT LayoutManager, Menu, 색변경
LayoutManager
-
자동배치
- BorderLayout, FlowLayout, GridLayout, GridBagLayout, CardLayout
- 사용상의 편의성
- 개발자가 원하는 위치에 컴포넌트를 배치할 수 없음.
-
수동배치
- Component를 개발자가 좌표를 설정하여 원하는 위치에 배치하는 것
- 복잡한 디자인이 가능해진다.
- 개발자가 크기, 위치를 설정하게 되므로 코드의 복잡도가 상승.
- 복잡한 디자인이 가능해진다.
- Component를 개발자가 좌표를 설정하여 원하는 위치에 배치하는 것
BorderLayout
- Frame의 기본 레이아웃
- 컴포넌트 고유크기가 무시되고 배치되는 영역의 크기만큼 커진다.
- 하나의 영역에 하나의 컴포넌트만 배치된다.
- 대표적인 BorderLayout 예는 메모장
// 일반 Component와 LayoutManager의 사용
// 1. Window Component를 상속(사용자에게 보여지는 일)
@SuppressWarnings("serial")
public class UseBorderLayout extends Frame {
public UseBorderLayout() {
super("BorderLayout 연습");
// 2. 사용할 일반 컴포넌트를 생성
TextField tfNorth = new TextField("North");
Label lblEast = new Label("East");
TextArea taCenter = new TextArea("Center");
Label lblWest = new Label("West");
Choice choSouth = new Choice();
choSouth.add("South");
// 3. 배치관리자 설정
// Window Component인 Frame이나 Dialog는 BoarderLayout이 기본 설정
setLayout(new BorderLayout());
// 4.컴포넌트의 배치관리자를 사용하여 배치
// add("배치위치", 컴포넌트); add(상수, 컴포넌트);
// add(컴포넌트, 상수); ..
// 문자열 상수를 사용하여 배치
add("North", tfNorth);
// Center만 배치하면 테두리(동서남북)는 사라진다.
add("Center", taCenter);
// Constant( Field )를 사용하여 배치
add(BorderLayout.EAST, lblEast);
add(BorderLayout.WEST, lblWest);
add(BorderLayout.SOUTH, choSouth);
// 5. 윈도우 크기 설정
setSize(400, 400);
// 6. 사용자에게 보여주기(가시화)
setVisible(true);
// 종료
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent we) {
dispose();
}
});
}
public static void main(String[] args) {
new UseBorderLayout();
}
}
FlowLayout
-
Container Component의 기본 Layout
- Panel
- 컴포넌트가 배치하는 순서대로 배치된다.
- 컴포넌트의 고유 크기로 배치된다.
- 윈도우의 크기가 변경되면 컴포넌트의 위치가 변경된다.
- 대표적인 예는 탐색기
// FlowLayout과 Component의 사용
// 1. Window Component 상속
@SuppressWarnings("serial")
public class UseFlowLayout extends Frame {
public UseFlowLayout() {
super("FlowLayout 연습");
// 2. 일반 컴포넌트 생성
Label lblName = new Label("이름");
TextField tfName = new TextField(10);
Button btn = new Button("입력");
List list = new List();
list.add("정택성");
list.add("이재현");
list.add("김정운");
list.add("김정윤");
list.add("이재찬");
Checkbox cb1 = new Checkbox("등산", false);
Checkbox cb2 = new Checkbox("댄스", false);
Checkbox cb3 = new Checkbox("게임", false);
// CheckboxGroup을 설정하면 Radiobutton이 생성된다.
CheckboxGroup cg = new CheckboxGroup();
Checkbox rb1 = new Checkbox("남자", true, cg);
Checkbox rb2 = new Checkbox("여자", false, cg);
// 3. Layout 변경 : BorderLayout -> FlowLayout
setLayout(new FlowLayout());
// 4. 일반 컴포넌트 배치
add(lblName); add(tfName); add(btn); add(list);
add(cb1); add(cb2);add(cb3); add(rb1);add(rb2);
// 5. 윈도우 크기 설정
setSize(400, 300);
// 6. 사용자에게 보여주기
setVisible(true);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
dispose();
}
});
}
public static void main(String[] args) {
new UseFlowLayout();
}
}
GridLayout
- 격자 레이아웃
- 행과 열로 구성되는 레이아웃
-
모든 행에서 열의 크기가 동일
- 배치되는 컴포넌트의 크기가 동일
- 배치되는 컴포넌트의 수가 설정한 행, 열과 맞지 않으면 설정이 변경되어 컴포넌트가 배치됨
setLayout(new GridLayout(행의수, 열의수));
/**
* GridLayout<br/>
* 행과 열로 구성되며 모든 컴포넌트의 크기가 동일해야할 때.
*/
// 1. 윈도우 컴포넌트 상속
@SuppressWarnings("serial")
public class UseGridLayout extends Frame {
public UseGridLayout() {
super("GridLayout 연습");
// 2. 컴포넌트 생성
Button btn1 = new Button("btn1");
Button btn2 = new Button("btn2");
Button btn3 = new Button("btn3");
Button btn4 = new Button("btn4");
Button btn5 = new Button("btn5");
Button btn6 = new Button("btn6");
Button btn7 = new Button("btn7");
Button btn8 = new Button("btn8");
Button btn9 = new Button("btn9");
// 3. 배치관리자 설정 : BorderLayout -> GridLayout
setLayout(new GridLayout(4, 2));
// 4. 배치
add(btn1); add(btn2); add(btn3); add(btn4);
add(btn5); add(btn6); add(btn7); add(btn8); add(btn9);
// 5. 윈도우 크기 설정
setSize(300, 400);
// 6. 사용자에게 보여주기
setVisible(true);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent we) {
dispose();
}
});
}
public static void main(String[] args) {
new UseGridLayout();
}
}
GridBagLayout
- 행마다 열의 개수 크기가 다른 Layout
CardLayout
- Container Component에만 설정할 수 있는 Layout
- 한정적인 공간에서 여러 Panel을 교차하여 보여줄 때
수동배치
- Component를 개발자가 좌표를 설정하여 원하는 위치에 배치하는 것
- 복잡한 디자인이 가능해진다.
- 개발자가 크기, 위치를 설정하게 되므로 코드의 복잡도가 상승.
- 배치관리자를 해제한 후 배치를 시작한다.
-
컴포넌트의 좌표설정 (배치되는 위치 설정)
- Component 클래스의 setLocation() 사용
- 모든 자식은 이 기능을 쓸 수 있음
-
컴포넌트의 크기설정
- Component 클래스의 setSize() 사용
-
setBounds로 컴포넌트의 크기, 위치를 한번에 설정가능
- 많이들 둘 중 하나를 빼먹어서 등장한 메소드
// 배치관리자를 해제한 후 배치를 시작
setLayout(null);
// 컴포넌트의 좌표설정(배치되는 위치)
setLocation(int x, int y)
// 컴포넌트의 크기 설정
setSize(int width, int height);
// 컴포넌트의 좌표, 크기 동시설정
setBound(int x, int y, int width, int height);
/**
* 수동배치
* 개발자가 컴포넌트의 배치 위치와 크기를 설정하는 배치방법
*/
// 1. Window Component 상속
@SuppressWarnings("serial")
public class UseManualLayout extends Frame {
public UseManualLayout() {
super("수동배치");
// 2. 컴포넌트 생성
Label lbl = new Label();
lbl.setText("라벨");
TextField tf = new TextField();
Button btn = new Button("클릭");
// 3. 배치관리자 설정(해제) : BorderLayout -> null
setLayout(null);
// 4. 배치
lbl.setLocation(10, 35); // 배치 좌표
lbl.setSize(80,20);// 배치 크기
// setLocation+setSize = setBounds
tf.setBounds(50,100,120,25); // x, y, w, h
btn.setBounds(250,200,120,23);
add(lbl);
add(tf);
add(btn);
/*
// 5. 윈도우 좌표 설정
setLocation(100, 200);
// 6. 윈도우 크기 설정
setSize(500, 600);
*/
// 5,6을 동시에, 좌표, 크기를 동시설정하는 setBounds
setBounds(200, 100, 400, 250);
// 7. 사용자에게 보여주기(가시화)
setVisible(true);
// 종료처리
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
dispose();
}
});
// 크기변경을 선택하는 메소드(false면 크기고정)
setResizable(false);
}
public static void main(String[] args) {
new UseManualLayout();
}
}
여러 자동배치 같이 사용하기
-
Container Component
- 일반 컴포넌트와 Container 컴포넌트를 저장할 수 있다.
// 일반 컴포넌트와 Container 컴포넌트를 저장할 수 있는
// 1. Window Component 상속
public class UsePanel extends Frame {
public UsePanel() {
super("Container Component 사용");
// 2. 컴포넌트 생성
// 이름부여방식 - 헝가리안 표기법(Hungarian notation)
Label lblName = new Label("이름");
TextField tfName = new TextField(20);
Button btnAdd = new Button("추가");
Button btnClose = new Button("종료");
TextArea taDisplay = new TextArea();
// 일반컴포넌트를 배치할 수 있는 컨테이너 컴포넌트 생성
Panel panelNorth = new Panel();
// 생성된 컨테이너 컴포넌트에 일반 컴포넌트를 배치
panelNorth.add(lblName);
panelNorth.add(tfName);
panelNorth.add(btnAdd);
panelNorth.add(btnClose);
// 3. 배치관리자 설정
setLayout(new BorderLayout());
// 4. 배치 BorderLayout의 특징
// 하나의 영역에는 하나의 컴포넌트만 저장가능
add(BorderLayout.NORTH, panelNorth);
add(BorderLayout.CENTER, taDisplay);
// 5. Window 위치,크기 설정
setBounds(200, 150, 400, 250);
// 6. 가시화
setVisible(true);
// 7. 종료처리
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
dispose();
}
});
}
public static void main(String[] args) {
new UsePanel();
}
}
Menu 만들기
- MenuBar, Menu, MenuItem으로 구성
// 1. MenuBar 생성
MenuBar mb = new MenuBar();
// 2. Menu 생성
Menu m = new Menu("메뉴명");
// 3. MenuItem 생성
MenuItem mi = new MenuItem("메뉴아이템");
// 4. 생성된 메뉴아이템을 메뉴에 배치
m.add(메뉴아이템객체);
// MenuItem에 구분 가로선 추가, AWT에서사용가능한 두가지 방법
m.add("-");
m.addSeparator();
// Swing에선 m.addSeparator()만 사용가능
// 5. 메뉴를 메뉴바에 배치
mb.add(메뉴객체);
// 6. 메뉴바를 배치, Frame클래스의 setMenuBar 메소드 사용
setMenuBar(mb);
// Menu : MenuBar, Menu, MenuItem으로 구성
// Window Component 상속
public class UseMenuBar extends Frame {
public UseMenuBar() {
super("메뉴바 사용");
// 1. MenuBar 생성
MenuBar mb = new MenuBar();
// 2. Menu 생성
Menu m1 = new Menu("1조");
Menu m2 = new Menu("2조");
Menu m3 = new Menu("3조");
Menu m4 = new Menu("4조");
// 3. MenuItem 생성
MenuItem mi1_1 = new MenuItem("이재찬");
MenuItem mi1_2 = new MenuItem("이봉현");
MenuItem mi1_3 = new MenuItem("박은영");
MenuItem mi2_1 = new MenuItem("박영민");
MenuItem mi2_2 = new MenuItem("김정윤");
MenuItem mi3_1 = new MenuItem("김정운");
MenuItem mi4_1 = new MenuItem("오영근");
MenuItem mi4_2 = new MenuItem("박정미");
MenuItem mi4_3 = new MenuItem("김건하");
MenuItem mi4_4 = new MenuItem("공선의");
MenuItem mi4_5 = new MenuItem("최혜원");
// MenuItem을 Menu에 배치
m1.add(mi1_1); m1.add(mi1_2); m1.addSeparator(); m1.add(mi1_3);
m2.add(mi2_1); m2.add(mi2_2);
m3.add(mi3_1);
m4.add(mi4_1); m4.add(mi4_2); m4.add(mi4_3);
m4.addSeparator(); m4.add(mi4_4); m4.add(mi4_5);
// Menu를 MenuBar에 배치
mb.add(m1); mb.add(m2); mb.add(m3); mb.add(m4);
// MenuBar를 Frame에 배치
setMenuBar(mb);
setBounds(200, 100, 800, 600);
setVisible(true);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
dispose();
}
});
}
public static void main(String[] args) {
new UseMenuBar();
}
}
- 메뉴가 메뉴를 가지면 하위 메뉴를 가질 수 있다.
MenuItem mi3_1 = new MenuItem("김정운");
MenuItem mi3_2 = new MenuItem("이재현");
MenuItem mi3_3 = new MenuItem("노진경");
MenuItem mi3_4 = new MenuItem("최지우");
MenuItem mi3_5 = new MenuItem("노진경");
Menu m3 = new Menu("3조");
Menu m3_1 = new Menu("3조 group1");
m3.add(mi3_1);
// 메뉴(m3)가 메뉴(m3_1)을 가지면 하위 메뉴를 설정할 수 있다.
m3.add(m3_1);
// m3_1에 하위 메뉴 배치
m3_1.add(mi5663_2);
m3_1.add(mi3_3);
m3_1.add(mi3_4);
m3_1.add(mi3_5);
색변경
- 전경색(foreground color)/ 배경색(background color)을 바꿀 수 있음
-
바닥색(배경색) : 모든 컴포넌트 적용가능
- Component클래스의 setBackground메소드 사용
- Color클래스의 field를 사용하면 다양한 색을 설정할 수 없음
- RGB 컬러는 필드값 또는 3개의 RGB정수값 또는 16진수색(0x00~0xF)으로 지정가능
// Color는 field member, RGB값(정수), 16진수 값으로 지정가능ㄴ
setBackground(Color.필드멤버);
setBackground(new Color(int r, int g, int b));
setBackground(new Color(0x16진수값);
- 글자색(전경색) : 모든 컴포넌트 적용가능
setForeground(Color c);
setForeground(new Color(int r, int g, int b));
setForeground(new Color(0x16진수값);
-
글꼴(FONT)
- 글꼴(Font)은 라이센스 확인 꼭 하고 사용!
-
Font클래스 사용
- 자바에서 제공하는 기본글꼴
- DIALOG, DIALOG_INPUT, MONOSPACED, SERIF, SANS_SERIF
-
style
-
PLAIN, BOLD, ITALIC, BOLD ITALIC
-
- 자바에서 제공하는 기본글꼴
// Font생성자
Font(String 글꼴, int style, int size);
// 글꼴을 설정하는 컴포넌트 클래스의 메서드
setFont(Font f);
setFont(new Font("글꼴", field명, 크기);
// BOLD|ITALIC 사용 예
taDisplay.setFont(new Font(Font.SERIF, Font.BOLD|Font.ITALIC, 20));
숙제
- 자동배치로 다음과 같은 레이아웃 만들기
- 수동배치로 다음과 같은 레이아웃 만들기