프로그래머를위한 Java 2 프로그래밍
4.1 각컴포넌트알아보기 2 (Abstract Window Toolkit) 자바에서 GUI 를작성 네이티브 (native) 윈도우바탕 윈도우즈 95/98 에서는윈도우즈 95/98 의윈도우를사용 유닉스에서는 X 윈도우를사용 실행되는환경에따라모양이약간씩다를수있음 전체적인형태는동일 자바 는 java.awt 패키지에클래스들이포함 시스템자원을사용하기때문에많이사용되는경우에스윙에비해부하가많이걸림 확장성이부족함 제한된 GUI 컴포넌트만지원됨
4.1 각컴포넌트알아보기 3 의컴포넌트 컴포넌트클래스들의상속관계 메뉴컴포넌트상속관계
4.1 와 Swing 컴포넌트비교 4 와스윙
4.1 각컴포넌트알아보기 5 Component 클래스 의가장상위클래스 모든 에공통되는특성과메소드를정의함 자주사용되는메소드들 void add(popupmenu) - 컴포넌트에팝업메뉴를붙인다. Container getparent() - 컴포넌트를포함하는컨터이너를리턴 Dimension getsize() - 컴포넌트의크기를리턴 boolean isenabled() - 컴포넌트가현재활성화되어있나알아본다. void setbackground(color) - 컴포넌트의배경색을설정 void setenabled(boolean) - 컴포넌트를활성화 / 비활성화시킨다. void setfont(font) - 컴포넌트의폰트를설정 void setforeground(color) - 컴포넌트의전경색을설정 void setlocation(int, int) - 컴포넌트의위치를설정 void setsize(int, int) - 컴포넌트의크기를설정 void setvisible(boolean) - 컴포넌트를화면에보이도록 / 안보이도록한다
4.1 각컴포넌트알아보기 6 4.1.1 프레임 (Frame) 생성자 Frame() Frame(String title) 프레임을생성한후, 프레임의크기를결정해야 프레임의크기는 setsize(int width, int height) 라는메소드를이용 단위 : 픽셀 윈도우를화면에보여주기위해서는 setvisible(true) 함수를호출하여야 cf) setvisible(false) settitle(string) - 프레임의타이틀지정 setcursor(int) - 커서타입지정
4.1 각컴포넌트알아보기 7 예제 : FrameDemo.java 1 import java.awt.*; 2 3 public class FrameDemo { 4 public static void main(string[] args) { 5 Frame f = new Frame("FrameDemo"); 6 f.setsize(300, 200); 7 f.setvisible(true); 8 } 9 } 결과
4.1 각컴포넌트알아보기 8 4.1.2 라벨 (Label) 문자열을표현하기위한 컴포넌트 생성자 Label() Label(String text) Label(String text, int alignment) alignment :- Label.LEFT, Label.RIGHT, Label. CENTER 메소드들 int getalignment() - 현재정렬방식을리턴한다. String gettext() - 라벨문자열을리턴한다. void setalignment(int alignment) - 라벨문자열의정렬방식을설정한다. void settext(string text) - 라벨문자열을설정한다
4.1 각컴포넌트알아보기 9 4.1.3 버튼 (Button) 마우스로클릭할수있는 컴포넌트 생성자 Button() Button(String title) 아규먼트는버튼의타이틀로사용 메소드들 String getlabel() - 버튼의문자열을리턴한다. void setlabel(string label) - 버튼의문자열을설정한다. void addactionlistener(actionlistener l) - 버튼에서 ActionEvent 이벤트를받을수있는 ActionListener 를등록한다. String getactioncommand() - 버튼이 이벤트를 받은 경우에 사용되는 Command 이름을리턴한다. void setactioncommand(string command) - Command 이름을 설정한다.
4.1 각컴포넌트알아보기 10 예제 : ButtonLabel.java 3 public class ButtonLabel extends Frame { 7 public ButtonLabel() { 8 super(" 버튼과라벨테스트 "); 9 setlayout(new FlowLayout()); 10 11 ok = new Button("OK"); 12 label = new Label(" 저는라벨입니다."); 13 14 add(ok); 15 add(label); 16
4.1 각컴포넌트알아보기 11 4.1.4 체크박스 (Checkbox) 체크박스와라디오버튼모두 Checkbox 클래스를이용해서생성 체크박스는각각의컴포넌트가체크된상태와체크되지않은상태를가짐. 반면, 여러개의라디오버튼은그룹으로묶여지고이중에서하나만이선택. CheckBoxGroup 클래스를이용하여라디오버튼에사용되는그룹을작성 체크박스와라디오버튼의아이템이선택또는해제될때 ItemEvent 가발생 생성자 Checkbox() - 라벨이없는체크박스 Checkbox(String) - String을라벨로갖는체크박스 Checkbox(String, boolean) - String을라벨로갖고, boolean을이용해체크박스초기상태의 On/Off를결정 Checkbox(String, CheckboxGroup, boolean) - 체크박스를이용해라디오버튼을만들때사용 Checkbox(String label, boolean state, CheckboxGroup group) - 라벨이있고, 상태가설정되어있는라디오버튼을생성한다.
4.1 각컴포넌트알아보기 12 Checkbox 클래스의메소드들 boolean getstate() - 체크박스의 on/off 상태를리턴한다. void setstate(boolean state) - 체크박스의 on/off 상태를설정한다. void additemlistener(itemlistener l) - 체크박스에서 ItemEvent 이벤트를받을수있는 ItemListener 를등록한다. String getlabel() - 체크박스의문자열을리턴한다. void setlabel(string label) - 체크박스의문자열을설정한다. CheckboxGroup 클래스의생성자와메소드 CheckboxGroup() - CheckboxGroup 객체를생성한다. Checkbox getselectedcheckbox() - CheckboxGroup 에서현재 선택된라디오버튼을리턴한다.
4.1 각컴포넌트알아보기 13 예제 : Check.java 11 check1 = new Checkbox("One"); 12 check2 = new Checkbox("Two"); 13 14 cbg = new CheckboxGroup(); 15 male = new Checkbox(" 남자 ", cbg, true); 16 female = new Checkbox(" 여자 ", cbg, false); 17 18 add(check1); 19 add(check2); 20 add(male); 21 add(female);
4.1 각컴포넌트알아보기 14 4.1.6 선택버튼 (Choice Button) Choice 는선택가능한여러개의아이템을가지는 컴포넌트 리스트와비슷하지만 Choice 는하나의아이템만화면에출력되는 모양에차이가있다. Choice 의선택된아이템이변경되면 ItemEvent 이벤트가발생 생성자 Choice() - Choice 객체를생성한다.
4.1 각컴포넌트알아보기 15 Choice 클래스의메소드 void add(string item) - 문자열아이템을추가 String getitem(int index) - 인덱스에해당하는아이템문자열을리턴 int getitemcount() - 아이템의개수를리턴 int getselectedindex() - 현재선택된아이템의인덱스를리턴 String getselecteditem() - 현재선택된아이템의문자열을리턴 void remove(int position) - 인덱스에해당하는아이템을제거 void remove(string item) - 특정문자열과같은아이템을제거 void removeall() - 모든아이템을제거 void select(int pos) - 인덱스에해당하는아이템을선택 void select(string str) - 특정문자열과같은아이템을선택 void additemlistener(itemlistener l) - 아이템이벤트를받을수있는 ItemListener를등록
4.1 각컴포넌트알아보기 16 예제 : ChoiceDemo.java 9 Choice choice = new Choice(); 10 choice.add("one"); 11 choice.add("two"); 12 choice.add("three"); 13 choice.add("four"); 14 choice.add("five"); 15 choice.add("six");
4.1 각컴포넌트알아보기 17 4.1.7 리스트 (List) 항목들중에서하나혹은여러개를선택할수있는것 생성자 List() - 리스트를생성 List(int rows) - rows 수만큼아이템이보이도록 List(int rows, boolean multiplemode) - boolean 아규먼트는리스트에서다중선택허용여부를결정 true이면다중선택이가능 ; false이면단일선택만 메소드들 void add(string item) - 아이템을추가한다. void addactionlistener(actionlistener l) ActionEvent 이벤트를받을수있는 ActionListener를등록한다. void removeall() - 모든아이템을제거
4.1 각컴포넌트알아보기 18 void additemlistener(itemlistener l) - ItemEvent 이벤트를받을수있는 ItemListener 를등록한다. void deselect(int index) - 인덱스에해당하는아이템의선택을해제 String getitem(int index) - 인덱스에해당하는아이템문자열을리턴한다. int getitemcount() - 아이템수를리턴 String[] getitems() - 아이템문자열들을리턴 int getrows() - 출력가능한아이템수를리턴 int getselectedindex() - 선택된아이템인덱스를리턴 int[] getselectedindexes() - 선택된아이템들의인덱스를리턴 String getselecteditem() - 선택된아이템문자열을리턴 String[] getselecteditems() - 선택된아이템들의문자열을리턴 void remove(int position) - 인덱스에해당하는아이템을제거 void remove(string item) - 특정문자열과같은아이템을제거
4.1 각컴포넌트알아보기 19 예제 : ListDemo.java 1 import java.awt.*; 2 3 public class ListDemo { 4 5 public static void main(string[] args) { 6 Frame f = new Frame("ListDemo"); 7 8 f.setlayout(new FlowLayout()); 9 List list = new List(5, false); 10 list.add("one"); 11 list.add("two"); 12 list.add("three"); 16 f.add(list); 17 f.setsize(300, 200); 18 f.setvisible(true); 19 } 20 }
4.1 각컴포넌트알아보기 20 4.1.8 택스트영역 (TextArea) 여러줄에걸쳐문서를작성할수있는컴포넌트 생성자 TextArea() - 택스트영역을만든다 TextArea(String text) - String을초기내용으로갖는텍스트영역을만든다 TextArea(int rows, int columns) -rows 행과 columns 열크기의텍스트영역을만든다 TextArea(String text, int rows, int columns) -String을초기내용으로갖고, rows 행과 columns 열크기의텍스트영역을만든다
4.1 각컴포넌트알아보기 21 TextArea 클래스의메소드 void append(string str) - 기존의 문자열의 마지막 부분에 추가한다. void insert(string str, int pos) - 지정된 위치에 문자열을 삽입한다. void replacerange(string str, int start, int end) - 시작위치와끝 위치를지정하고, 새로운문자열로바꾼다. String getselectedtext() - 선택된문자열을리턴한다. String gettext() - 전체문자열을리턴한다. void select(int selectionstart, int selectionend) - 시작위치와끝 위치를지정하여문자열을선택한다. void seteditable(boolean b) 편집가능 / 불가능을설정한다. void settext(string t) - 기존의 문자열은 지워지고, 새로운 문자열을출력한다.
4.1 각컴포넌트알아보기 22 4.1.9 텍스트필드 (TextField) 텍스트필드는한줄만쓸수있는텍스트영역 생성자 TextField() TextField(int columns) TextField(String text) TextField(String text, int columns) 각생성자는한줄만사용할수있다는것을제외하고는텍스트영역과동일 setechochar(char) 메소드 화면에아규먼트로설정된문자만출력되도록 주로패스워드를입력하는부분에이용
4.1 각컴포넌트알아보기 23 TextField 클래스의메소드 void addactionlistener(actionlistener l) - ActionEvent 이벤트를받을수있는 ActionListener를등록 void setechochar(char c) - TextField에보여지는문자를설정. 문자를설정하면문자열이입력될때마다설정된문자만나타난다. String getselectedtext() - TextField 에있는문자열중에서선택된문자열을리턴 String gettext() - TextField에있는문자열전부를리턴 void select(int selectionstart, int selectionend) - 시작과끝의위치를지정해서문자열을선택 void seteditable(boolean b) - 편집기능을가능 (true)/ 불가능 (false) 하게설정 void settext(string t) - TextField에있는데이터를문자열 t로변경
4.1 각컴포넌트알아보기 24 예제 : TextDemo.java 1 import java.awt.*; 2 3 public class TextDemo { 4 5 public static void main(string[] args) { 6 Frame f = new Frame("TextDemo"); 7 8 f.setlayout(new FlowLayout()); 9 TextArea text = new TextArea("Hello", 5, 30); 10 f.add(text); 11 12 TextField field = new TextField("Hello", 30); 13 f.add(field);..
4.1 각컴포넌트알아보기 25 4.1.10 스크롤바 (Scrollbar) 가로혹은세로형태의스크롤바컴포넌트 생성자 Scrollbar(Scrollbar.VERTICAL) Scrollbar(Scrollbar.HORIZONTAL) 생성자의아규먼트는스크롤바의방향성을결정 Scrollbar.VERTICAL - 세로방향의스크롤바를생성 Scrollbar.HORIZONTAL - 가로방향의스크롤바를생성
4.1 각컴포넌트알아보기 26 4.1.11 캔버스 (Canvas) 주로그림을그리는경우에많이사용되는컴포넌트 직접사용되지않고상속받아서사용한다. 생성자 Canvas()
4.1 각컴포넌트알아보기 27 예제 : CanvasDemo.java 1 import java.awt.*; 2 3 public class CanvasDemo extends Frame { 4 Canvas canvas; 5 6 public CanvasDemo() { 7 super("canvasdemo"); 8 canvas = new Canvas(); 9 canvas.setsize(200,100); 10 canvas.setbackground(color.yellow);..
4.1 각컴포넌트알아보기 28 4.1.12 패널 (Panel) 다른컴포넌트를포함할수있는컨테이너 다른컨테이너에원하는형태로컴포넌트를붙이기위해서이용 보통패널은화면에보이지않는다. 생성자 Panel() Panel(LayoutManager layout)
4.1 각컴포넌트알아보기 29 예제 : PanelDemo.java 1 import java.awt.*; 2 3 public class PanelDemo extends Frame { 4 Panel panel; 5 6 public PanelDemo() { 7 super("paneldemo"); 8 setlayout(null); 9 panel = new Panel(); 10 panel.setsize(80, 50); 11 panel.setbackground(color.blue); 12 panel.setlocation(50, 50); 13 add(panel); 14 setsize(300, 200); 15 setvisible(true);.
4.1 각컴포넌트알아보기 30 4.1.13 스크롤팬 (ScrollPane) 스크롤을기본적으로가지고있는자바컴포넌트 생성자 ScrollPane() ScrollPane(int scrollbardisplaypolicy) 스크롤팬은하나의컴포넌트만자식으로가질수있음 -- 주의!! 여러개의컴포넌트를스크롤팬에포함시키기위해서는 패널을스크롤팬의자식으로하고 패널에여러컴포넌트를붙임
4.1 각컴포넌트알아보기 31 예제 : ScrollPaneDemo.java 9 sp = new ScrollPane(); 10 sp.setsize(150, 100); 12 panel = new Panel(); 13 panel.setsize(500, 450); 14 panel.setlayout(new BorderLayout()); 15 panel.add("center", new TextArea()); 16 Panel bottom = new Panel(); 17 bottom.add(new Button("OK")); 18 bottom.add(new Button("CANCEL")); 19 panel.add("south", bottom); 21 sp.add(panel);
4.1 각컴포넌트알아보기 32 4.1.14 팝업메뉴 (Popup Menu) 평소에는안보이다가마우스를누르면나타나는메뉴 생성자 PopupMenu() PopupMenu(String label) 문자열은메뉴의이름을나타내는데사용 메소드들 add() 함수 - 팝업메뉴의메뉴들을추가 show() 함수 - 메뉴를보여주기위해서 hide() 함수 - 메뉴를감추기위해서이용
4.1 각컴포넌트알아보기 33 예제 : PopupDemo.java 15 popup = new PopupMenu("POP-UP"); 16 popup.add(new MenuItem("copy")); 17 popup.add(new MenuItem("paste")); 18 Menu col = new Menu("color"); 19 col.add(new MenuItem("white")); 20 col.add(new MenuItem("blue")); 21 popup.add(col); 22 canvas.add(popup);. 27 } 28 29 public void mousepressed(mouseevent e) { 30 popup.show(canvas, e.getx(), e.gety()); 31 }.
4.2 컴포넌트붙이기 34 화면에 구성요소들의크기와위치는 2 가지요소에의해서결정 1. 요소들이컨테이너에추가되는순서 2. 사용되는레이아웃매니저 각컨테이너는하나의레이아웃매니저를가질수있고, 프로그래머가 setlayout() 메소드를이용하여원하는레이아웃매니저로설정레이아웃매니저는화면에서각 요소들의위치를결정 자바에서는기본적인 5 가지레이아웃을제공 "FlowLayout "GridLayout "BorderLayout "CardLayout "GridBagLayout"
4.2 컴포넌트붙이기 35 레이아웃매니저 컴포넌트의크기와위치를결정 자주사용되는레이아웃매니저 플로우레이아웃 가로방향으로컴포넌트를붙임 보더레이아웃 5 방향에하나씩컴포넌트를붙임 카드레이아웃 컴포넌트마다하나씩컴포넌트를붙임 그리드레이아웃 격자모양의위치에컴포넌트를붙임 그리드백레이아웃 위치와크기를제약조건을통해지정함
4.2 컴포넌트붙이기 FlowLayout 36 4.2.1 플로우레이아웃 (FlowLayout) 컨테이너에컴포넌트들을가로방향으로늘어놓을때사용 만약구성요소들이한줄에들어가지않으면다음줄로이동 각줄안에서정렬위치를결정할수있는 alignment 값을가짐 alignment 의기본값은 "CENTER" 이고, 이것은구성요소를중앙에정렬 패널과애플릿은기본적으로플로우레이아웃을이용 생성자 setlayout(new FlowLayout()) - 플로우레이아웃을사용, 각컴포넌트간의간격은가로 / 세로 5 픽셀컴포넌트의정렬위치는컨테이너의가운데 setlayout(new FlowLayout(FlowLayout.LEFT)) - 플로우레이아웃을사용, 각컴포넌트간의간격은가로 / 세로 5 픽셀정렬위치 -FlowLayout.LEFT, FlowLayout. CENTER, FlowLayout.RIGHT setlayout(new FlowLayout(FlowLayout.RIGHT, 5, 10)) - 플로우레이아웃을사용, 각컴포넌트간의간격은가로 5, 세로 10 픽셀
4.2 컴포넌트붙이기 FlowLayout 37 예제 : FlowTestOne.java 1 import java.awt.*; 2 3 public class FlowTestOne extends Frame { 4 public FlowTestOne() { 5 super("flowtestone"); 6 setlayout(new FlowLayout()); 7 add(new Button("1")); 8 add(new Button("2")); 13 add(new Button("7")).setVisible(false); 14 add(new Button("8")); 18 setsize(300, 200); 19 setvisible(true); 20 }
4.2 컴포넌트붙이기 BorderLayout 38 4.2.2 보더레이아웃 (BorderLayout) 컨테이너에서컴포넌트들의위치를 " 동 / 서 / 남 / 북 / 중앙 " 중에서하나를지정. 모든가장자리의요소들은필요한크기만큼자리를차지하고, 중앙에있는요소는남은여백을사용 생성자 setlayout(new BorderLayout()) - 보더레이아웃을사용하고, 각컴포넌트간의간격은 0 setlayout(new BorderLayout(5, 10)) - 보더레이아웃을사용하고, 각컴포넌트간의가로간격은 5, 세로간격은 10 픽셀 add("north", new TextField("Name", 30)) - 텍스트필드컴포넌트를북쪽 (North) 에붙인다. 보더레이아웃을이용해서컴포넌트를붙이는경우에 North/South/West/East/Center 의위치를정확히기술해주어야
4.2 컴포넌트붙이기 BorderLayout 39 예제 : BorderTestOne.java 1 import java.awt.*; 2 3 public class BorderTestOne extends Frame { 4 public BorderTestOne() { 5 super("bordertestone"); 6 setlayout(new BorderLayout(5, 5)); 7 add("north", new Button("North")); 8 add("center", new Button("Center")); 9 add("south", new Button("South")); 10 add("west", new Button("West")); 11 add("east", new Button("East")); 12 setsize(300,200); 13 setvisible(true); 14 }
4.2 컴포넌트붙이기 GridLayout 40 4.2.3 그리드레이아웃 (GridLayout) 컴포넌트들을행렬식으로행과열의수에맞게배치할때사용 컴포넌트들의위치는맨윗줄부터시작해서왼쪽에서오른쪽으로움직이며각줄을이동 add() 메소드를호출하는순서에따라컴포넌트의위치가변경 그리드레이아웃을생성하기위해서는행과열을지정해야 각행과열의크기가동일하기때문에그리드레이아웃에서는각컴포넌트는동일한크기를갖는다 생성자 setlayout(new GridLayout(3,4)) -3 행 4 열의그리드레이아웃을이용해컴포넌트를붙인다. setlayout(new GridLayout(2,0)) -0 이들어있는경우는행과열의수가결정되지않았음을의미이경우에는 2 행과임의의열을갖는그리드레이아웃이다. setlayout(new GridLayout(3,4,10,15)) -3 행 4 열그리드레이아웃에각컴포넌트의가로간격이 10 픽셀, 세로간격이 15 픽셀
4.2 컴포넌트붙이기 GridLayout 41 예제 : GridTestOne.java 1 import java.awt.*; 2 3 public class GridTestOne extends Frame { 4 public GridTestOne() { 5 super("gridtestone"); 6 setlayout(new GridLayout(3,2)); 7 add(new Button("1")); 8 add(new Button("2")); 12 add(new Button("6")); 13 setsize(300, 200); 14 setvisible(true);
4.2 컴포넌트붙이기 CardLayout 42 4.2.4 카드레이아웃 (CardLaytout) 카드레이아웃은카드형식으로된레이아웃 여러장의카드를만들어놓고필요한경우에원하는형태의카드를화면에보여주는방식 작성절차 1. 다음과같은생성자를이용해서만든다 CardLayout card = new CardLayout(); 2. 컨테이너에 setlayout() 메소드를이용해서카드레이아웃매니저를등록 setlayout(card); 3. 카드레이아웃을등록한다음에여러장의카드를위해서패널을만든다 Panel p1 = new Panel(); Panel p2 = new Panel(); 4. 만들어진여러장의패널을컨테이너에 add() 메소드를이용해서붙인다 add("first", p1) - "First" 는카드의이름부분이다. 따라서 p1 패널은 "First" 라는이름으로등록 5. 원하는카드를보여주기위해서는 show() 메소드를이용 card.show(this, "First") - show(container parent, String name) 형태 parent 는카드레이아웃이포함되어있는컨테이너를, name 은보여줄카드의이름을의미
4.2 컴포넌트붙이기 CardLayout 43 예제 : SimpleCard.java. 13 setlayout(card = new CardLayout()); 14 p1 = new Panel(); 15 p2 = new Panel(); 16 p3 = new Panel(); 48 add("first", p1); 49 add("second", p2); 50 add("third", p3); 51 add("fourth", p4); 52 add("fifth", p5); 53 54 card.show(this, "First"); 55 setsize(300, 200); 56 setvisible(true); 57 } 58 }
4.2 컴포넌트붙이기 CardLayout 44 예제 : SimpleCard2.java 13 body = new Panel(); 14 body.setlayout(card = new CardLayout()); 15 MouseHandler handler = new MouseHandler(); 20 ps = new Panel[data.length]; 21 22 for(int i=0; i < ps.length; i++) { 23 ps[i] = new Panel(); 24 ps[i].setbackground(colors[i]); 25 ps[i].add(new Label(data[i] + " Panel")); 26 ps[i].addmouselistener(handler); 27 body.add(string.valueof(i), ps[i]); 28 } 29 card.show(body, "0"); 45 public void itemstatechanged(itemevent e) { 46 Object o = e.getsource(); 47 if(o == choice) { 48 int index = choice.getselectedindex(); 49 card.show(body, String.valueOf(index)); 50 selected = index; 51 } 52 } 53 54 public class MouseHandler extends MouseAdapter { 55 public void mouseclicked(mouseevent e) { 56 card.next(body); 57 selected = (selected + 1) % ps.length; 58 choice.select(selected);
4.2 컴포넌트붙이기 GridBagLayout 45 4.2.5 그리드백레이아웃 (GridBagLayout) 컴포넌트의위치와크기를자유롭게만들수있는레이아웃매니저 사용하기복잡 작성절차 1. 생성자를이용해서그리드백레이아웃을만든다. GridBagLayout gridbag = new GridBagLayout(); 2. 그리드백콘스트레인트를만든다. GridBagConstraints constraint = new GridBagConstraints(); 3. 컨테이너의레이아웃매니저를그리드백레이아웃으로설정 setlayout(gridbag); 4. 그리드백콘센트레인트에변수값을할당 constraint.weightx = 1.0; 5. 컴포넌트와컴포넌트의그리드백콘스트레인트를설정 gridbag.setconstraints(b1, constraint); 6. 그리드백레이아웃에컴포넌트를붙인다. add(b1);
4.2 컴포넌트붙이기 GridBagLayout 46 그리드백컨스트레이트변수 gridx, gridy 컴포넌트의좌측상단모서리의시작위치를지정 화면의좌측상단모서리의좌표값은 gridx=0, gridy=0 GridBagConstraints.RELATIVE 컴포넌트의좌측상단시작위치를이전컴포넌트가끝나는곳다음부터 ( 이전컴포넌트의오른쪽 / 아래쪽 ) 사용하고자할때 gridwidth, gridheight 컴포넌트가화면에출력되는행과열의셀 (cell) 수를지정 기본값은 1 로설정되어있다. gridwidth = GridBagConstraints.REMAINDER 이면행의마지막에위치, gridheight = GridBagConstraints.REMAINDER 이면열의마지막에위치 GridBagConstraints.RELATIVE 로설정되면행과열의마지막컴포넌트옆에위치
4.2 컴포넌트붙이기 GridBagLayout 47 fill 컴포넌트의크기가컨테이너보다커야할때사용 GridBagConstraints.NONE으로설정되면컨테이너의크기는불변 GridBagConstraints.HORIZONTAL으로설정되면가로축이확장 GridBagConstraints.VERTICAL으로설정되면세로축이확장 GridBagConstraints.BOTH인경우에는가로 / 세로방향으로모두확장 ipadx, ipady 내부의여백을결정 insets 컴포넌트의바깥쪽여백을결정
4.2 컴포넌트붙이기 GridBagLayout 48 Anchor 컴포넌트의크기가컨테이너보다작은경우에컴포넌트위치를결정 사용가능한값들 GridBagConstraints.CENTER ( 가운데, 기본값 ) GridBagConstraints.NORTH ( 북쪽 ) GridBagConstraints.NORTHEAST ( 북동쪽 ) GridBagConstraints.EAST ( 동쪽 ) GridBagConstraints.SOUTHEAST ( 남동쪽 ) GridBagConstraints.SOUTH ( 남쪽 ) GridBagConstraints.SOUTHWEST ( 남서쪽 ) GridBagConstraints.WEST ( 서쪽 ) GridBagConstraints.NORTHWEST ( 북서쪽 ) weightx, weighty 컴포넌트의크기가변경될때변경되는크기를제어 만약 weightx, weighty 의값이 0 인경우에는크기가변경되지않는다. 값이 0 이아닌경우에는값에비례해서크기가변경
4.2 컴포넌트붙이기 GridBagLayout 예제 : SimpleGridBag.java 7 GridBagLayout gridbag = new GridBagLayout(); 8 GridBagConstraints constraint = new GridBagConstraints(); 9 setlayout(gridbag); 10 11 constraint.fill = GridBagConstraints.BOTH; 12 constraint.weightx = 1.0; 13 Button b1 = new Button("Button1"); 14 gridbag.setconstraints(b1, constraint); 15 add(b1); 16 17 Button b2 = new Button("Button2"); 18 gridbag.setconstraints(b2, constraint); 19 add(b2); 20 21 constraint.gridwidth = GridBagConstraints.REMAINDER; 22 Button b3 = new Button("Button3"); 23 gridbag.setconstraints(b3, constraint); 24 add(b3); 49
4.2 컴포넌트붙이기 No-Layout 50 4.2.6 레이아웃매니저사용안하기 setlayout(null) 각컴포넌트의크기와위치를프로그래머가지정해주어야 플랫폼환경이변하거나프레임의크기가변경되는경우에 컴포넌트의크기나위치가프로그래머가원하는것과다르게나올 수있다 예제 : NoLayout.java 12 setlayout(null); 13 setsize(500, 400); 14 display = new TextArea(5, 15); 15 display.setsize(220, 200); 16 display.setlocation(210, 50); 17 add(display);
4.2 컴포넌트붙이기 PositionLayout 51 사용자가정의하는레이아웃매니저 LayoutManager 인터페이스구현 addlayoutcomponent layoutcontainer minimumlayoutsize preferredlayoutsize removelayoutcomponent PositionLayout 컴포넌트의크기와위치를백분율로표기 컴퍼넌트의상대위치로지정가능
4.2 컴포넌트붙이기 PositionLayout 52 예제 : PositionLayoutTest.java / PositionLayout.java 3 public class PositionLayoutTest extends Frame { 4 5 public PositionLayoutTest() { 6 super("positionlayout 테스트-1"); 7 setlayout(new PositionLayout()); 8 9 add("20%, 0%, 80%, 40%", new JButton("A")); 10 add("5%, 10%, 15%, 80%", new JButton("B")); 11 add("20%, 45%, 35%, 80%", new JButton("C")); 12 add("40%, 60%, 90%, 100%", new JButton("D")); 13 add("85%, 10%, 95%, 50%", new JButton("E"));
4.2 컴포넌트붙이기 53 4.2.7 기타관련사항 1. 컴포넌트크기 o o o getpreferredsize() 로가장적절한크기를결정 getpreferredsize() 메소드를오버라이딩하여적절한크기를변경할수있음. getinsets() 메소드를오버라이딩하여프레임내부와컴포넌트의간격을조절. Insets 생성자. Insets(int top, int left, int bottom, int right) - Insets 간격을위에서부터반시계방향으로설정한다.
4.2 컴포넌트붙이기 54 예제 : ComponentSize.java.. 11 ok = new Button("OK") { 12 public Dimension getpreferredsize() 13 return new Dimension(80, 50); 14 } 15 }; 17 msg = new Label(" 메시지 ", Label.CENTER) { 18 public Dimension getpreferredsize() { 19 return new Dimension(80, 50); 20 } 21 }; 31 public Insets getinsets() { 32 return new Insets(33, 10, 10, 10);
4.2 컴포넌트붙이기 55 2. 프레임에아이콘설정하기 o 아이콘을프레임의 seticonimage() 메소드를이용해서설정할수있다. 예제 : IconTest.java 1 import java.awt.*; 2 3 public class IconTest extends Frame { 4 Image logo; 5 6 public IconTest() { 7 super(" 학교로고 "); 8 Toolkit tk = Toolkit.getDefaultToolkit(); 9 logo = tk.getimage("horse-1.gif"); 10 seticonimage(logo);
4.3 메뉴만들기 56 메뉴는프레임에만붙일수있다 프레임에는하나의메뉴바가있고, 프레임에메뉴바를붙일때는 setmenubar() 메소드를이용 메뉴바에는여러개의메뉴가있을수있고, 메뉴를마우스로클릭하는경우에메뉴아이템들이보여진다 메뉴바, 메뉴, 메뉴아이템들의관계
4.3 메뉴만들기 57 예제 : MenuBarDemo.java 8 mb = new MenuBar(); 9 setmenubar(mb); 10 Menu file = new Menu("File"); 11 MenuItem filenew = new MenuItem("New"); 14 file.add(filenew); 16 file.addseparator(); 17 file.add(fileexit); 18 Menu edit = new Menu("Edit"); 19 Menu sort = new Menu("Sort"); 20 CheckboxMenuItem byname = new CheckboxMenuItem("by Name"); 21 CheckboxMenuItem bysize = new CheckboxMenuItem("by Size"); 22 sort.add(byname); 23 sort.add(bysize); 24 edit.add(sort);
4.4 다이얼로그 58 4.4.1 다이얼로그 (Dialog) 다이얼로그는프레임과유사한형태의윈도우 다이얼로그는주로오류 / 경고 / 확인메시지를보여주기위해서사용 생성자 Dialog(Frame) - 다이얼로그는프레임을아규먼트로만들수있다. Dialog(Frame, boolean) - 부울린부분에는모달 (modal) 을가질것인가여부를결정. true 이면모달을갖는다. 모달이있는경우에는다이얼로그의입력이있을때까지프레임은사용할수없다. Dialog(Frame, String) - String 아규먼트는다이얼로그의타이틀로사용 Dialog(Frame, String, boolean) - String 아규먼트는 타이틀로사용되고, boolean 부분은모달사용여부를결정 다이얼로그의
4.4 다이얼로그 59 예제 : DialogTest.java 1 import java.awt.*; 2 3 class DialogTest extends Frame { 4 Dialog d; 5 6 public DialogTest(String title) { 7 super(title); 8 d = new Dialog(this, "Dialog", false); 9 d.add("center", new Label("This is a Dialog.")); 10 d.add("south", new Button(" OK ")); 11 d.pack(); 12 d.setvisible(true); 17 public static void main(string args[]) { 18 new DialogTest("DialogTest"); 19 } 20 }
4.4 다이얼로그 60 4.4.2 파일다이얼로그 (FileDialog) 파일다이얼로그는파일을읽거나저장하기위해서원하는파일을선택 생성자 FileDialog(Frame) - 다이얼로그와마찬가지로프레임을아규먼트로만들수있다. FileDialog(Frame, String) -String은파일다이얼로그의타이틀로사용 FileDialog(Frame, String, int) -String은파일다이얼로그의타이틀을, int 부분은모드 (mode) 를표시모드는 FileDialog.LOAD, FileDialog.SAVE 두가지값을가질수있다. FileDialog.LOAD :- 읽을수있는파일들이파일다이얼로그에나타나고, FileDialog.SAVE :- 기록할수있는파일들이나타난다
4.4 다이얼로그 61 예제 : FileDialogTest.java 1 import java.awt.*; 2 3 class FileDialogTest extends Frame { 4 FileDialog fd; 5 6 public FileDialogTest(String title) { 7 super(title); 8 fd = new FileDialog(this, "FileDialog"); 9 setsize(300, 200); 10 setvisible(true); 11 fd.setvisible(true); 12 } 13 14 public static void main(string args[]) { 15 new FileDialogTest("DialogTest"); 16 } 17 }