460 likes | 654 Views
AWT 프로그래밍. 컴퓨터정보과 안유정 교수 연구동 410 호 youjahn@gmail.com. AWT programming. AWT A bstract W indow T oolkit 윈도우 기반으로 자바에서 GUI 를 작성할 수 있도록 함 GUI(Graphic User Interface) 자바 AWT 는 java.awt 패키지 를 통하여 제공 java.awt 패키지안에 인터페이스와 이벤트에 관련된 클래스들이 들어있다. AWT Programming. 컴포넌트 (Component)
E N D
AWT 프로그래밍 컴퓨터정보과 안유정 교수 연구동 410호 youjahn@gmail.com
AWT programming • AWT • Abstract Window Toolkit • 윈도우 기반으로 자바에서 GUI를 작성할 수 있도록 함 • GUI(Graphic User Interface) • 자바 AWT는 java.awt 패키지를 통하여 제공 • java.awt 패키지안에 인터페이스와 이벤트에 관련된 클래스들이 들어있다.
AWT Programming • 컴포넌트(Component) • 화면을 구성하는 사용자 인터페이스 요소 • 예) 버튼, 체크박스, 선택박스, 리스트, 텍스트, 다이얼로그 박스, 메뉴, 스크롤바등 • 컴포넌트들은 각각 클래스로 정의되어 있으며 추상 클래스인 java.awt.Component의 하위 클래스이다. • 이벤트 프로그래밍 • 각 컴포넌트에 대한 사용자의 행동을 처리할 수 있게 하는 방법 • 대부분의 컴포넌트들은 한 개 이상의 이벤트들과 연관된다. • 자바에서는 각 이벤트들을 클래스로 정의하고 있다. • 예) 버튼을 클랙하는 이벤트 : ActionEvent 클래스
AWT Programming • 컴포넌트 클래스들 • 대부분 java.awt 패키지내 • 에 정의되어 있다. Button Checkbox Choice CheckboxGroup CheckboxGroup List TextField Label Object Object java.applet 패키지 안의 클래스 java.applet TextComponent TextArea Component Applet Container Panel Applet Canvas Frame Frame Window Scrollbar Dialog FileDialog ScrollPane Window MenuBar MenuBar MenuComponent MenuItem Menu Menu CheckboxMenuItem BorderLayout FlowLayout FlowLayout GridLayout GridLayout Class GridLayout GridLayout CardLayout CardLayout Abstract class
이벤트 종류 • 자바의 이벤트 클래스들 ActionEvent 버튼이 눌려지거나, 리스트의 한 항목이 더블 클릭되어 선택되거나, 메뉴의 한 항목이 선택되었을 때 발생 AdjustmentEvent 사용자가 스크롤바를 움직였을 때 발생 ComponentEvent 컴포넌트가 감춰지거나, 감춰진 상태에서 다시 나타날 때, 컴포넌트를 이동하였을 때, 크기를 조정하였을 때 발생 ContainerEvent 컨테이너에 컴포넌트가 추가되거나 제거 되었을 때 발생(18장 참조) FocusEvent 컴포넌트가 키보드 입력을 받아들일 수 있는 초점(focus)을 획득하거나, 초점을 잃었을 때 발생 ItemEvent 체크박스나 리스트의 한 항목이 선택되었을 때, 메뉴의 한 항목이 선택되거나, 선택된 항목이 해제되었을 때 발생 KeyEvent 키보드로부터 입력이 일어났을 때 발생 MouseEvent 마우스의 버튼이 눌려지고 띠어질 때, 움직일 때, 드래그(drag) 할 때, 마우스의 초점이 컴포넌트 영역에 들어가거나 나올 때 발생 TextEvent text area나 text field에서 값이 입력될 때 발생 WindowEvent 윈도우가 활성화(activate)되거나 비활성화 될 때, 아이콘화 될 때, 아이콘으로부터 윈도우로 복구될 때, 윈도우가 open, close, quit 될 때 발생
이벤트 프로그래밍 순서 • 사용될 인터페이스와 이벤트들을 포함할 클래스를 만들자 public class MyButton extends Frame implements ActionListener • 인터페이스인 컴포넌트 객체를 만들자 Button b = new Button(“확인”); • 만든 컴포넌트 객체에 이벤트를 연결하자 b.addActionListener(this); • 만든 컴포넌트를 결과 창에 출력하자 add(b); • 이벤트 발생할때 무슨일을 해야하는지 프로그램하자 public void actionPerformed (ActionEvent ae) { …… // 예 : 버튼 클릭하면 창이 열리도록 }
컴포넌트(버튼) • Button 클래스 • 버튼을 만들때 사용하는 자바의 클래스 • 버튼클릭하는 이벤트는ActionEvent • Button 클래스에 속한 메소드 String getLabel() // 버튼위의 글자를 읽어온다. void setLabel(String label) // 버튼에 출력될 글자를 지정한다.
컴포넌트(버튼) • 버튼 생성 방법 Button() // 단순히 버튼 생성 Button(String) // 레이블을 주어 생성 • 버튼 만들어서 이벤트 연결하고 출력하는 예 Button b = new Button("확인"); b.addActionListener(this); add(b);
컴포넌트(레이블) • Label 클래스 • 다른 컴포넌트 위 또는 옆에 글자를 출력할때 사용 • Label 객체를 만들어 글자를 넣으면 됨 • Label 객체에는 이벤트 연결 필요 없음 • Label 클래스에 속한 메소드 String getText() // 레이블위의 글자를 읽어온다. void setText(String text) // 레이블에 글자를 작성한다. void setAlignment(int align) // 레이블 위 글자의 정렬상태를 지정
컴포넌트(레이블) • 필드에 레이블 붙이는 방법 • 레이블을 만들어 출력하는 예 public Label() { this("", LEFT); } public Label(String text) { this(text, LEFT); } public Label(String text, int alignment) Label.LEFT Label.RIGHT Label.CENTER Label grade = new Label (“2학년"); add(grade);
버튼과 레이블을 이용한 예제 해보기 클릭하면
[예제 버튼만들기] - ButtonEventsTest.java import java.applet.*; import java.awt.*; import java.awt.event.*; public class ButtonEventsTest extends Applet implements ActionListener { // ActionEvent를 사용하는 클래스를 작성 Label label1, label2; // Label 객체를 선언 public void init() { Button b1 = new Button("남자"); // 버튼 객체 생성 b1.addActionListener(this); // 생성된 버튼 객체에 ActionListener를 등록 add(b1); // 버튼 객체를 컨테이너 객체인 애플릿에 추가 Button b2 = new Button("여자"); b2.addActionListener(this); add(b2); label1 = new Label("당신의 성별은?"); add(label1); label2 = new Label(" "); add(label2); }
[예제 버튼만들기] (계속) public void actionPerformed(ActionEvent ae) { // 버튼이 눌려지면 수행될 이벤트 처리 메소드 작성 label2.setText(ae.getActionCommand()); // ActionEvent 클래스의 getActionCommand() 메소드를 // 이용하여 클릭된 버튼의 이름을 가져와 label2 객체의 // 텍스트로 나타낸다 } }
[예제 버튼 만들기 ]- ButtonEventsTest.html <html> <head><title>버튼 이벤트 처리</title></head> <body> <applet code="ButtonEventsTest" width=500 height=60> </applet> </body> </html>
컴포넌트(체크박스) • Checkbox 클래스 • 주어진 항목들 중에서 여러 개를 선택할 수 있는 컴포넌트 • Checkbox의 한 항목 클릭시, ItemEvent이벤트 발생 • 체크박스 .vs. 라디오버튼 비교 • 체크박스 : 주어진 항목들 중에서 여러 개를 선택 • 라디오 버튼 : 오직 하나만 선택 가능 Checkbox() // 선택되지 않은 빈 체크박스 생성 Checkbox(String) // 주어진 문자열을 가진 체크박스 생성 Checkbox(String, null, boolean) // boolean값이 true이면 선택된 체크박스 생성
컴포넌트(체크박스) • Checkbox 클래스의 메소드 getLabel() : 체크박스의 레이블 값을 얻음 setLabel() : 체크박스에 레이블을 지정함 getState() : 체크박스가 선택되었는지 유무를 확인 setState() : 선택상태를 지정
컴포넌트(체크박스) • 체크박스 만들어서 이벤트연결하고 출력하는 예 Checkbox c1 = new Checkbox("딸기", null, true); Checkbox c2 = new Checkbox("사과"); Checkbox c3 = new Checkbox("수박", null, true); Checkbox c4 = new Checkbox("오렌지"); C1.addItemListener(this); C2.addItemListener(this); C3.addItemListener(this); C4.addItemListener(this); add(c1); add(c2); add(c3); add(c4);
컴포넌트(라디오 버튼) • CheckboxGroup 클래스 • 라디오 버튼 객체를 생성하기 위한 클래스 • CheckboxGroup의 객체를 생성한 후, 같은 그룹안에 넣을Checkbox 객체들을 만들어 체크박스그룹에 넣음 • 라디오버튼의 항목 클릭시, ItemEvent이벤트 발생 CheckboxGroup() ; // 라디오 버튼의 그룹을 형성 Checkbox(String, CheckboxGroup, boolean) // 라디오 버튼 그룹안에 버튼생성
컴포넌트(라디오 버튼) • 라디오버튼 만들어서 이벤트연결하고 출력하는 예 CheckboxGroup cbg = new CheckboxGroup(); Checkbox c1 = new Checkbox("사이다", cbg, false); Checkbox c2 = new Checkbox("콜라", cbg, true); Checkbox c3 = new Checkbox("오렌지쥬스", cbg, false); Checkbox c4 = new Checkbox("녹차", cbg, false); C1.addItemListener(this); C2.addItemListener(this); C3.addItemListener(this); C4.addItemListener(this); add(c1); add(c2); add(c3); add(c4); 해당항목의 초기 선택여부
[예제 라디오버튼 만들기-CheckBoxTest.java] _________________________________________ import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class CheckBoxTest extends Applet implements ItemListener { Checkbox g1, g2, g3, h1, h2, h3, h4; String str=""; Label answer; public void init() { Label l1 = new Label("당신의 학년은?"); Label l2 = new Label("당신의 취미는?"); answer = new Label(" "); CheckboxGroup grade = new CheckboxGroup(); // 학년 선택은 라디오버튼 g1 = new Checkbox("1학년", grade, false); g2 = new Checkbox("2학년", grade, true); g3 = new Checkbox("3학년", grade, false); h1 = new Checkbox("영화", null, false); // 취미 선택은 체크박스 h2 = new Checkbox("독서", null, false); h3 = new Checkbox("여행", null, false); h4 = new Checkbox("게임", null, false);
g1.addItemListener(this); g2.addItemListener(this); g3.addItemListener(this); h1.addItemListener(this); h2.addItemListener(this); h3.addItemListener(this); h4.addItemListener(this); add(l1); add(g1); add(g2); add(g3); add(l2); add(h1); add(h2); add(h3); add(h4); add(answer); } public void itemStateChanged(ItemEvent e) { if (g1.getState()) str = g1.getLabel()+" 선택"; else if (g2.getState()) str = g2.getLabel()+" 선택"; else str = g3.getLabel()+" 선택"; answer.setText(str); } } // 끝
[CheckBoxTest.html] ___________________________________ • <HTML> • <HEAD> • <TITLE> CheckBox Test </TITLE> • </HEAD> • <BODY> • <APPLET CODE=CheckBoxTest WIDTH=300 HEIGHT=200> • </APPLET> • </BODY> • </HTML> • ______________________________________________________________
컴포넌트(Choicebox) • Choice 클래스 • List와 유사한 컴포넌트 • 화면에 한 항목만 보여주고 나머지 항목들은 오른쪽 화살표를 선택하면 보여진다. • 한 항목만 선택이 가능하다. • 항목 클릭시, ItemEvent발생
컴포넌트(Choicebox) void add(String str) str로 지정된 항목을 추가 throws NullPointerException void addItem(String str) str로 지정된 항목을 추가 throws NullPointerException void addItemListener(ItemListeneril) 리스너를 등록 String getIndex(int i) i번째 항목을 반환 int getSelectedIndex() 선택된 항목의 인덱스를 반환 String getSelectedItem() 선택된 항목의 이름(문자열)을 반환 void insert(String str, int i) str로 지정된 항목을 i번째 인덱스 위치에 추가 throws IllegalArgumentException void remove(int i) I 번째 항목을 삭제 throws IllegalArgumentException void removeAll() 모든 항목을 삭제 void removeItemListener(ItemListeneril) 등록된 리스너를 해제 void select(int i) i번째 항목을 선택 throws IllegalArgumentException void select(String str) str로 지정된 항목을 선택 throws IllegalArgumentException • Choice 클래스에 속한 메소드
컴포넌트(Choicebox) • Choice 객체를 만들어 이벤트 연결 및 출력하는 예 Choice attrib = new Choice(); attrib.add("Italic"); attrib.add("Bold"); attrib.add("Plain"); attrib.add("Italic+Bold"); attrib. addItemListener(this); add(attrib);
컴포넌트(List) • List 클래스 • Choicebox와 매우 유사하나 여러 항목 선택이 가능하고 항상 선택항목이 보인다. • List 클래스 안에는 3가지 종류의 생성자가 있음 • List의 한 항목을 클릭하면 ItemEvent발생, 더블 클릭하면 ActionEvent가 발생 public List() { this(0, false); } public List(int rows) { this(rows, false); } public List(int rows, boolean multipleMode) 다중 선택 유무 화면에 보이고자 하는 항목의 수
컴포넌트(리스트) int getItemCount() 항목의 개수를 반환 String[] getItems() 리스트의 모든 항목을 포함하는 문자열 배열을 반환 int getSelectedIndex() 선택된 항목(한 개)의 인덱스를 반환 int[] getSelectedIndexes() 선택된 항목(여러개)의 인덱스를 정수 배열로 반환 String getSelectedItem() 선택된 항목(한 개)을 문자열로 반환 String[] getSelectedItems() 선택된 항목(여러개)을 문자열 배열로 반환 Object[] getSelectedObjects() 선택된 항목을 Object 의 배열로 반환 boolean isMultipleMode() 현재의 리스트 객체에서 다수개의 항목을 선택할 수 있으면 true를, 아니면 false를 반환 void remove(String str) 리스트에서 str로 지정된 항목을 삭제 void remove(int i) 리스트에서 i번째 인덱스 항목을 삭제 void removeAll() 리스트의 모든 항목을 삭제 void select(int i) i번째 항목을 선택 throws IllegalArgumentException void setMultipleMode(boolean flag) i번다수개의 선택 항목을 위해서는 flag를 true로 설 정하고, 그렇지 않으면 false로 설정째 항목을 선택 void add(String str) str로 지정된 항목을 리스트 객체에 추가 void add(String str, int i) str로 지정된 항목을 리스트의 i번째 위치에 추가 void deselect(int i) i번째 인덱스의 항목을 해제 • List 클래스에 속한 메소드
컴포넌트(리스트) • 예) 5개의 항목을 갖는 리스트에서 4개 항목만 보여지려면 List copyFile = new List(4, true); copyFile.add("jni.ps"); copyFile.add("jdbc.ps"); copyFile.add("rmi.ps"); copyFile.add("innerclasses.ps"); copyFile.add("runtimeSystem.ps"); copyFile.addItemListener(this); copyFile.addActionListener(this); add(copyFile);
[예제 ChoiceGandE.java] import java.awt.*; import java.awt.event.*; import java.applet.*; public class ChoiceGandE extends Applet implements ItemListener { List air; Choice city; String msg, msg2; public void init() { air = new List(2, false); air.add("대한항공"); air.add("아시아나"); city = new Choice(); city.add("부산"); city.add("제주"); city.add("광주"); city.add("대구"); city.add("서울"); // 계속
[예제 ChoiceGandE.java]계속 air.addItemListener(this); city.addItemListener(this); add(air); add(city); } public void itemStateChanged(ItemEvent ie) { msg = "선택한 항공사 : "; msg += air.getSelectedItem(); msg2 = "선택 지역 : "; msg2 += city.getSelectedItem(); repaint(); } public void paint(Graphics g) { g.drawString(msg, 6, 120); g.drawString(msg2, 6, 140); } }
컴포넌트(TextComponent) TextComponent • TextComponent 클래스 • TextField, TextArea클래스의 상위클래스 • TextField : 한 줄의 입력을 받을 때 • TextArea : 여러 줄의 입력을 받을 때 TextField TextArea
컴포넌트(TextComponent) • TextComponent 클래스의 주요 메소드 • void select(int start, int end) 텍스트의 start위치부터 end위치까지를 선택 • void selectAll() 컴포넌트의 모든 텍스트를 선택 • void setEditable(boolean flag) 컴포넌트의 텍스트를 수정 가능하게 하기 위해서는 flag를 • true로하여 이 메소드를 수행. 아니면 false로 설정 • void setSelectionEnd(int end) end로 지정된 위치를 선택된 텍스트의 끝으로 설정 • void setSelectionStart(int start) start로 저징된 위치를 선택된 텍스트의 시작으로 설정 • void setText(String str) 컴포넌트의 텍스트를 str로 설정 • void addTextListener(TextListenertl) 리스너를 등록 • void removeTextListener(TextListenertl) 리스너를 해제 • String getSelectedText() 사용자에 의해 선택된 텍스트를 문자열로 반환 • int getSelectionEnd() 선택된 텍스트의 마지막 문자의 인덱스를 반환 • int getSelectionStart() 선택된 텍스트의 첫 번째 문자의 인덱스를 반환 • String getText() 컴포넌트의 내용을 문자열로 반환 • Boolean isEditable() 컴포넌트가 수정 가능하면 true를, 아니면 false를 반환
컴포넌트(TextField) • TextField 클래스 한 줄의 입력을 받을 때 public TextField() { this("", 0); } public TextField(String text) { this(text, text.length()); } public TextField(String text, int columns)
컴포넌트(TextArea) • TextArea 클래스 • 여러 줄의 입력을 받을 때 • 텍스트 필드보다 라인수와 스크롤 바에 대한 매개변수 추가 public TextArea() { this("", 0, 0, SCROLLBARS_BOTH); } public TextArea(String text) { this(text, 0, 0, SCROLLBARS_BOTH); } public TextArea(int rows, int columns) { this("", rows, columns); } public TextArea(String text, int rows, int columns) { this(text, rows, columns, SCROLLBARS_BOTH); } public TextArea(String text, int rows, int columns, int scrollbars) SCROLLBARS_BOTH, SCROLLBARS_HORIZONAL_ONLY, SCROLLBARS_VERTICAL_ONLY 중에서 선택하여 씀
컴포넌트(TextArea) void append(String str) str로 지정된 문자열이 첨가된다 void insertText(String str, str로 지정된 문자열이 index로 지정된 위치에 삽입된다 int index) void replaceText(String str, startIndex와 endIndex사이의 문자열이 str로 대치된다 int startIndex, int endIndex) • TextArea 클래스에 속한 메소드
[예제 –LabelTextTest.java] ________________________ import java.applet.*; import java.awt.*; import java.awt.event.*; public class LabelTextTest extends Applet implements ActionListener { TextField id; TextField pswd; TextArea ta; Button bt1, bt2; public void init() { id = new TextField("ID 입력", 8); pswd = new TextField(8); ta = new TextArea(6, 60); bt1 = new Button("OK"); bt2 = new Button("CANCEL"); Label l1 = new Label("ID : "); Label l2 = new Label("PASSWORD : "); bt1.addActionListener(this); bt2.addActionListener(this);
[예제 -LabelTextTest.java] 계속 add(l1); add(id); add(l2); add(pswd); pswd.setEchoChar('*'); add(ta); add(bt1); add(bt2); } // init() 끝 public void actionPerformed(ActionEvent e) { if ( e.getActionCommand().equals("OK") ) { ta.setText("id : "); ta.append(id.getText() + "\n"); ta.append("password : "); ta.append(pswd.getText()); } else { id.setText(""); pswd.setText(""); ta.setText(""); } } }
[예제 -LabelTextTest.html] ________________________________ • <HTML> • <HEAD> • <TITLE> LabelTextTest </TITLE> • </HEAD> • <BODY> • <APPLET CODE=LabelTextTest WIDTH=360 HEIGHT=200> • </APPLET> • </BODY> • </HTML> • ____________________________________________________________
컴포넌트(Scrollbar) • Scrollbar 클래스 • 스크롤바는 다른 컴포넌트와 같이 사용되기도 하지만 독자적으로도 사용될 수 있다. • orientation :스크롤바의 방향을 지정하는 상수로 HORIZONTAL과 VERTICAL이 사용 • value :스크롤의 초기 값 width :스크롤 폭의 크기 • min,max :스크롤의 최소값과 최대값 • Scrollbar() • Scrollbar(int orientation) • Scrollbar(int orientation, int value, int width, int min, int max)
컴포넌트(Scrollbar) • 관련 이벤트 : AdjustmentEvent • Scrollbar 클래스의 메소드 void addAdjustmentListener(AdjustmentListeneral) Adjustment 리스너를 등록 void removeAdjustmentListener(AdjustmentListeneral) 등록된 Adjustment 리스너를 제거 int getValue() 스크롤 바의 값을 반환 void setValue(int i) 스크롤 바의 값을 설정
[예제 ScrollBarGandE.java] import java.awt.*; import java.applet.*; import java.awt.event.*; public class ScrollbarGandE extends Applet implements AdjustmentListener { Scrollbar rsb,gsb,bsb; Canvas canvas; public void init() { Label r1 = new Label("빨강" , Label.RIGHT); add(r1); rsb = new Scrollbar(Scrollbar.HORIZONTAL, 255, 5, 0, 255); // 스크롤바 객체 생성 rsb.addAdjustmentListener(this); // 생성된 객체에 리스너 등록 add(rsb); Label g1 = new Label("녹색" , Label.RIGHT); add(g1); gsb = new Scrollbar(Scrollbar.HORIZONTAL, 0, 5, 0, 255); gsb.addAdjustmentListener(this); add(gsb); Label b1 = new Label("파랑" , Label.RIGHT); add(b1);
[예제 ScrollBarGandE.java]계속 bsb = new Scrollbar(Scrollbar.HORIZONTAL, 0, 5, 0, 255); bsb.addAdjustmentListener(this); add(bsb); canvas = new Canvas(); canvas.setSize(50,50); canvas.setBackground(new Color(255,0,0)); add(canvas); } public void adjustmentValueChanged(AdjustmentEvent ae) { // 스크롤바를 움직이면 이 메소드가 수행된다 int r = rsb.getValue(); int g = gsb.getValue(); int b = bsb.getValue(); Color color = new Color(r,g,b); canvas.setBackground(color); canvas.repaint(); } }