330 likes | 573 Views
Java Programming Language (5) - AWT programming 1 -. Dong In Shin DCS lab Seoul National University. AWT programming. java.awt package AWT component class Component 의 화면 배치 Container & Panel component Layout management FlowLayout, BorderLayout, GridLayout, GridBagLayout, CardLayout
E N D
Java Programming Language (5)- AWT programming 1 - Dong In Shin DCS lab Seoul National University
AWT programming • java.awt package • AWT component class • Component의 화면 배치 • Container & Panel component • Layout management • FlowLayout, BorderLayout, GridLayout, GridBagLayout, CardLayout • Label, Button, Canvas component • Window , Frame component dishin@dcslab.snu.ac.kr
AWT programming • AWT event Processing Model • Adapter class • AWT event class의 종류 • Event handler의 등록 • 여러 가지 components • TextField, TextArea, Checkbox, Choice, List, Scrollbar, ScrollPane… • AWT 문서 • http://java.sun.com/products/jdk/awt/ dishin@dcslab.snu.ac.kr
AWT component의 종류 dishin@dcslab.snu.ac.kr
AWT component의 종류 • 기본 control • Button, Checkbox, Choice, List, MenuItem, TextFileld • 사용자 입력의 다른 방법 • Scrollbar, TextArea • Canvas • screen에 graphic을 나타낼 수 있게 한다. • Label • 선택할 수 없는 문자 라인을 출력하는 class • Container • 다른 component를 담을 수 있는 UI • Container 클래스의 하위 클래스 • 세 종류의 container가 존재 • Window 하위 class Dialog, FileDialog, Frame • Panel • ScrollPane dishin@dcslab.snu.ac.kr
AWT component의 종류 dishin@dcslab.snu.ac.kr
AWT classes • Layout manger : component의 배치와 크기를 조절 • 크기와 형태를 지정해 놓은 클래스들 • Dimension : 사각형의 크기 • Insets : 컨테이너의 주변부와 컨테이너 내부와의 관계 • Point, Rectangle, Polygon • Color : 색의 지정과 조작 • Image • Image • Toolkit : 플랫폼에 의존하는 AWT에 대하여 플랫폼 독립적인 인터페이스 제공 • MediaTracker : 이미지 로딩의 상태를 추적 • Font • Font : 여러 가지 글자 폰트와 그에 관한 정보 • FontMetrics : 특정한 폰트에 대한 상세한 정보를 얻게 해 준다. • Graphics dishin@dcslab.snu.ac.kr
Component의 일반적인 사용 규칙 • Container에 component 추가 • Container의 Layout에 따라 여러 가지 add method 사용 • Component의 일반적인 기능들 • 기본적인 painting method • Paint(Graphics g), update(Graphics g), repaint.. • Event handling • 여러 종류의 event 와 keyboard focus를 제공 • 외형 제어 • Font : setFont(), getFont() • color : setForeground(), getForeground( ), setBackground( ), getBackground( ) • Visible : setVisible() • Component의 활성화 , 무력화 : setEnabled(boolean) • Image handling • Cursor : setCursor(), getCursor() dishin@dcslab.snu.ac.kr
Button 컴포넌트 import java.awt.*; class LabelButtonTest { public static void main(String[] args) { Frame f = new Frame(); f.setLayout(new GridLayout() ); Label label1 = new Label(); Label label2 = new Label(); Button button = new Button(); f.add(label1); f.add(label2); f.add(button); label1.setText("첫번째 레이블"); label2.setText("두번째 레이블"); label2.setAlignment(Label.CENTER); button.setLabel("보턴"); System.out.println(button.getActionCommand() ); f.setSize(400, 100); f.setVisible(true); } } dishin@dcslab.snu.ac.kr
Checkbox 컴포넌트 • Checkbox • 두개의 상태에서 선택 • ChckboxGroup • 여러 개의 체크박스 중 배타적으로 하나만 선택되어 지도록 하기 위해서 체크박스를 체크박스 그룹에 더한다. • ItemListener 와 관련 dishin@dcslab.snu.ac.kr
Checkbox 컴포넌트 import java.awt.*; import java.applet.Applet; public class CheckboxDemo extends Applet { public void init() { Panel p1, p2; Checkbox cb1, cb2, cb3; Checkbox cb4, cb5, cb6; CheckboxGroup cbg; cb1 = new Checkbox(); cb1.setLabel("Checkbox 1"); cb2 = new Checkbox("Checkbox 2"); cb3 = new Checkbox("Checkbox 3"); cb3.setState(true); p1 = new Panel(); p1.setLayout(new FlowLayout()); p1.add(cb1); p1.add(cb2); p1.add(cb3); cbg = new CheckboxGroup(); cb4 = new Checkbox("Checkbox 4", cbg, false); cb5 = new Checkbox("Checkbox 5", cbg, false); cb6 = new Checkbox("Checkbox 6", cbg, false); p2 = new Panel(); p2.setLayout(new FlowLayout()); p2.add(cb4); p2.add(cb5); p2.add(cb6); setLayout(new GridLayout(0, 2)); add(p1); add(p2); validate(); } } dishin@dcslab.snu.ac.kr
Frame component • Frame 클래스는 applet이나 application을 위한 window를 제공한다. • method • String getTitle(), void setTitle(String) • Image getIconImage(), void setIconImage(Image) • MenuBar getMenuBar(), void setMenuBar(MenuBar) • remove(MenuComponent) • boolena isResizable(), setResizable(boolean) dishin@dcslab.snu.ac.kr
Frame Example import java.awt.*; import java.io.File; class FrameTest { public static void main(String[] args) { Frame f = new Frame(); f.setTitle("Frame Test"); f.setSize(100,100); f.setResizable(false); Image icon = Toolkit.getDefaultToolkit().getImage( ".." + File.separator + ".." + File.separator + "pencil.gif"); f.setIconImage(icon); f.setVisible(true); } } dishin@dcslab.snu.ac.kr
List component • 목적(다음 경우에 적당) • 선택 아이템이 항상 보이게 할 때 • 선택할 아이템이 매우 많을 때 스크롤 기능 • 한번에 여러 개의 아이템을 선택할 수 있게 할 때 • ItemListner • method • List(int) • String getItem(int) • String[ ] getItems( ) • int getItemCout( ) • int getRows( ) dishin@dcslab.snu.ac.kr
List component • Int getSelectedIndex( ), String getSelectedItem( ) • int[ ] getSelectedIndexes( ), String[ ] getSelectedItems( ) ,Object[ ] getSelectedObjects( ) • void select(int), void deselect( ) • boolena isIndexSelected(int), boolean isItemSelected(String) • void addItem(String, int) • void replaceItem(String, int) • void delItem(it), void remove(int), void remove(String), void removeAll( ) • boolean isMultipleMode( ), setMultipleMode(boolean) • void makeVisible(int), int getVisibleIndex( ) dishin@dcslab.snu.ac.kr
List Example import java.awt.*; import java.awt.event.*; class ListTest extends Frame { List places = new List(4); { places.add("seoul"); places.add("Inchoen"); places.add("Taejon"); places.add("Taeku"); places.add("Pusan"); } TextField selectedPlace = new TextField(8); { selectedPlace.setEditable(false); } List courses = new List(4, true); { courses.add("Java"); courses.add("Unix Administration"); courses.add("Windows Nt administration"); courses.add("Network"); courses.add("CGI Programming"); courses.add("Database"); } dishin@dcslab.snu.ac.kr
List Example List selectedCourses = new List(4, true); { places.addItemListener(new ItemListener( ) { public void itemStateChanged(ItemEvent ev) { selectedPlace.setText(places.getSelectedItem()); } }); courses.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent ev) { String[] selectedItems = courses.getSelectedItems(); selectedCourses.removeAll(); for(int i = 0 ; i < selectedItems.length; ++i) selectedCourses.add(selectedItems[i]); } }); setTitle("ListTest"); setLayout(new FlowLayout(FlowLayout.LEFT)); Panel p1 = new Panel(); p1.add(new Label("Place for lesson: ")); p1.add(places); add(p1); dishin@dcslab.snu.ac.kr
List Example Panel p2 = new Panel(); p2.add(new Label("Selected Place: ")); p2.add(selectedPlace); add(p2); Panel p3 = new Panel(); p3.add(new Label("Courses: ")); p3.add(courses); add(p3); Panel p4 = new Panel(); p4.add(new Label("Selected Courses: ")); p4.add(selectedCourses); add(p4); } public static void main(String[] args) { Frame f = new ListTest(); f.setSize(300, 300); f.setVisible(true); } } dishin@dcslab.snu.ac.kr
List Example dishin@dcslab.snu.ac.kr
Panel • 범용의 container • Component 를 보유하거나 특수한 기능- 보드를 그리거나 이벤트 핸들링을 사용할 때- 을 수행하는 하위 클래스를 정의할 때 사용 • applet의 상위 클래스 dishin@dcslab.snu.ac.kr
문자 편집 • TextField • 한 줄의 문자 편집기 • Method • getColumns( ) • setEchoChar(char c) • getEchoChar( ), echoCharIsSet( ) • TextArea • 여러 줄의 문자열 편집 • Method • getRows( ), getColumns( ) • insert(String, int) • void replaceRange(String, int, int) dishin@dcslab.snu.ac.kr
Example import java.awt.*; import java.awt.event.*; public class TextAreaTest extends Frame { TextArea view = new TextArea(); TextField input = new TextField(); { add(view, "Center"); add(input, "South"); input.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { view.append(input.getText() + '\n'); input.setText(""); } }); } public static void main(String[] args) { TextAreaTest f = new TextAreaTest(); f.setSize(500, 300); f.setVisible(true); } } dishin@dcslab.snu.ac.kr
배치 관리자 • 목적 • Container 내부의 component의 font size가 변하거나 실행 환경이 달라져도 올바르게 자동적으로 배치 한다. • 배치 관리자는 다음을 사용하여 Container 내의 각 child component를 배치한다. • 배치 관리자의 배치 전략 • Container의 크기 • 각 child component의 배치 정보 • 배치 전략에 따른 LayoutManger interface를 구현하는 class • FlowLayout : 왼쪽에서 오른쪽으로 배치 • BorderLayout : 동,서,남,북, 중앙에 배치 • GridLayout : compont를 동일한 크기로 배치 dishin@dcslab.snu.ac.kr
FlowLayout • component를 왼쪽에서 오른쪽으로 배치(공간이 부족하면 그 다음열에 배치) • 각 component를 최적의 크기로 배치한다. • 목적: 보통, Panel에 보턴을 추가하는데 사용한다. • Panel의 디폴트 배치 관리자이다. import java.awt.*; class FlowLayoutTest extends Frame { public FlowLayoutTest() { setLayout(new FlowLayout()); add(new Button("보턴 1")); add(new Button("보턴 2")); add(new MyButton("새로운 보턴")); Panel p = new Panel(); p.add(new Button("패널 보턴 1")); dishin@dcslab.snu.ac.kr
FlowLayout p.add(new Button("패널 보턴 2")); add(p); } public static void main(String[] args) { Frame f1 = new FlowLayoutTest(); f1.setTitle("FlowLayout: 디폴트"); f1.setBounds(0, 0, 200, 300); f1.setVisible(true); Frame f2 = new FlowLayoutTest(); ((FlowLayout) f2.getLayout()).setAlignment(FlowLayout.LEFT); f2.setTitle("FlowLayout: 왼쪽 정렬"); f2.setBounds(200, 0, 200, 300); f2.setVisible(true); } } class MyButton extends Button { public MyButton(String text) { super(text); } public Dimension getPrefferedSize() { return new Dimension(super.getPreferredSize().width + 20, super.getPreferredSize().height + 20 ); } } dishin@dcslab.snu.ac.kr
BorderLayout • 동,서,남,북,중앙에 배치 • chlid component가 현재의 Container를 채우기 그 크기가 자동적으로 늘거나 줄어든다. • component가 5개 미만이면, 나머지 component가 여백을 채운다. dishin@dcslab.snu.ac.kr
BorderLayout Example import java.awt.*; class BorderLayoutTest { public static void main(String[] args) { Frame f = new Frame(); f.add(new Button("Center Button"), "Center"); f.add(new Button("West Button"), "West"); f.add(new Button("East Button"), "East"); f.add(new Button("North Button"), "North"); f.add(new Button("South Button"), "South"); f.setSize(500, 500); f.setVisible(true); } } dishin@dcslab.snu.ac.kr
GridLayout • 컴포넌트를 동일한 크기로 배치 dishin@dcslab.snu.ac.kr
GridLayout Example import java.awt.*; class GridLayoutTest extends Frame { public GridLayoutTest(String title, LayoutManager mgr, int x, int y) { setTitle("GridLayout test: " + title); setLayout(mgr); add(new Button("보턴 1")); add(new Button("보턴 2")); add(new Button("보턴 3")); add(new Button("보턴 4")); add(new Button("보턴 5")); add(new Button("보턴 6")); add(new Button("보턴 7")); setBounds(x, y, 300, 300); setVisible(true); } public static void main(String[] args) { new GridLayoutTest("디폴트", new GridLayout(), 0, 0); new GridLayoutTest("2, 0", new GridLayout(2,0), 300, 0); new GridLayoutTest("0, 3", new GridLayout(0,2), 0, 300); new GridLayoutTest("3, 3", new GridLayout(3,3), 300, 300); } } dishin@dcslab.snu.ac.kr
GridBagLayout • component를 다른 크기로 배치 • GridBagConstraints • int gridx , gridy relative ( 0, 1, 2, 3… ) • int anchor : CENTER, EAST, WEST, NORTH, SOUTH… • int fill : NONE, HORIZONTAL, VERTICAL, BOTH • double weightx = 0 , weighty = 0 • add(Components, GridBagConstraints)를 사용하는 것이 일반적 dishin@dcslab.snu.ac.kr
GridBagLayout Example import java.awt.*; class GridBagLayoutTest { public static void main(String[] args) { Frame f = new Frame(“GridBagLayout test”); GridBagLayout gbl=new GridBagLayout(); GridBagConstraints gbc=new GridBagConstraints(); f.setLayout(gb1); f.add(new Label(“JDK 1.1.5:”),gbc); f.add(new TextField(“http://java.sun.com/products/jdk/1.1/”), gbc); gbc.gridy=1; f.add(new Label(“News:”), gbc); f.add(new TextField(“comp.lang.java.programmer”),gbc); dishin@dcslab.snu.ac.kr
GridBagLayout Example • gbc.gridy = 2; • gbc.anchor=GridBagConstraints.EAST; • f.add(new Label(“News: “), gbc); • gbc.fill = GridBagConstraints.HORIZONTAL; • f.add(new TextField(“comp.lang.java.announce “), gbc ); • gbc.gridx = 2 ; gbc.gridy = 3 ; • gbc.fill = GridBagConstraints.BOTH; • gbx.weightx = 1 ; • f.add(new Button(“test”), gbc ) ; • f.setSize( 400, 300 ) ; • f.setVisible(true); • } • } dishin@dcslab.snu.ac.kr
Next • Event 관련 class • Event_handler • Event_listener • Codes.. dishin@dcslab.snu.ac.kr