// 일반 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진수값);