자바네트워크프로그래밍 (OCJP 국제공인자격취득중심 ) 충북대학교 최민
java.awt Package java.awt 패키지는자바애플리케이션프로그래밍인터페이스 (API : Application Programming Interface) 의일부로서그래픽처리를담당하는컴포넌트들을포함합니다. 즉, 화면상에윈도우를그리고, 그위에버튼이나텍스트필드등을붙이는데필요한 GUI 프로그래밍도구와이에관련된기능을제공합니다. 따라서, 응용프로그램개발자는이러한그래픽처리를위한컴포넌트를사용하여애플리케이션의그래픽사용자인터페이스 (GUI : Graphical User Interface) 를개발할수있습니다. AWT란 Abstract Window Toolkit의약자인데, Abstract 라는단어가붙은이유는이패키지를이용하여특정한운영체제에서만수행되는 GUI 프로그램을작성하는것이아니라, 자바프로그램이수행되는어떤운영체제에서든지수행되는 GUI 프로그램을작성할수있기때문입니다. 2
출제기준 1. 컴포넌트 (java.awt.component) 의배경색, 전경색, 크기, 활성 / 비활성화등의속성을조정하는 setbackground(), setforeground(), setenabled(boolean), setvisible(boolean) 메소드의사용법을확실히이해합니다. 따라서, 모양이제시되어있고, 크기가변경되었을때의처리방식이결정되어있는 GUI 를화면에표시하는코드를작성할수있어야합니다. 2. GUI 컴포넌트들 (button, Canvas, Checkbox, Choice, Label, List, Scrollbar, TextField, TextArea) 을사용한코드를작성할수있어야합니다. 3
출제기준 3. 이벤트처리를위한리스너클래스와메소드를작성하고, 리스너메소드안에서 Event 인수를이용하여이벤트가발생한 Component 는무엇이고, 이벤트발생시마우스의위치는어디며, 이벤트의본질은무엇인지등에대한정보를추출할수있어야합니다. 4. menu 관련컴포넌트들 (MenuComponent, MenuBar, MenuItem, Menu, CheckboxMenuItem, PopupMenu) 의상속관계를알고설명할수있어야합니다. 4
button, checkbox, checkboxgroup, label, list, textarea, textfield 버튼 (button) 버튼 (button) 은 GUI 컴포넌트중에서도가장많이사용되는컴포넌트로서일반적으로마우스로클릭하는이벤트에대하여원하는행위를하도록프로그램을작성합니다. Button(); Button(String label); 5
버튼 (button) 버튼객체를생성하는데에는두가지종류의생성자메소드를사용할수있습니다. 두번째생성자메소드를이용하는경우는버튼객체에출력될레이블을처음부터지정하여줄수있습니다. 그렇지않고버튼객체를일단생성한뒤 setlabel() 메소드를사용하여차후설정할수도있습니다. 다음그림은프레임클래스를상속받는객체에 "Testing" 이라는문자열을갖는버튼 (Button) 객체를추가한것입니다. 6
체크박스 (checkbox) 체크박스는문자열레이블을갖는선택박스입니다. 체크박스객체는선택유무를결정하는참 (true) 과거짓 (false) 의두가지상태를가집니다. 7
체크박스 (checkbox) 체크박스그룹 ( 라디오버튼객체 ) 과는달리체크박스객체는중복선택이가능한특성을가집니다. 즉, 위그림에서 Milk 와함께 Sandwitch 를함께선택하는경우 Milk 와 Sandwitch 두개의 true 값을가지게됩니다. 그리고, 체크박스객체의생성시에 true, false 상태값을특별히지정하지않는경우디폴트값인 false 로설정됩니다. 8
체크박스그룹 (CheckboxGroup) 체크박스그룹은라디오버튼을구현하기위해체크박스객체들을한데묶을때사용됩니다. 체크박스객체는다중선택이가능한반면체크박스그룹을통한라디오버튼객체는단일선택만가능합니다. 즉, 한번에한개의객체만 true 값을가질수있습니다. 9
Choice 객체 Choice 객체는흔히콤보박스 (Combo Box) 라고도불리우며, 여러개의아이템중에서하나를선택할수있도록합니다. 사용자가마우스로아래쪽화살표버튼을누르면선택가능한모든아이템들이나타납니다. 위그림은 Choice 객체의생성예입니다. Choice 객체에서제공하는몇가지부가적인메소드로사용자가선택한아이템이무엇인지혹은몇번째아이템인지확인하고자할때 getselecteditem(), getselectedindex(), getitem() 등의메소드를사용합니다. 10
List 객체 List 객체는선택가능한여러아이템들을포함하며이들의수가화면에표현할수있는것보다많은경우스크롤기능을제공하는선택박스입니다. 11
List 객체 List 객체를생성하는것은앞의 Choice 객체를생성하는방법과유사합니다. List 객체의특정아이템을한번클릭하는것은 item 이벤트를발생시키며, 더블클릭을하는것은 action event 를발생시킵니다. 따라서, 한번클릭하는하는것은특정아이템을선택을의미하고, 두번클릭하는것은그아이템의선택에대한프로그램의특정한행위를수행함을의미합니다. List 객체도 Choice 객체와마찬가지로사용자가선택한아이템이무엇인지혹은몇번째아이템인지파악하기위한다양한메소드들을제공합니다. List 객체에포함된아이템의수가많으면우측에스크롤바가자동으로나타납니다. 12
List 객체 13
Label 객체 Label 은한줄짜리텍스트문자열을포함하는읽기전용의선택기능이없는컴포넌트입니다. Label 객체는주변에경계선을갖지않으며사용자는객체안에담겨있는문자열밖에는볼수없습니다. 또한, 어떠한이벤트도발생시키지않습니다. 결국은, GUI 프로그램의특정위치에문자열을출력하기위해사용하는컴포넌트라볼수있습니다. 주로, 다른컴포넌트의기능혹은의미를표시하기위해서해당객체옆에위치됩니다. 다음그림은 Label 객체를사용한예제프로그램의실행결과입니다. 14
Label 객체 Label 객체역시버튼객체와같이몇가지다른종류의생성자함수를제공하고있는데 Label 없이생성하려는경우인수없는 Label() 생성자를사용하고처음부터 Label 을주어 Label 객체를생성하는경우 String 타입의인수를취하는 Label(String text) 생성자를호출합니다. 그뿐아니라 Label 객체의문자열정렬방향에대한옵션도지정하고자한다면 Label(String text, int alignment) 를사용합니다. 15
Scrollbar 객체 Scrollbar 객체는수직 (vertical) 과수평 (horizontal) 의두가지종류가있으며어떤주어진수의범위으로부터하나의값을선택하는것을나타냅니다. 스크롤바의슬라이더 (slider) 는그위치에따라정해진영역에서의상대적인현재값을나타냅니다. 이러한슬라이더를움직이는방법은여러가지가있는데, 기본적으로위, 아래혹은좌, 우의이동버튼을누르면 Scrollbar 의생성시지정한최소단위만큼슬라이더가이동합니다. 또, 슬라이더와이동버튼사이의 Scrollbar 영역을클릭하면해당위치로슬라이더가직접이동합니다. 마지막으로, 슬라이더를직접드래그하여원하는위치에옮겨놓을수도있습니다. 16
Scrollbar 객체 위그림은 Scrollbar 객체의사용예를보여줍니다. 이 Scrollbar 객체데모에서는다음과같은인수를생성자에제공하여객체를생성하였습니다. Scrollbar(Scrollbar.HORIZONTAL, 0, 50, 0, 300); 17
Scrollbar 객체 위에서두번째인수 0 은 Scrollbar 의슬라이더가갖는초기값을, 세번째인수 50 은슬라이더의폭을나타냅니다. 다음으로네번째와다섯번째인수는 Scrollbar 가갖는최소및최대값을나타냅니다. 첫번째인수는 Horizontal Scrollbar 인지 Vertical Scrollbar 인지를지정합니다. 스크롤바생성자의세번째인수인슬라이더의폭이 50 이란이야기는 300 의영역에서 50 만큼에해당하는부분을제외한 250 만큼에대한선택이가능하다는이야기입니다. 실제로, Scrollbar 의생성자를호출하는부분의소스코드를다음과같이변경하면좀전과는다른결과가나타납니다. 18
TextArea 객체 TextArea 객체는사용자에게여러줄의문자열정보를보여주거나입력받을수있도록하는컴포넌트입니다. 포함하는정보의양에따라우측과하단에스크롤바객체가생성될수있어상하스크롤또는좌우스크롤을지원합니다. 19
TextArea 객체 TextArea 객체는포함할수있는문자의양을조절하거나문자열자체를설정할수있도록하는다양한메소드를제공합니다. setrows() 메소드는 TextArea 객체의행의수를설정하며, setcolumns() 메소드는 TextArea 객체의열의수를지정합니다. 그리고, settext() 메소드는 TextArea 의상위클래스인 TextComponent 클래스에속하여있는메소드로텍스트문자열의내용을설정합니다. 뿐만아니라, TextArea 객체의현재상태를설정할수있는메소드를제공합니다. TextComponent 클래스의메소드인 seteditable() 을사용하여 TextArea 객체를편집가능하도록 (Editable) 하거나읽기전용 (not Editable) 으로설정할수있습니다. 예를들어, seteditable(true); 는해당객체를편집가능하도록하며기본값은편집가능한상태입니다. 20
TextField 객체 TextField 객체는단일행문자열을출력하거나입력받습니다. 화면에보이는것보다많은문자열을입력하는경우자동으로좌우스크롤기능을제공합니다. TextField 객체의생성자를중에는 public TextField(String text, int columns); 과같은형태로 TextField 객체의내용이나컬럼의수를처음부터지정할수있도록할수도있습니다. 21
컨테이너 (Container) 다른컴포넌트들을관리하거나포함할수있는객체로레이아웃의속성을가지며프레임 (Frame), 패널 (Panel), 윈도우 (Window) 등이있습니다. 컨테이너객체는컴포넌트나또다른컨테이너를포함할수있습니다. 컴포넌트를컨테이너에추가할때에는 add() 메소드를사용합니다. Component add(component comp); Component add(component comp, int index); void add(component comp, Object constraints); void add(component comp, Object constraints, int index); Component add(string name, Component comp); 22
컨테이너 (Container) 컨테이너클래스에서는여러가지다른종류의 add() 메소드를오버로딩 (overloading) 하고있으며이들은컴포넌트를컨테이너에추가하기위한여러가지방법을제공합니다. 첫번째 add() 메소드는가장전형적인컴포넌트추가메소드로지정된컴포넌트를메소드가불리워지는컨테이너에추가합니다. 두번째것은해당컴포넌트를특정인덱스로지정된위치에삽입합니다. 그리고세번째와네번째메소드와같이인수로제약조건 (constraints) 을주는방법은추후해당컴포넌트를제약조건으로다시참조하고자하기위함입니다. 23
레이아웃 GUI 응용프로그램을설계할때고려하여야할부분중에는사용자와상호작용하는컴포넌트들의위치와크기도포함됩니다. 그리고, 사용자가윈도우의크기를재조정할때이러한컴포넌트들이어떻게변화되어야하는지또한생각하여야합니다. 이처럼복잡한작업들이자바에서는레이아웃매니저에의해서자동으로처리되며프로그래머는단지레이아웃매니저가구현하는여러가지레이아웃중하나를선택하기만하면됩니다. 24
레이아웃 레이아웃매니저란어떤컨테이너객체내부에서한개이상의컴포넌트객체들을배치할수있도록하는데필요로하는방법을정의해놓은인터페이스입니다. 그밖에도컨테이너의크기가변경되었을때라든자새로운요소가추가되었을때적절한재조정작업도수행합니다. 자바 AWT 에있는컨테이너객체들즉, 패널 (Panel), 프레임 (Frame), 윈도우 (Window), 다이얼로그 (Dialog) 등은모두레이아웃매니저를포함하고있습니다. AWT 에서정의해놓은 LayoutManager 인터페이스를구현하는레이아웃매니저클래스에는다섯가지종류가있습니다. 25
레이아웃 BorderLayout CardLayout FlowLayout GridBagLayout GridLayout 26
다음은여러가지레이아웃매니저들의클래스상속관계를나타낸그림입니다. 27
FlowLayout FlowLayout 은패널 (Panel) 계열컨테이너 (Container) 에기본적으로적용되는레이아웃매니저 (LayoutManager) 입니다. 당연히 Panel 클래스의하위클래스인 Applet 클래스의경우에도특별히레이아웃매니저를변경하지않는한이 FlowLayout 이적용됩니다. FlowLayout 레이아웃매니저는컴포넌트들을왼쪽에서오른쪽으로행우선으로배치합니다. 즉, 한행이모두차면다음행으로넘어가다시왼쪽에서오른쪽으로컴포넌트들을배치합니다. 28
FlowLayout FlowLayout 의가장큰특징은컨테이너의크기를사용자가변경시켰을때그위에붙어있는각 Component 의크기는변하지않고, 상대적인위치만변한다는것입니다. 예를들어, 나타내야할 Button 이다섯개있는데, 자리가부족하여한줄에다섯개의 Button 이다들어갈수없으면나머지 Button 들은자동으로다음줄에표시됩니다. FlowLayout 의또다른특징으로 FlowLayout 은각컴포넌트에따라서최적의크기 (preferred size) 로설정된크기를유지합니다. 따라서, 컨테이너의크기혹은윈도우의크기를변경시키는행위와는무관하게컴포넌트의크기는유지됩니다. 29
FlowLayout 위에서언급한바와같이 Panel 과 Applet 에대해서는 FlowLayout 이디폴트레이아웃매니저로설정되어있듯이각컨테이너별로디폴트레이아웃매니저가지정되어있습니다. 그런데, 만약현재컨테이너에이를변경하여적용하고싶다면컨테이너클래스의메소드인 setlayout() 메소드에임의의레이아웃매니저객체를넘겨주어호출하면됩니다. 예를들어, f 핸들변수가가리키는 Frame 의 LayoutManager 를 FlowLayout 으로하고자한다면다음과같이사용하면됩니다. 30
FlowLayout f.setlayout(new GridLayout()); FlowLayout 클래스는세가지다른종류의오버로딩 (overloading) 된생성자를제공합니다. FlowLayout(); FlowLayout(int alignment); FlowLayout(int alignment, int horizontalgap, int verticalgap); 31
FlowLayout 첫번째인수인 alignment 는 LEFT, RIGHT, CENTER 세가지중하나를선택할수있으며기본값 (default) 으로는 CENTER 가설정되어있습니다. 두번째와세번째인수인 horizontalgap 과 verticalgap 은각각컴포넌트들간의수직, 수평간격을지정할수있도록하고있습니다. 따라서, 모든설정을디폴트값으로사용하고싶은경우첫번째생성자를사용하면되고, 컴포넌트들의배치를보다세밀하게하고자한다면두번째혹은세번째것을사용하면됩니다. 32
기본예제 이예제에서는 FlowLayout 을이용하여 Frame 위에 Button 을 6 개배치하고있습니다. 프로그램수행후 Frame 의크기를변경하면서각 Button 의위치와크기에어떤변화가있는지살펴봅시다. import java.awt.*; public class FlowLayoutTest extends Frame { FlowLayoutTest() { Button b1 = new Button("Button 1"); Button b2 = new Button("Button 2"); Button b3 = new Button("Button 3"); Button b4 = new Button("Button 4"); Button b5 = new Button("Button 5"); Button b6 = new Button("Button 6"); add(b1);add(b2);add(b3);add(b4);add(b5);add(b6); } public static void main(string args[]) { FlowLayoutTest flt = new FlowLayoutTest(); flt.setlayout(new FlowLayout()); flt.setsize(300, 100); flt.setvisible(true); } } 33
기본예제 34
기본예제 위결과는 Frame 클래스를상속받은 FlowLayoutTest 클래스의객체를생성하고 6 개의 Button 객체를생성하여컨테이너에추가한형태입니다. 35
기본예제 윈도우의크기를앞에서와같이변경하였을경우한행에들어갈수있는컴포넌트들의수는윈도우의수평방향폭에의존적입니다. 따라서, 위와같이윈도우의수평크기를줄이면윈도우내한행에포함되는컴포넌트의수는줄어들고대신다음행에추가로컴포넌트를배치하게됩니다. 36
실전문제 What is a layout manager that doesn't change its Component size regardless of its Frame size? ( ) 37
해설 & 답 Frame 의크기가변하더라도, 각 Component 의크기는변하지않는 LayoutMan ager 를묻고있습니다. 정답은이모듈에서우리가공부한대로 FlowLayout 입니다. 만약 SCJP 시험에이런문제가출제된다면대 소문자를주의하시기바랍니다. FlowLayout 은자바 AWT 패키지에정의되어있는클래스의이름으로, 자바에서는클래스이름을비롯한식별자에서대 소문자를구별하기때문입니다. 답은 FlowLayout 입니다. 38
BorderLayout BorderLayout 은윈도우 (Window) 계열컨테이너 (Container) 에기본적으로적용되는 LayoutManager 입니다. 당연히 Window 클래스의하위클래스인 Frame 클래스의경우에도특별히 LayoutManager 를변경하지않는한이 BorderLayout 이적용됩니다. BorderLayout 레이아웃매니저는어떤컴포넌트를컨테이너의동서남북의네방향으로배치시킬수있는기능을제공합니다. 나머지공간은컨테이너의중앙에배치되는컴포넌트에게할당됩니다. 결과적으로, North, South, East, West, Center 의총 5 방향에대하여컴포넌트를배치할수있습니다. 39
BorderLayout BorderLayout 의가장큰특징은 Container 의크기를사용자가변경시켰을때그위에붙어있는각 Component 의상대적인위치는변하지않고, 크기만변한다는것입니다. 따라서, BorderLayout 이적용된 Container 의경우에 Component 를붙일때 Frame 의어느부분에붙일지 add() 메소드에다음과같이지정해야합니다. boderlayout.add(component, compass); borderlayout component compass BorderLayout 이적용된컨테이너객체 컨테이너위에삽입할컴포넌트객체 삽입될위치를나타내는상수 40
예를들어, Frame 클래스를상속받는어떤클래스의객체 f1 에컴포넌트 c1 을북쪽위치에삽입하려면다음과같이 add() 메소드를호출합니다. f1.add(c1, BorderLayout.NORTH); 다음은 BorderLayout 에서컴포넌트배치에사용되는 5 가지방향을직관적으로이해할수있도록하기위한그림입니다. 41
add() 메소드의두번째인수가취하는상수와상수의의미는다음표와같습니다. 상수 BorderLayout.NORTH BorderLayout.SOUTH BorderLayout.EAST BorderLayout.WEST 의미컨테이너뒤쪽에배치컨테이너아래쪽에배치컨테이너오른쪽에배치컨테이너왼쪽에배치 BorderLayout.CENTER 나머지영역에배치 42
기본예제 이예제에서는 BorderLayout 을이용하여 Frame 위에 Button 을배치하고있습니다. 프로그램수행후 Frame 의크기를변경하면서각 Button 의위치와크기에어떤변화가있는지살펴봅시다. import java.awt.*; public class BorderLayoutTest extends Frame { Button b1, b2, b3, b4, b5; BorderLayoutTest() { setlayout(new BorderLayout()); b1 = new Button("Button 1"); b2 = new Button("Button 2"); b3 = new Button("Button 3"); b4 = new Button("Button 4"); b5 = new Button("Button 5"); add(b1, BorderLayout.NORTH); add(b2, BorderLayout.SOUTH); add(b3, BorderLayout.EAST); add(b4, BorderLayout.WEST); add(b5, BorderLayout.CENTER); } public static void main(string args[]) { BorderLayoutTest blt = new BorderLayoutTest(); blt.setsize(300, 100); blt.setvisible(true); } } 43
기본예제 다음은 BorderLayout 을사용한위예제프로그램의실행모습입니다. 44
기본예제 윈도우 ( 혹은컨테이너 ) 의크기를변경하는경우각 Component 의상대적인위치 (NORTH, SOUTH, EAST, WEST, CENTER) 는변하지않고, 크기만변하는것을확인할수있습니다. 45